DaemonSet
通过控制器名称可以看出:Daemon
,就是用来部署守护进程的。
DaemonSet 用于在每个 Kubernetes 节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个 Pod 副本,当新的节点加入到 Kubernetes 集群中,Pod 会被调度到该节点上运行,当节点从集群只能够被移除后,该节点上的这个 Pod 也会被移除。当然,如果删除 DaemonSet,所有和这个对象相关的 Pods 都会被删除。
基于这种特性,DaemonSet 常被用于:
- 集群存储守护程序,如 glusterd、ceph 要部署在每个节点上以提供持久性存储。
- 节点监控守护进程,如 Prometheus 监控集群,可以在每个节点上运行一个 node-exporter 进程来收集监控节点的信息。
- 日志收集守护程序,如 fluentd 或 filebeat,在每个节点上运行以收集日志。
- 节点网络插件,比如 flannel、calico,在每个节点上运行为 Pod 提供网络服务。
正常情况下,Pod 运行在哪个节点上是由 Kubernetes 的调度器策略来决定的,然而 DaemonSet 控制器创建的 Pod 实际上提前已经确定了在哪个节点上了,所以即使调度器还没有启动,依旧可以创建 Pod。
DaemonSet 资源清单
DaemonSet 的资源清单配置当时和其它控制器几乎一样:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-nginx
namespace: default
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
查看 Pod 状态:
kubectl get pods -A -o wide
可以发现每个 Worker 节点都运行了一个 Pod。
如果是 kubeadm 安装的 Kubernetes 集群,那么 Master 节点将不会启动该 Pod。因为 Master 节点默认被标记了 污点
。
DaemonSet 运行的示意图如下:
集群中的 Pod 和 Node 是一一对应d的,而 DaemonSet 会管理全部机器上的 Pod 副本,负责对它们进行更新和删除。
DaemonSet 控制器保证每个 Node 上有且只有一个被管理的 Pod 的实现原理:
- 首先 DaemonSet 从 ETCD 获取到 Node 列表,然后遍历所有的 Node。
- 根据资源对象定义是否有调度相关的配置,然后分别检查 Node 是否符合要求。
- 在可运行 Pod 的节点上检查是否已有对应的 Pod,如果没有,则在这个 Node 上创建该 Pod,如果有不止一个,就删除多余的 Pod ,如果只有一个 Pod,就不管。
在后面学习了资源调度后,也可以用 Deployment 来实现 DaemonSet 的效果。
同时 DeamonSet 也支持 OnDelete
和 RollingUpdate
两种更新方式,默认是滚动更新。