1. 什么是 DaemonSet?
DaemonSet 是 Kubernetes 中的一种控制器,用于确保每个(或某些指定的)节点上运行一个 Pod 副本。它是为部署守护进程设计的,例如需要在每个节点上运行的任务或工具。
- 特点:
- Pod 会随着节点的加入或移除而动态创建或销毁。
- 确保在集群中每个符合条件的节点上都有一个 Pod。
- 可用来运行与节点级别功能相关的任务。
2. DaemonSet 的常见使用场景
-
日志收集
- 部署日志收集代理,例如 Fluentd 或 Filebeat,在每个节点上收集日志并发送到中央存储或日志系统(如 Elasticsearch)。
-
监控代理
- 在每个节点上运行监控代理,例如 Prometheus Node Exporter 或 Datadog Agent,收集节点的性能指标和状态信息。
-
网络组件
- 运行网络插件或代理,例如 CNI 插件(如 Calico、Flannel)或者 kube-proxy。
-
节点管理
- 部署节点的系统级别管理工具,如磁盘清理工具、节点健康检查器等。
-
安全代理
- 在每个节点上部署安全组件,例如防火墙代理或入侵检测系统(IDS)。
-
存储管理
- 用于在节点上运行与存储相关的代理,如 Ceph、GlusterFS 客户端,或其他存储卷管理工具。
3. 配置 DaemonSet 时的调度策略
在部署 DaemonSet 时,可以配置节点的**亲密性(Affinity)和排斥性(Toleration)**属性来控制 Pod 的调度行为。
3.1 节点选择器(Node Selector)
- 通过
nodeSelector
指定 Pod 只能调度到带有特定标签的节点上。 - 示例
spec:template:spec:nodeSelector:disktype: ssd
3.2 节点亲和性(Node Affinity)
- 更灵活的节点调度方式,分为硬性规则(
requiredDuringSchedulingIgnoredDuringExecution
)和软性规则(preferredDuringSchedulingIgnoredDuringExecution
)。 - 示例
spec:template:spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- ssdpreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: regionoperator: Invalues:- us-west
3.3 污点容忍(Tolerations)
- 配置 Pod 容忍节点的污点(Taints),允许 Pod 调度到被标记为“不接受常规工作负载”的节点上。
- 示例
spec:template:spec:tolerations:- key: "dedicated"operator: "Equal"value: "special"effect: "NoSchedule"
3.4 Pod 亲和性和反亲和性(Pod Affinity/Anti-Affinity)
- Pod Affinity:指定 Pod 调度到与其他特定 Pod 相邻的节点上。
- Pod Anti-Affinity:指定 Pod 避免调度到与其他特定 Pod 相邻的节点上。
- 示例
spec:template:spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- security-agenttopologyKey: "kubernetes.io/hostname"podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- loggertopologyKey: "kubernetes.io/hostname"
4. DaemonSet 的注意事项
-
更新策略
- 默认使用
RollingUpdate
策略逐步更新 DaemonSet 中的 Pod。 - 如果需要立即替换所有 Pod,可以选择
OnDelete
策略,手动删除旧 Pod。
- 默认使用
-
节点的变化
- 如果新增节点,DaemonSet 会自动在新节点上创建 Pod。
- 如果节点被删除,DaemonSet 对应的 Pod 也会被移除。
-
与其他控制器的对比
- 与 Deployment 不同,DaemonSet 不支持副本数的配置,因为每个符合条件的节点上只能运行一个 Pod。
-
性能开销
- 注意 DaemonSet 容器对每个节点资源的消耗,尤其是在大型集群中部署时。
5. DaemonSet 示例
以下是一个典型的 DaemonSet 配置示例,用于在所有节点上运行一个日志收集器:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: log-collectorlabels:app: log-collector
spec:selector:matchLabels:app: log-collectortemplate:metadata:labels:app: log-collectorspec:containers:- name: fluentdimage: fluent/fluentd:latestresources:limits:memory: "200Mi"cpu: "500m"volumeMounts:- name: varlogmountPath: /var/logvolumes:- name: varloghostPath:path: /var/logupdateStrategy:type: RollingUpdate
6. 总结
- DaemonSet 适用于运行每个节点所需的守护进程,如日志收集、监控、网络插件等。
- 可以通过
nodeSelector
、affinity
和tolerations
配置特定节点的调度策略。 - 在部署之前,充分考虑每个 Pod 的资源消耗及调度规则,确保资源合理分配。