What is a DaemonSet?
DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:
每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
每个Node上运行日志采集器,例如fluentd,logstash
每个Node上运行监控的采集端,例如Prometheus Node 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字段的必须字段,即是pod template. 除了当嵌套的时候不需要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 会在 node affinity匹配的节点上创建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就可以通信。
DNS:
Service:
Updating a DaemonSet
如果node labels 改变, DaemonSet 会迅速添加pod到新匹配的node,删除不再匹配节点上的pod。
你可以修改DaemonSet创建的pod. 然而,不是所有的字段都可以修改 。同时DaemonSet controller仍然使用之前的模板当新增加节点的时候。
删除 DaemonSet时,如果kubectl指定--cascade=false, 创建的pods 会保留在node节点上. 你可以用不同的模板创建新的DaemonSet。新创建的DaemonSet通过相同的标签会识别之前的pod,DaemonSet不会修改或者删除之前创建的pod, 你可以手动删除之前的pod来使DaemonSet自动创建新的pod。
Kubernetes 1.6版本及以后, DaemonSet支持滚动升级。
Alternatives to DaemonSet
Init Scripts
Bare Pods
Static Pods
静态pods不会被 kubectl 或者其他 Kubernetes API 客户端所管理. 因为静态pod不依赖于 apiserver。
本文出自于
What is a DaemonSet?
DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:
每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
每个Node上运行日志采集器,例如fluentd,logstash
每个Node上运行监控的采集端,例如Prometheus Node 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字段的必须字段,即是pod template. 除了当嵌套的时候不需要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 会在 node affinity匹配的节点上创建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就可以通信。
DNS:
Service:
Updating a DaemonSet
如果node labels 改变, DaemonSet 会迅速添加pod到新匹配的node,删除不再匹配节点上的pod。
你可以修改DaemonSet创建的pod. 然而,不是所有的字段都可以修改 。同时DaemonSet controller仍然使用之前的模板当新增加节点的时候。
删除 DaemonSet时,如果kubectl指定--cascade=false, 创建的pods 会保留在node节点上. 你可以用不同的模板创建新的DaemonSet。新创建的DaemonSet通过相同的标签会识别之前的pod,DaemonSet不会修改或者删除之前创建的pod, 你可以手动删除之前的pod来使DaemonSet自动创建新的pod。
Kubernetes 1.6版本及以后, DaemonSet支持滚动升级。
Alternatives to DaemonSet
Init Scripts
Bare Pods
Static Pods
静态pods不会被 kubectl 或者其他 Kubernetes API 客户端所管理. 因为静态pod不依赖于 apiserver。
本文出自于
What is a DaemonSet?
DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:
每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
每个Node上运行日志采集器,例如fluentd,logstash
每个Node上运行监控的采集端,例如Prometheus Node 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字段的必须字段,即是pod template. 除了当嵌套的时候不需要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 会在 node affinity匹配的节点上创建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就可以通信。
DNS:
Service:
Updating a DaemonSet
如果node labels 改变, DaemonSet 会迅速添加pod到新匹配的node,删除不再匹配节点上的pod。
你可以修改DaemonSet创建的pod. 然而,不是所有的字段都可以修改 。同时DaemonSet controller仍然使用之前的模板当新增加节点的时候。
删除 DaemonSet时,如果kubectl指定--cascade=false, 创建的pods 会保留在node节点上. 你可以用不同的模板创建新的DaemonSet。新创建的DaemonSet通过相同的标签会识别之前的pod,DaemonSet不会修改或者删除之前创建的pod, 你可以手动删除之前的pod来使DaemonSet自动创建新的pod。
Kubernetes 1.6版本及以后, DaemonSet支持滚动升级。
Alternatives to DaemonSet
Init Scripts
Bare Pods
Static Pods
静态pods不会被 kubectl 或者其他 Kubernetes API 客户端所管理. 因为静态pod不依赖于 apiserver。
本文出自于https://blog.csdn.net/ptmozhu/article/details/71101950