目录
一、DaemonSet需求背景
- 我们在使用 deployment 对象部署服务的时候虽然可以通过 replicas 字段指定 Pod 的副本数,但是我们没办法指定Pod 的分布。举个例子,如果我们一个 deployment 资源对象有4个 Pod 副本,存在一个节点node1,这4个Pod 副本可能全部都在node1上,也可能 node1 上一个也没有。
- 但是存在这样的情况,我们只想在一个节点上部署一个服务实例。比如我们的节点监控,日志审计等,在每个节点上只需要一个相应的服务实例即可。根据这些特点,Kubernetes的开发者们创造了 DaemonSet 资源对象。
在Kubernetes集群中,DaemonSet 资源对象所管理的Pod叫Daemon Pod,该Pod主要有3个特征:
- 运行在Kubernetes集群的每一个节点上;
- 每个节点上仅有一个该Pod实例;
- 当有新的节点加入到Kubernetes集群时,该Pod会自动的在新的节点创建出来;当老的节点被删除,它上面的Daemon Pod也会被回收;
DaemonSet 资源对象如何保证每个节点上有且仅有一个被管理的Daemon Pod的?
Kubernetes在创建DaemonSet资源时,会从Etcd上获取当前集群中所有node,遍历node列表,使用标签选择器检查当前节点是否有指定标签值的Pod。
- 如果刚好有一个,正常情况,继续检查下一个节点;
- 如果没有,则创建一个指定类型的Daemon Pod(创建时使用nodeAffinity字段指定节点名);
- 如果有,但是多于一个,则进行删除操作;
在默认情况下,Kubernetes不允许用户在集群的master节点部署Pod。因此,master节点创建了一个叫node-role.kubernetes.io/master
的污点。所以,为了能让Daemon Pod能够部署在master节点,我们在yaml文件中定义该Pod的时候,必须设置这个Pod对该污点的容忍度。
二、资源对象 DaemonSet 的 Yaml 定义
2.1 在 Yaml 文件中定义 DaemonSet 资源对象
因为 DaemonSet 资源对象的Yaml 模版文件kubernetes 生成不了,下面是一个 DaemonSet 资源对象的定义。
apiVersion: apps/v1 # API 资源对象版本
kind: DaemonSet # API 资源对象类型
metadata:
name: prometheus-ds # API 资源对象名称
labels:
app: prometheus-ds
spec:
selector:
matchLabels:
name: prometheus-ds
template:
metadata:
labels:
name: prometheus-ds
spec:
containers:
- image: prometheus-server # 镜像名
name: prometheus # 容器名
ports:
- containerPort: 9191
我们可以看到 DaemonSet 资源对象跟 deployment 资源对象最大的差别就是 DaemonSet 资源对象没有 replicas 字段。这也暗示着 deployment 资源对象不会在K8S 集群中创建多个副本,而是在每个节点创建一个。
2.2 污点和容忍度
- 污点就是 kubernetes 赋予节点的一种属性,或者说是标签。如果某个节点具有某个污点,也就是说这个节点被指定的key-value 键值对赋予了某个属性。容忍度是属于 Pod 的概念,Pod 的容忍度与节点的污点是相对的。表示某个Pod 在选择节点创建部署时是否可以容忍该节点的污点。
- 污点、容忍度的概念是为了增强 kubernetes 编排、管理 Pod 的能力,丰富了调度 Pod 的方式,可以适配更多的使用场景;
三、资源对象 DaemonSet 的操作
下面是是使用 kubectl
命令工具操作 DaemonSet 的常见命令:
kubectl apply -f test-ds.yaml # 根据yaml文件中的定义创建对应的 DaemonSet 资源对象
kubectl get ds # 查看 daemonset 资源对象详情
kubectl get pod -o wide # 查看pod状态详情
DaemonSet 资源对象的名称简写为ds