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