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》