DaemonSet可以確保每個node節點或者指定的節點上運行一個Pod副本。當集羣中增加node節點時,就會爲node節點創建一個副本pod,當節點從集羣中移除時,Pod也會被回收。刪除DaemonSet會刪除他創建的所有DaemonSet。
作用:DaemonSet適合在每個節點上運行一個pod,運行日誌收集器或者資源管理器監控的工作。
1、在集羣中所有node節點上創建一個pod副本
以如下yaml爲例,在每個節點上創建一個pod運行mynginx應用
apiVersion: apps/v1 #版本
kind: DaemonSet #控制器類型
metadata: #DaemonSet的元數據
name: mydaemonset #DaemonSet的名稱爲mydaemonset
labels: #DaemonSet控制器的標籤爲app: mydaemonset
app: mydaemonset
spec: #DaemonSet控制器的描述
selector: #DaemonSet控制器的選擇器
matchLabels: #DaemonSet控制器pod標籤匹配
name: mydaemonset-pod #DaemonSet控制器只管理標籤爲name: mydaemonset-pod 的pod
template:
metadata:
labels:
name: mydaemonset-pod #DaemonSet創建標籤爲name: mydaemonset-pod的標籤
spec:
containers: #容器描述
- name: mynginx #容器的名字
image: mynginx:v0.2 #容器中的鏡像
#創建mydaemonset
[root@k8s-master01 daemonset_work]# kubectl create -f daemonset.yaml
daemonset.apps/mydaemonset created
#發現分別在k8s-node01和k8s-node02上創建一個pod副本
[root@k8s-master01 daemonset_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydaemonset-5kbcr 1/1 Running 0 9s 10.244.1.94 k8s-node01 <none> <none>
mydaemonset-mbjv7 1/1 Running 0 9s 10.244.2.97 k8s-node02 <none> <none>
2、在集羣中指定的node上創建一個pod副本
可以在集羣中node節點上給節點打上不同的標籤,然後根據不同的標籤選擇節點進行部署pod副本。
示例如下,首先在上述yaml中添加選擇的節點標籤
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: mydaemonset
labels:
app: mydaemonset
spec:
selector:
matchLabels:
name: mydaemonset-pod
template:
metadata:
labels:
name: mydaemonset-pod
spec:
nodeSelector: #只在標籤爲disk=mynginx-node的節點上部署一個pod副本
disk: mynginx-node
containers:
- name: mynginx
image: mynginx:v0.2
#首先創建DeamonSet
[root@k8s-master01 daemonset_work]# kubectl create -f daemonset_node.yaml
daemonset.apps/mydaemonset created
#查看創建的DeamonSet,還沒有符合的節點創建pod
[root@k8s-master01 daemonset_work]# kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
mydaemonset 0 0 0 0 0 disk=mynginx-node 34s
#查看節點
[root@k8s-master01 daemonset_work]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready master 33d v1.15.1
k8s-node01 Ready <none> 33d v1.15.1
k8s-node02 Ready <none> 33d v1.15.1
#給k8s-node01節點打標籤disk=mynginx-node
[root@k8s-master01 daemonset_work]# kubectl label node k8s-node01 disk=mynginx-node
node/k8s-node01 labeled
#再次查看pod,發現已經創建了一個pod副本
[root@k8s-master01 daemonset_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydaemonset-9pt7g 1/1 Running 0 13s
#給k8s-node02節點打標籤disk=mynginx-node
[root@k8s-master01 daemonset_work]# kubectl label node k8s-node02 disk=mynginx-node
node/k8s-node02 labeled
#再次查看pod,發現已創建兩個pod
[root@k8s-master01 daemonset_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydaemonset-9pt7g 1/1 Running 0 2m50s
mydaemonset-npbkk 1/1 Running 0 5s
#修改k8s-node02節點標籤disk=no-mynginx-node
[root@k8s-master01 daemonset_work]# kubectl label node k8s-node02 disk=no-mynginx-node --overwrite
node/k8s-node02 labeled
#由於節點的標籤修改了,符合選擇器的標籤的node節點還一個
[root@k8s-master01 daemonset_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydaemonset-9pt7g 1/1 Running 0 3m39s
本文參考《kubenetes in action》