1. 程式人生 > >Kubernetes K8S之資源控制器Daemonset詳解

Kubernetes K8S之資源控制器Daemonset詳解

 

Kubernetes的資源控制器Daemonset詳解與示例

 

主機配置規劃

伺服器名稱(hostname)系統版本配置內網IP外網IP(模擬)
k8s-master CentOS7.7 2C/4G/20G 172.16.1.110 10.0.0.110
k8s-node01 CentOS7.7 2C/4G/20G 172.16.1.111 10.0.0.111
k8s-node02 CentOS7.7 2C/4G/20G 172.16.1.112 10.0.0.112

 

什麼是控制器

kubernetes中內建了很多controller(控制器),這些相當於一個狀態機,用來控制pod的具體狀態和行為。

部分控制器型別如下:
  • ReplicationController 和 ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Job/CronJob
  • HorizontalPodAutoscaler

 

DaemonSet

DaemonSet 確保全部(或者某些)節點上執行一個 Pod 的副本。當有節點加入叢集時,會為他們新增一個 Pod。當有節點從叢集移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它建立的所有 Pod。

DaemonSet 的一些典型用法:
  • 在每個節點上執行叢集儲存 DaemonSet,例如 glusterd、ceph。
  • 在每個節點上執行日誌收集 DaemonSet,例如 fluentd、logstash。
  • 在每個節點上執行監控 DaemonSet,例如 Prometheus Node Exporter、Flowmill、Sysdig 代理、collectd、Dynatrace OneAgent、AppDynamics 代理、Datadog 代理、New Relic 代理、Ganglia gmond 或者 Instana 代理。

一個簡單的用法是在所有的節點上都啟動一個 DaemonSet,並作為每種型別的 daemon 使用。

一個稍微複雜的用法是單獨對每種 daemon 型別使用一種DaemonSet。這樣有多個 DaemonSet,但具有不同的標識,並且對不同硬體型別具有不同的記憶體、CPU 要求。

備註:DaemonSet 中的 Pod 可以使用 hostPort,從而可以通過節點 IP 訪問到 Pod;因為DaemonSet模式下Pod不會被排程到其他節點。使用示例如下:

1     ports:
2     - name: httpd
3       containerPort: 80
4       #除非絕對必要,否則不要為 Pod 指定 hostPort。 將 Pod 繫結到hostPort時,它會限制 Pod 可以排程的位置數;DaemonSet除外
5       #一般情況下 containerPort與hostPort值相同
6       hostPort: 8090     #可以通過宿主機+hostPort的方式訪問該Pod。例如:pod在/排程到了k8s-node02【172.16.1.112】,那麼該Pod可以通過172.16.1.112:8090方式進行訪問。
7       protocol: TCP

 

可參見:「Kubernetes K8S之通過yaml建立pod與pod檔案常用欄位詳解」

 

DaemonSet示例

yaml檔案

 1 [root@k8s-master controller]# pwd
 2 /root/k8s_practice/controller
 3 [root@k8s-master controller]# cat daemonset.yaml 
 4 apiVersion: apps/v1
 5 kind: DaemonSet
 6 metadata:
 7   name: fluentd-elasticsearch
 8   namespace: default
 9   labels:
10     k8s-app: fluentd-logging
11 spec:
12   selector:
13     matchLabels:
14       name: fluentd-elasticsearch
15   template:
16     metadata:
17       labels:
18         name: fluentd-elasticsearch
19     spec:
20       tolerations:
21       # 允許在master節點執行
22       - key: node-role.kubernetes.io/master
23         effect: NoSchedule
24       containers:
25       - name: fluentd-elasticsearch
26         image: registry.cn-beijing.aliyuncs.com/google_registry/fluentd:v2.5.2
27         resources:
28           limits:
29             cpu: 1
30             memory: 200Mi
31           requests:
32             cpu: 100m
33             memory: 200Mi
34         volumeMounts:
35         - name: varlog
36           mountPath: /var/log
37         - name: varlibdockercontainers
38           mountPath: /var/lib/docker/containers
39           readOnly: true
40       # 優雅關閉應用,時間設定。超過該時間會強制關閉【可選項】,預設30秒
41       terminationGracePeriodSeconds: 30
42       volumes:
43       - name: varlog
44         hostPath:
45           path: /var/log
46       - name: varlibdockercontainers
47         hostPath:
48           path: /var/lib/docker/containers

 

執行daemonset,並檢視狀態

 1 [root@k8s-master controller]# kubectl apply -f daemonset.yaml 
 2 daemonset.apps/fluentd-elasticsearch created
 3 [root@k8s-master controller]# 
 4 [root@k8s-master controller]# kubectl get daemonset -o wide
 5 NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS              IMAGES                                                            SELECTOR
 6 fluentd-elasticsearch   3         3         3       3            3           <none>          92s   fluentd-elasticsearch   registry.cn-beijing.aliyuncs.com/google_registry/fluentd:v2.5.2   name=fluentd-elasticsearch
 7 [root@k8s-master controller]# 
 8 [root@k8s-master controller]# kubectl get pod -o wide
 9 NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
10 fluentd-elasticsearch-52b8z   1/1     Running   0          95s   10.244.2.92   k8s-node02   <none>           <none>
11 fluentd-elasticsearch-fps95   1/1     Running   0          95s   10.244.0.46   k8s-master   <none>           <none>
12 fluentd-elasticsearch-pz8j7   1/1     Running   0          95s   10.244.4.83   k8s-node01   <none>           <none>

由上可見,在k8s叢集所有節點包括master節點都運行了daemonset的pod。

 

相關閱讀

1、Kubernetes K8S之通過yaml建立pod與pod檔案常用欄位詳解

2、Kubernetes K8S之資源控制器RC、RS、Deployment詳解

3、Kubernetes K8S之資源控制器StatefulSets詳解

 

完畢!

 


 

 

———END———
如果覺得不錯就關注下唄 (-^O^-) !

&n