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上运行监控的采集端,例如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就可以通信。
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上运行监控的采集端,例如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就可以通信。
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上运行监控的采集端,例如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就可以通信。
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