这节介绍跟deployment同级别的资源类型:daemonset 。
Deployment部署在每个Node上的 POD 副本可以有多个,DaemonSet 则在每个Node节点上最多只能部署一个 POD 副本,默认DaemonSet 资源会在每个Node节点上部署 一个 POD 副本。
DaemonSet常见的应用场景有:
- 在各个节点上运行存储daemon,例如gluster或ceph
- 在各个节点上运行日志收集daemon,例如filebeat或logstash
- 在各个节点上运行监控daemon,例如prometheus node exporter
创建daemonset 资源配置文件,daemonset 和 deployment 的配置文件差别不大,最主要的区别是少了一个 replicas 副本数参数:
[root@ylserver10686071 ~]# cat daemonset.yml apiVersion: apps/v1 kind: DaemonSet metadata: name: app007 namespace: prod spec: selector: matchLabels: daemonset: web template: metadata: labels: daemonset: web spec: containers: - name: tomcat image: tomcat:8.0
创建daemonset app007:
[root@ylserver10686071 ~]# kubectl apply -f daemonset.yml daemonset.apps/app007 created [root@ylserver10686071 ~]# kubectl get daemonset -n prod -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR app007 3 3 3 3 3 <none> 50s tomcat tomcat:8.0 daemonset=web [root@ylserver10686071 ~]#
查看replicaset 并没有相关信息,daemonset 创建的POD副本数最多为1,因此不需要 replicaset 控制器维护副本数:
[root@ylserver10686071 ~]# kubectl get replicaset -n prod -o wide|grep app007 [root@ylserver10686071 ~]#
查看daemonset控制器创建的POD资源,可以看到默认会在各个NODE上创建 一个 POD 副本:
[root@ylserver10686071 ~]# kubectl get pods -n prod -o wide|grep app007 app007-c9s49 1/1 Running 0 3m55s 10.233.75.63 ylserver10686071 <none> <none> app007-vll7r 1/1 Running 0 3m55s 10.233.67.30 ylserver10686072 <none> <none> app007-xhnqt 1/1 Running 0 3m56s 10.233.72.40 ylserver10686073 <none> <none> [root@ylserver10686071 ~]#
通过Node Label 也可以在指定的Node上创建POD,修改daemonset配置文件,添加nodeSelector标签:
apiVersion: apps/v1 kind: DaemonSet metadata: name: app007 namespace: prod spec: selector: matchLabels: daemonset: web template: metadata: labels: daemonset: web spec: nodeSelector: "type": ‘daemonset‘ containers: - name: tomcat image: tomcat:8.0
给Node打上标签,并更新daemonset app003 资源配置:
[root@ylserver10686071 ~]# kubectl label node ylserver10686072 type=daemonset node/ylserver10686072 labeled [root@ylserver10686071 ~]# kubectl apply -f daemonset.yml daemonset.apps/app007 configured
查看daemonset app003 资源创建的daemonset 和 pod 信息,可以看到 daemonset 的 NODE SELECTOR已经配置了Node Label ,最终创建的POD 只在 指定的 NODE上部署一个副本:
[root@ylserver10686071 ~]# kubectl get daemonset -n prod -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR app007 1 1 1 1 1 type=daemonset 14m tomcat tomcat:8.0 daemonset=web [root@ylserver10686071 ~]# kubectl get pods -n prod -o wide|grep app007 app007-tkdv6 1/1 Running 0 18s 10.233.67.31 ylserver10686072 <none> <none>
总结一下:
- daemonset和deployment 属于同一级别的控制器,daemonset在各个NODE上创建的 POD 副本数最多为1,不需要 replicaset 控制器管理POD副本数;
- daemonset也可以使用 nodeSelector 标签选择器指定在哪些NODE上创建POD;
- daemonset 默认会在各个Node 上创建一个POD副本。