Kubernetes 控制器详解:从基础到实践
·
一、什么是 Kubernetes 控制器?
官方文档:
https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
控制器是 Kubernetes 中管理 Pod 的中间层,其核心作用是:
- 维持 Pod 的期望状态(如指定数量的副本)
- 当 Pod 发生故障(如意外关闭、节点下线)时,自动恢复到目标状态
- 简化 Pod 的创建、更新、删除等编排操作
工作原理:控制器将用户定义的期望状态写入 etcd,Kubernetes APIServer 持续对比当前状态与期望状态,若存在差异则自动触发调整机制。
对比两种 Pod 管理方式:
- 自主式 Pod:退出后不会被重新创建
- 控制器管理的 Pod:始终维持期望的副本数量,具备自愈能力
二、常用控制器类型及用途
Kubernetes 提供了多种控制器以适应不同场景,核心类型如下:
| 控制器名称 | 核心用途 |
|---|---|
| ReplicaSet | 确保指定数量的 Pod 副本持续运行(推荐替代传统的 Replication Controller) |
| Deployment | 基于 ReplicaSet 提供声明式更新能力,支持滚动更新、回滚等高级操作 |
| DaemonSet | 确保所有(或指定)节点上运行一个 Pod 副本(如日志收集、监控代理) |
| StatefulSet | 管理有状态应用,为 Pod 提供稳定的网络标识和存储 |
| Job | 执行一次性批处理任务,确保任务成功完成 |
| CronJob | 基于时间调度的 Job,支持周期性任务(类似 Linux 的 crontab) |
| Horizontal Pod Autoscaler | 根据资源利用率自动调整 Pod 数量,实现水平扩缩容 |
三、核心控制器实践详解
3.1 ReplicaSet:副本数量管理
功能特点:
- 确保任何时刻都有指定数量的 Pod 副本运行
- 通过标签选择器关联 Pod,支持基于集合的标签查询
- 通常不直接使用,而是作为 Deployment 的底层组件
示例配置:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 2 # 期望的 Pod 数量
selector:
matchLabels:
app: myapp # 匹配标签为 app=myapp 的 Pod
template: # Pod 模板
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
关键特性:
- 自愈能力:删除任一 Pod 后,会自动创建新 Pod 维持副本数
- 标签关联:若修改 Pod 标签使其不匹配选择器,ReplicaSet 会创建新 Pod 补充
3.2 Deployment:声明式更新与编排
功能特点:
- 间接管理 Pod(通过控制 ReplicaSet 实现)
- 支持滚动更新、版本回滚、暂停 / 恢复更新等操作
- 每个更新都会创建新的 ReplicaSet,保留版本历史
基础配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 4 # 副本数量
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
核心操作场景:
-
版本迭代(滚动更新)
修改镜像版本后应用配置,Deployment 会逐步替换旧 Pod:
# 更新为 v2 版本
spec:
template:
spec:
containers:
- image: myapp:v2 # 新版本镜像
默认策略:每次更新 25% 的 Pod(可通过 maxSurge 和 maxUnavailable 调整)
2.版本回滚
若更新出现问题,可回滚到历史版本:
# 编辑配置文件恢复为旧版本镜像(如 v1)
kubectl apply -f deployment.yml
3.暂停与恢复更新
适用于多步修改后统一生效:
# 暂停更新
kubectl rollout pause deployment my-deployment
# (修改配置)
# 恢复更新
kubectl rollout resume deployment my-deployment
3.3 DaemonSet:节点级服务部署
功能特点:
- 在所有节点(或匹配标签的节点)上运行一个 Pod 副本
- 新节点加入集群时自动部署 Pod,节点移除时自动清理
- 适合运行节点级服务(如日志收集、监控代理)
示例配置:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations: # 容忍节点污点(如 master 节点的污点)
- effect: NoSchedule
operator: Exists
containers:
- name: nginx
image: nginx
3.4 Job 与 CronJob:任务型工作负载
Job:一次性批处理任务
功能:执行一次性任务,确保指定数量的 Pod 成功完成。
示例配置:
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculation
spec:
completions: 6 # 总任务数
parallelism: 2 # 并行执行数
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] # 计算圆周率
restartPolicy: Never # 失败后不重启容器,创建新 Pod
backoffLimit: 4 # 最大重试次数
CronJob:周期性任务
功能:基于时间调度 Job,类似 Linux 的 crontab。
示例配置:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cron
spec:
schedule: "* * * * *" # 每分钟执行一次(cron 表达式)
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["/bin/sh", "-c", "date; echo Hello from Kubernetes"]
restartPolicy: OnFailure
更多推荐

所有评论(0)