1 概念
控制器本质是无限循环的控制循环(调谐循环/Reconcile Loop)。
工作模式:持续监听集群状态,对比期望状态(yaml spec定义)和集群实际状态,两者不一样就做操作,把实际状态往期望状态对齐。
通俗类比:家里的空调温控器。你设定26℃(期望状态),温度计读取房间当前温度(实际状态);高于26就制冷,低于26就停止,不停循环,维持目标温度。K8s控制器就相当于这个温控器。
工作流程(控制循环)
- 通过apiserver监听资源变化,读取期望状态(写在yaml里,保存在etcd)
- 获取集群当前真实状态
- 对比两者是否一致
- 不一致,执行调谐操作:创建/删除/更新Pod等资源
- 回到第一步,无限循环监控
2 控制器常用类型
| 控制器 | 作用 | 典型场景 |
|---|---|---|
| Deployment | 管理无状态应用,底层调用ReplicaSet,支持滚动更新、版本回滚 | web服务、后端API,绝大多数无状态业务 |
| ReplicaSet | 保证指定数量Pod副本持续运行,很少直接使用,由Deployment调用 | 维持副本数,Deployment底层组件 |
| StatefulSet | 管理有状态应用,Pod有稳定网络标识、稳定存储,有序启停 | MySQL、Redis集群、ZooKeeper等数据库类服务 |
| DaemonSet | 每(选定)个节点上运行且仅运行1个Pod | 日志采集、监控agent、节点代理 |
| Job | 一次性任务,直到Pod成功执行完成退出 | 数据备份、批量计算,跑完就结束 |
| CronJob | 定时Job,按cron周期执行定时任务 | 定时备份、定时报表任务 |
举个Deployment例子
yaml写replicas:3,期望运行3个nginx Pod。
- 如果节点宕机,只剩1个Pod,控制器会自动新建2个Pod,凑够3个。
- 如果手动多创建了Pod,控制器会删掉多余Pod,保证副本数=3。
- 修改镜像版本,控制器滚动创建新Pod,逐步销毁旧Pod,实现不停服更新。
3 replicaset控制器
3.1 replicaset功能
ReplicaSet 是下一代的 Replication Controller,官方推荐使用
ReplicaSet ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的 选择器需求
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的 机制
3.2 replicaset参数说明
| 参数名称 | 字段类型 | 参数说明 |
|---|---|---|
| spec | Object | 详细定义对象,固定值就写 Spec |
| spec.replicas | integer | 指定维护 pod 副本数量 |
| spec.selector | Object | Selector 是对 pod 的标签查询,与 pod 数量匹配 |
| spec.selector.matchLabels | string | 指定 Selector 查询标签的名称和值,以 key: value 方式指定 |
| spec.template | Object | 指定对 pod 的描述信息,比如 lab 标签,运行容器的信息等 |
| spec.template.metadata | Object | 指定 pod 属性 |
| spec.template.metadata.labels | string | 指定 pod 标签 |
| spec.template.spec | Object | 详细定义对象 |
| spec.template.spec.containers | list | Spec 对象的容器列表定义 |
| spec.template.spec.containers.name | string | 指定容器名称 |
| spec.template.spec.containers.image | string | 指定容器镜像 |
3.3 Replicaset控制器示例
3.3.1 建立控制器
3.3.2 测试功能
4 deployment 控制器
4.1 deployment控制器的功能
- 副本管理:维持指定数量 Pod 副本,Pod 故障销毁会自动重建。
- 滚动更新(重点):版本升级,逐步替换旧 Pod,业务不中断;底层生成新 ReplicaSet,旧 ReplicaSet 保留用于回滚。
- 版本回滚:更新出错时,可以回退到历史版本,复用旧 ReplicaSet。
- 副本扩缩容:支持 scale 命令修改副本数量。
- 版本历史保存:保留旧版本 ReplicaSet 历史记录,用于回滚。
典型的应用场景:
- 用来创建Pod和ReplicaSet
- 滚动更新和回滚
- 扩容和缩容
- 暂停与恢复
4.2 deployment控制器示例
4.2.1 监控
4.2.2 建立deployment控制器
4.2.3 升级和回滚
升级
回滚
4.2.4 设定更新策略
4.2.5 更新暂停和恢复
5 DaemonSet
5.1 DaemonSet 功能Kubernetes
核心定义
DaemonSet 是 Kubernetes 的工作负载控制器,保证集群全部或者指定一部分节点上,有且仅有一个该 Pod 副本。
- 新节点加入集群:DaemonSet 自动在新节点创建 Pod
- 节点从集群移除:对应节点上的 Pod 会被自动回收删除
- 删除 DaemonSet 资源:它管理的所有 Pod 全部被删除
典型使用场景(系统级守护进程)
- 网络插件:Calico、Flannel,每个节点部署网络代理,负责节点网络通信
- 日志采集:Filebeat,每个节点收集宿主机容器日志
- 监控代理:Node‑Exporter,采集每台节点硬件、系统指标
- 存储组件:Ceph 客户端,节点本地存储相关守护进程
- 硬件相关:节点硬件监控、驱动代理等需要访问宿主机资源的程序
5.2 daemonset 示例
6 job 控制器
6.1 job控制器功能
核心概念
Job 属于 K8s 一次性任务控制器,用来执行一次性、跑完就结束的任务。
Deployment 是长期不停止的服务;Job 是任务完成,Pod 就正常退出(状态 Completed)
Job 核心能力
- 创建 Pod,执行任务,直到 Pod成功正常结束(退出码 0),标记 Job 完成。
- 如果 Pod 异常失败(报错、崩溃),Job 会自动新建 Pod 重试执行。
- 任务成功完成之后不会再创建新 Pod,保留已经完成的 Pod 记录。
6.2 job 控制器示例
7 cronjob 控制器
7.1 cronjob 控制器功能
- Cron Job 创建基于时间调度的 Jobs。
- CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,
- CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的 方式。
- CronJob可以在特定的时间点(反复的)去运行job任务。