在 Kubernetes 集群管理中,DaemonSet 是一个非常重要的控制器,它能够确保集群中的所有节点都运行相同的 Pod 副本。本文将详细介绍 DaemonSet 的相关知识,包括其概述、工作原理、应用场景、与 Deployment 的区别、资源清单文件编写技巧以及使用案例。
一、DaemonSet 概述
什么是 DaemonSet
DaemonSet 控制器的核心功能是保证 Kubernetes 集群中所有的节点都运行一个相同的 Pod 副本。当向集群中添加新的节点时,这个新节点会自动创建对应的 Pod 副本;当节点从集群中移除时,相关的 Pod 也会被自动删除。此外,删除 DaemonSet 时,它所创建的所有 Pod 也会随之被删除。
工作原理
DaemonSet 控制器会持续监听 Kubernetes 中的 DaemonSet 对象、Pod 对象和 Node 对象。当这些被监听的对象发生变动时,就会触发 syncLoop 循环,促使 Kubernetes 集群朝着 DaemonSet 对象所描述的期望状态演进。
典型应用场景
DaemonSet 在很多场景中都有广泛应用,例如:
- 在集群的每个节点上运行存储组件,如 glusterd 或 ceph。
- 在每个节点上部署日志收集组件,像 flunentd、logstash、filebeat 等。
- 在每个节点上运行监控组件,比如 Prometheus、Node Exporter、collectd 等。
与 Deployment 的区别
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 可能运行多个副本。而 DaemonSet 与之不同,其特点是每个 Node 上最多只能运行一个副本。
二、DaemonSet 资源清单文件编写技巧
要编写 DaemonSet 资源清单文件,我们可以通过 kubectl explain ds 等命令查看相关字段的说明,以下是主要字段的介绍:
主要字段说明
-
通过
kubectl explain ds可查看的主要字段:字段 作用 apiVersion 当前资源使用的 api 版本,需跟 VERSION: apps/v1 保持一致 kind 资源类型,跟 KIND: DaemonSet 保持一致 metadata 元数据,用于定义 DaemonSet 的名字等信息 spec 用于定义容器等相关配置 status 状态信息,该字段不可修改 -
通过
kubectl explain ds.spec可查看的 spec 部分主要字段:字段 作用 minReadySeconds 新的 pod 启动几秒后,再终止旧的 pod revisionHistoryLimit 历史版本数量 selector -required- 用于匹配 pod 的标签选择器 template -required- 定义 Pod 的模板,基于此模板创建的所有 pod 都是一样的 updateStrategy daemonset 的升级策略 -
通过
kubectl explain ds.spec.template可查看的 template 部分主要字段:字段 作用 containers 容器配置列表,每个元素描述一个要在 Pod 内运行的容器 initContainers 初始化容器配置列表,在主容器之前运行,用于设置环境或执行预备工作 ephemeralContainers 临时容器配置列表,仅在 Pod 运行时存在 restartPolicy Pod 的重启策略,可选值为 Always、OnFailure 或 Never terminationGracePeriodSeconds 优雅终止周期,以秒为单位,强制终止 Pod 前的等待时间 activeDeadlineSeconds Pod 活动的截止时间,超过此时间系统将杀死 Pod dnsPolicy Pod 的 DNS 策略,可选 ClusterFirst、ClusterFirstWithHostNet 等 Context Pod 的安全上下文,用于设置安全相关属性,如 RBAC 规则等 schedulerName 调度器名称,指定用于调度 Pod 的特定调度器 tolerations Pod 容忍的污点,允许 Pod 调度到有特定污点的节点上 affinity Pod 的亲和性设置,指定 Pod 偏好或必须运行的节点属性 hostNetwork 若设为 true,Pod 将使用主机的网络命名空间 imagePullSecrets 用于获取镜像的密钥,会被注入到 Pod 中 configMap ConfigMap 的名称和键值对列表,用于注入配置数据到 Pod secret Secret 的名称和键值对列表,用于注入敏感数据到 Pod volumeMounts 卷挂载配置列表,指定 Pod 中容器如何挂载卷 volumes 卷配置列表,为 Pod 中的容器提供存储卷
清单模版
以下是一个 DaemonSet 资源清单的模板:
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pod-controller # ds名称
labels: # 给ds打标签
controller: daemonset
spec:
revisionHistoryLimit: 3 # 保留历史版本数量,默认为10
updateStrategy: # Pod更新策略,默认是RollingUpdate
type: RollingUpdate # 滚动更新策略。另一种是OnDelete,其没有子属性配置参数
rollingUpdate: # 当type为RollingUpdate的时候生效,为其配置参数
maxSurge: 25% # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%
maxUnavailable: 25% # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25%
selector: # 选择器,通过该控制器管理哪些pod
matchLabels: # Labels匹配规则。和matchExpressions类似
app: nginx-pod ###或者
matchExpressions: # Expressions匹配规则。和matchLabels类似
- {key: app, operator: 'In', values: ["nginx-pod"]}
template: # pod副本创建模板。属性和Pod的属性一样
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
三、DaemonSet 使用案例
下面通过一个实际案例来演示 DaemonSet 的使用:
- 创建一个名为
pod-controller.yaml的文件,内容如下:
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pod-controller
labels:
controller: daemonset
spec:
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
- 应用该清单文件:
shell
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml
daemonset.apps/pod-controller created
执行上述命令后,DaemonSet 就会在集群的每个节点上创建一个运行 nginx 镜像的 Pod。