在 Kubernetes(K8s)的容器编排体系中,** 控制器(Controller)** 是实现资源自动化管理的核心组件。它们通过 "期望状态" 与 "实际状态" 的持续比对,自动完成 Pod 的创建、更新、删除等操作,让应用运维更高效。本文将拆解 K8s 中最常用的 7 类控制器,帮你理清它们的适用场景与核心能力。
一、ReplicationController(RC):副本管理的 "初代元老"
核心定位 :K8s 最早的副本管理控制器,用于保证指定数量的 Pod 始终运行。工作逻辑 :通过标签选择器匹配 Pod,若实际 Pod 数量少于replicas(期望副本数),则自动创建新 Pod;若多于则删除多余 Pod。局限性 :仅支持精确标签匹配,不支持集合式标签(如matchExpressions),且功能已被ReplicaSet替代,目前仅用于兼容旧版本。
二、ReplicaSet(RS):副本管理的 "主力选手"
核心定位 :ReplicationController 的升级替代版,是 K8s 副本管理的基础控制器。核心能力:
- 支持更灵活的标签选择器(精确匹配 + 集合匹配,如
matchExpressions: {key: app, operator: In, values: [todo-list]}); - 持续维护
replicas指定的 Pod 数量,故障 Pod 会被自动重建; - 可配合
Deployment实现滚动更新,但不建议单独使用(缺乏版本回滚等高级能力)。
典型场景:作为 Deployment 的 "底层组件" 存在,很少单独部署。
三、Deployment:无状态应用的 "最佳拍档"
核心定位 :K8s 中最常用的控制器,专为无状态应用 设计,基于 ReplicaSet 实现更丰富的运维能力。核心能力:
- 滚动更新:逐步替换旧 Pod 为新 Pod,避免服务中断;
- 版本回滚:可回退到任意历史版本(基于 ReplicaSet 的版本记录);
- 自愈能力:Pod 故障时自动重建,始终维持期望副本数;
- 扩缩容 :支持手动 / 自动调整
replicas数量。
典型场景 :Web 服务、API 接口等无状态应用的部署(如本文中的todo-list服务)。
四、DaemonSet:节点级任务的 "专属工具"
核心定位 :保证每个(或指定)节点上运行且仅运行一个 Pod 的控制器。核心能力:
- 新节点加入集群时,自动在该节点创建对应的 Pod;
- 节点从集群移除时,自动删除该节点上的 Pod;
- 支持节点选择器(
nodeSelector),仅在匹配标签的节点上部署。
典型场景:节点监控(如 Prometheus Node Exporter)、日志采集(如 Fluentd)、网络插件(如 Calico)等需要在每个节点运行的组件。
五、Job:一次性任务的 "执行者"
核心定位 :用于运行一次性批处理任务 ,任务完成后 Pod 自动终止。核心能力:
- 任务成功完成后,Pod 状态变为
Completed; - 支持
backoffLimit(任务失败重试次数); - 支持
parallelism(并行执行的 Pod 数量)。
典型场景:数据备份、报表生成、临时计算(如前文的 "计算 2000 位圆周率")。
六、CronJob:定时任务的 "调度员"
核心定位 :基于 Job 实现的定时任务控制器 ,类似 Linux 的crontab。核心能力:
- 通过
schedule字段配置 Cron 表达式(如*/1 * * * *表示每分钟执行一次); - 自动创建 Job 执行定时任务;
- 可配置历史任务的保留数量(避免资源堆积)。
典型场景 :定时数据同步、定时日志清理、定时接口调用(如本文中定时请求todo-list的接口)。
七、StatefulSet:有状态应用的 "守护者"
核心定位 :专为有状态应用 设计的控制器,保证 Pod 的 "身份唯一性" 与 "稳定网络标识"。核心能力:
- 稳定的 Pod 名称 :Pod 名称按
[StatefulSet名称]-[序号]格式生成(如mysql-0、mysql-1); - 稳定的网络标识 :每个 Pod 拥有唯一的 DNS 域名(如
mysql-0.mysql-headless.default.svc.cluster.local); - 稳定的存储 :配合
PersistentVolumeClaim模板,保证 Pod 重建后仍能挂载原存储卷; - 有序操作:扩容时按序号递增创建,缩容时按序号递减删除,更新时支持有序滚动。
典型场景:数据库(MySQL、MongoDB)、消息队列(Kafka)等需要稳定身份与存储的应用。
八、Horizontal Pod Autoscaler(HPA):自动扩缩容的 "智能管家"
核心定位 :基于资源使用率(或自定义指标)自动调整 Pod 副本数 的控制器。核心能力:
- 支持 CPU、内存等资源指标(如 "CPU 使用率超过 50% 时扩容");
- 支持自定义指标(如 "QPS 超过 1000 时扩容");
- 可配置扩缩容的最小 / 最大副本数。
典型场景:流量波动较大的应用(如电商平台的促销活动),自动应对流量峰值。
总结:控制器如何选?
| 控制器类型 | 核心场景 | 关键特性 |
|---|---|---|
| ReplicaSet | 基础副本管理(少用) | 灵活标签选择器 |
| Deployment | 无状态应用部署 | 滚动更新、版本回滚 |
| DaemonSet | 节点级任务 | 每个节点一个 Pod |
| Job | 一次性批处理任务 | 任务完成后终止 |
| CronJob | 定时任务 | 基于 Cron 表达式调度 |
| StatefulSet | 有状态应用部署 | 稳定身份、存储、网络 |
| HPA | 自动扩缩容 | 基于指标动态调整副本数 |
K8s 的控制器体系覆盖了从无状态到有状态、从一次性任务到长期服务的全场景需求,掌握它们的适用场景,是高效使用 K8s 的关键~