What is a DaemonSet?
DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
每个Node上运行日志采集器,例如fluentd,logstash
每个Node上运行监控的采集端,例如PrometheusNode Exporter,collectd等
在简单的情况下,一个DaemonSet可以覆盖所有的Node,来实现Only-One-Pod-Per-Node这种情形;在有的情况下,我们对不同的计算节点进行标记,或者把kubernetes的集群节点分为多个zone,DaemonSet也可以在每个zone上实现Only-One-Pod-Per-Node。 Writing a DaemonSet Spec Required Fields(必须字段)
apiVersion,kind,metadata.spec Pod Template
.spec.template是.spec字段的必须字段,即是podtemplate. 除了当嵌套的时候不需要apiVersion或 kind字段,其他跟pod模板完全一样。
同时RestartPolicy只能设置为 Always,不指定,默认为 Always. Pod Selector
spec.selector支持两种匹配:
matchLabels
matchExpressions
当两种匹配方式都配置的时候,匹配结果为交集. Running Pods on Only Some Nodes
当指定.spec.template.spec.nodeSelector,DaemonSet controller 将会在nodeSelector匹配的节点上创建pod。同样当你指定.spec.template.spec.affinity后, DaemonSet controller 会在 nodeaffinity匹配的节点上创建pod。如果都没有指定,DaemonSet controller 在所有node节点上创建pod. How Daemon Pods are Scheduled
被DaemonSet controller创建的pod会默认指定.spec.nodeName,所以pod会被k8s的调度器忽略.所以:
unschedulable字段不会被 DaemonSet controller识别。
当k8s的调度器没有启动的时候,DaemonSet controller也能工作。
Communicating with Daemon Pods
跟DaemonSet创建的pod通信方法:
Push: DaemonSet创建的pod被配置成更新配置到其他服务,它们不需要客户端。
NodeIP and Known Port:DaemonSet 创建的pod使用 hostPort,所以通过node IP就可以通信。