31.DaemonSet
DaemonSet
本文将为您介绍
什么是DaemonSet ?
使用
- 运行集群存储
daemon ,例如在每个Node 上运行glusterd
、ceph
。 - 在每个
Node 上运行日志收集daemon ,例如fluentd
、logstash
。 - 在每个
Node 上运行监控daemon ,例如 Prometheus Node Exporter、collectd
、Datadog 代理、New Relic 代理,或Ganglia gmond
。
一个简单的用法是,在所有的
编写DaemonSet Spec
必需字段
和其它所有apiVersion
、kind
和 metadata
字段。有关配置文件的通用信息,详见文档 部署应用、配置容器 和资源管理。
.spec
配置段。
Pod 模板
.spec
唯一必需的字段是 .spec.template
。
.spec.template
是一个 apiVersion
或 kind
字段。
在Always
的 RestartPolicy
,或者未指定它的值,默认是 Always
。
Pod Selector
.spec.selector
字段表示.spec.selector
的原理是相同的。
spec.selector
表示一个对象,它由如下两个字段组成:
matchLabels
- 与 ReplicationController 的.spec.selector
的原理相同。matchExpressions
- 允许构建更加复杂的Selector ,可以通过指定key 、value 列表,以及与key 和value 列表的相关的操作符。
当上述两个字段都指定时,结果表示的是
如果指定了 .spec.selector
,必须与 .spec.template.metadata.labels
相匹配。如果没有指定,它们默认是等价的。如果与它们配置的不匹配,则会被
如果
仅在相同的Node 上运行Pod
如果指定了 .spec.template.spec.nodeSelector
,.spec.template.spec.affinity
,然后
如何调度Daemon Pod
正常情况下,.spec.nodeName
DaemonSet Controller 并不关心一个Node 的unschedulable
字段。DaemonSet Controller 可以创建Pod ,即使调度器还没有被启动,这对集群启动是非常有帮助的。
tolerationSeconds
的 node.alpha.kubernetes.io/notReady
和 node.alpha.kubernetes.io/unreachable
的NoExecute
的TaintBasedEvictions
被启用,当TaintBasedEvictions
特性没有启用,在这些场景下也不会被清除,但会因为
与Daemon Pod 通信
与
- Push:配置
DaemonSet 中的Pod 向其它Service 发送更新,例如统计数据库。它们没有客户端。 NodeIP 和已知端口:DaemonSet 中的Pod 可以使用hostPort
,从而可以通过Node IP 访问到Pod 。客户端能通过某种方法知道Node IP 列表,并且基于此也可以知道端口。- DNS:创建具有相同
Pod Selector 的 Headless Service,然后通过使用endpoints
资源或从DNS 检索到多个A 记录来发现DaemonSet 。 - Service:创建具有相同
Pod Selector 的Service ,并使用该Service 访问到某个随机Node 上的daemon 。 (没有办法访问到特定Node )
更新DaemonSet
如果修改了
可以修改
可以删除一个kubectl
并指定 --cascade=false
选项,则
在
init 脚本
很可能通过直接在一个init
、upstartd
、或 systemd
- 像对待应用程序一样,具备为
daemon 提供监控和管理日志的能力。 - 为
daemon 和应用程序使用相同的配置语言和工具(如Pod 模板、 kubectl
) 。 Kubernetes 未来版本可能会支持对DaemonSet 创建Pod 与Node 升级工作流进行集成。- 在资源受限的容器中运行
daemon ,能够增加daemon 和应用容器的隔离性。然而这也实现了在容器中运行daemon ,但却不能在Pod 中运行(例如,直接基于Docker 启动) 。
裸Pod
可能要直接创建
静态Pod
很可能,通过在一个指定目录下编写文件来创建