Kubernetes 控制器(Controllers)对比表格

Nexmoe 2025年6月26日

在 Kubernetes 中,控制器(Controllers)是用于管理 Pod 生命周期的核心组件。每种控制器都有其特定的使用场景和功能特点。以下是主要控制器类型的详细对比。

控制器对比表格

特性维度DeploymentStatefulSetDaemonSetJob
核心用途管理无状态应用(Web 服务,API)管理有状态应用(数据库,消息队列)在每个节点运行守护进程(监控,日志)运行一次性批处理任务
应用状态无状态有状态通常无状态通常无状态
Pod 身份无固定身份,可任意替换无论怎么调度,每个 Pod 都有一个永久不变的 ID与节点绑定临时身份
存储管理不需要持久化存储,可使用临时卷需要稳定的持久化存储(通过 PV/PVC 动态或静态供应)可选,通常访问主机路径(HostPath)或使用临时存储通常不需要,可按需挂载卷
部署与扩缩容无序部署,支持水平扩缩容有序、逐一地部署、扩缩容和删除(0, 1, 2…)自动部署到新加入的节点,随节点数增减控制并行度(parallelism)和完成次数(completions),运行至完成
更新策略滚动更新(RollingUpdate)、重建(Recreate)。可配置 maxSurgemaxUnavailable滚动更新(RollingUpdate),支持分区更新(partition)和按需更新(OnDelete滚动更新(RollingUpdate)、按需更新(OnDelete不适用,Job 一旦创建,其 Pod 模板不可变
回滚机制支持自动回滚到历史版本(revisionHistoryLimit不直接支持,需要手动操作或外部工具支持回滚不适用
故障处理自动重启或重建失败的 Pod具有相同身份的 Pod 最多只能有一个正在运行,但需手动干预恢复节点故障时,该节点上的 Pod 随之消失;当节点恢复或有新节点加入时自动创建 Pod可配置失败重试次数(backoffLimit
关键特性声明式更新、版本控制与回滚、可暂停/恢复部署有序性、稳定的网络和存储、Headless Service 支持节点亲和性、自动部署到新节点、可容忍污点失败重试、并行执行、完成后自动清理(TTL)
示例用例Nginx、Tomcat、NodeJS 应用MySQL、Redis、Kafka、ETCDFluentd、Prometheus Node Exporter、网络插件数据迁移、批量计算、备份、ETL 任务
最佳实践默认选择,适用于多数无状态应用仅在需要稳定身份或有序操作时使用用于基础设施和节点级服务用于会终止的任务,非守护进程

控制器层级关系

Deployment → ReplicaSet → Pod:这是管理无状态应用最常用的模式。用户直接操作 Deployment 对象来声明应用的期望状态(例如,镜像版本、副本数)。Deployment 控制器自身不直接管理 Pod,而是通过创建和管理 ReplicaSet 来实现。当用户更新 Deployment 时(例如,升级应用),Deployment 会创建一个新的 ReplicaSet,并以受控的方式(如滚动更新)将 Pod 从旧的 ReplicaSet 迁移到新的 ReplicaSet。这使得版本控制和回滚成为可能,而 ReplicaSet 只需关注维持指定数量的 Pod 副本这一单一职责。可以说,DeploymentReplicaSet 赋予了声明式更新和历史版本管理的能力。

CronJob → Job → PodCronJob 负责按预定的时间表(Cron 表达式)创建 Job 对象。Job 则负责执行一次性的任务,它会创建一个或多个 Pod 来完成具体工作,并确保它们成功终止。CronJob 本身不管理 Pod,它只关心在正确的时间点触发 Job。这种分层让定时任务的管理和实际任务的执行逻辑分离开来。

StatefulSetDaemonSet 则直接管理 Pod,它们没有中间层的控制器,因为它们提供的 Pod 管理逻辑(如稳定身份、节点绑定)是它们自身的核心功能,不需要通过其他控制器来抽象。

参考资源