Kubernetes (k8S) 中的 DaemonSet 是一种控制器资源,它具有以下关键特性:
- 每个节点运行一个实例:
- DaemonSet 确保集群中的每个节点(满足特定条件的节点)上都运行一个Pod副本。这意味着无论何时创建或加入新的节点到集群中,DaemonSet都会自动为新节点调度和管理一个Pod。
- 目标节点选择:
- 通过使用NodeSelector、NodeAffinity 或其他节点标签,可以精确地控制DaemonSet中的Pod部署在哪些节点上。例如,可以选择仅在具有特定硬件或功能的节点上运行DaemonSet。
- 自适应性:
- 当节点加入或离开集群时,DaemonSet会自动添加或删除相应的Pod。如果一个节点被删除或者由于某种原因变得不可用,那么该节点上的DaemonSet Pod也会被清理;反之,如果有新节点加入,DaemonSet将确保在新节点上启动一个Pod实例。
- 单一实例约束:
- 默认情况下,DaemonSet保证在每个节点上只运行一个Pod实例。这可以通过PodDisruptionBudget等机制来进一步强化,并且可以通过PodAntiAffinity规则来避免同一个节点上运行多个相同的DaemonSet Pod。
- 全局覆盖与本地守护进程:
- DaemonSet通常用于部署那些提供集群层面功能的服务,如日志收集代理(如Fluentd或Filebeat)、监控代理(如Prometheus Node Exporter或cAdvisor)、网络插件以及其他需要在每个工作节点上都有一个实例运行的基础服务。
- 更新策略:
- DaemonSet也支持版本升级和回滚操作,允许用户控制Pod的更新方式,类似于Deployment的滚动更新策略,但更侧重于节点级别的更新而不是基于副本数量。
- 生命周期管理:
- DaemonSet能够管理其Pod的生命周期,包括初始化容器、健康检查以及重启策略等。
综上所述,DaemonSet的主要作用是确保集群中的所有(或符合条件的部分)节点上都能按需运行指定的系统守护进程或其他基础组件,以提供集群范围内的基础设施支持。