k8s控制器
·
Kubernetes 控制器(Controller)
控制器是 K8s 集群控制面的核心组件,基于「控制循环」和「声明式 API」设计,核心作用是持续监控资源「实际状态」与用户定义的「期望状态」,当两者不一致时自动调谐,实现集群资源的自动化管理、故障自愈、弹性扩缩容等核心能力。
简单来说:控制器是 K8s 的「自动化运维管家」—— 用户只需定义“想要的结果”(如运行3个Nginx Pod),无需关心实现过程,控制器会兜底保证资源状态符合预期。
一、核心工作原理
所有控制器均遵循「感知→对比→调谐」的无限循环模型,是自动化的核心:
- 感知(Observe):通过 API Server 监控目标资源(Pod/Deployment 等)的实际状态(数量、运行节点、容器状态),以及集群关联状态(节点可用性、资源充足度);
- 对比(Compare):将实际状态与 YAML 中定义的期望状态(如 replicas: 3、镜像版本)对比,判断是否存在差异;
- 调谐(Reconcile):若有差异,通过 API Server 执行创建/删除/更新 Pod、调度节点等操作,直到实际状态与期望状态一致。
✅ 完整实操示例(Deployment 控制器):
# 1. 定义Deployment期望状态:运行3个Nginx Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3 # 期望状态:3个Pod
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
# 2. 部署Deployment
kubectl apply -f nginx-deploy.yaml
# 3. 查看初始状态:控制器自动创建3个Pod
kubectl get pods | grep nginx # 输出3个Running状态的Pod
# 4. 模拟状态不一致:手动删除1个Pod(制造实际状态=2,期望状态=3)
kubectl delete pod <任意一个nginx Pod名称>
# 5. 验证调谐效果:控制器立即感知差异,自动创建1个新Pod补齐数量
kubectl get pods | grep nginx # 几秒后恢复为3个Pod
二、通用核心作用
无论具体类型(Deployment/StatefulSet 等),控制器均具备以下核心能力:
1. 故障自愈(自动恢复异常资源)
✅ 场景示例:
- Pod 崩溃:Nginx 容器因配置错误崩溃,控制器检测到 Pod 状态为
Error,自动重启容器或重建 Pod; - 节点宕机:运行 Pod 的 Node 节点断电,控制器感知到 Pod 失联,立即在其他健康节点重建 Pod;
- 手动误删:运维误执行
kubectl delete pod nginx-deploy-xxxx,控制器秒级创建新 Pod 补齐数量。
# 验证故障自愈:查看Pod重建记录
kubectl describe deployment nginx-deploy | grep "ReplicaSet" # 可看到新ReplicaSet创建记录
2. 弹性扩缩容(适配流量变化)
✅ 手动扩缩容示例:
# 将Pod数量从3个扩到5个
kubectl scale deployment nginx-deploy --replicas=5
kubectl get pods | grep nginx # 立即显示5个Pod(控制器自动创建2个新Pod)
# 缩容回3个
kubectl scale deployment nginx-deploy --replicas=3
kubectl get pods | grep nginx # 多余2个Pod被控制器自动删除
✅ 自动扩缩容示例(结合HPA):
# 创建HPA,按CPU使用率(50%)自动扩缩容(2-10个Pod)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
# 部署HPA后,当Pod CPU使用率超50%,控制器自动扩容;低于则缩容
kubectl get hpa nginx-hpa # 查看扩缩容状态
3. 版本管控(无缝更新+一键回滚)
✅ 滚动更新示例:
# 将Nginx镜像从1.24更新为1.25(控制器逐个替换Pod,不中断服务)
kubectl set image deployment nginx-deploy nginx=nginx:1.25
# 查看更新进度:控制器逐个删除旧Pod、创建新Pod
kubectl rollout status deployment nginx-deploy
✅ 版本回滚示例(更新后服务异常):
# 查看更新历史
kubectl rollout history deployment nginx-deploy
# 回滚到上一个健康版本
kubectl rollout undo deployment nginx-deploy
# 验证:Pod镜像恢复为1.24,服务恢复正常
kubectl describe pod <nginx Pod名称> | grep Image # 显示nginx:1.24
4. 资源编排(统一管理关联资源)
✅ 示例:Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod
# 查看Deployment关联的ReplicaSet
kubectl get rs | grep nginx # 输出nginx-deploy-xxxx(由Deployment创建)
# 查看ReplicaSet关联的Pod
kubectl describe rs <ReplicaSet名称> | grep "Pods Status" # 显示3个Running Pod
# 删除Deployment:级联删除ReplicaSet和Pod(无资源残留)
kubectl delete deployment nginx-deploy
kubectl get rs,pod | grep nginx # 无结果,所有资源被清理
5. 状态保活(持续调谐回归期望状态)
✅ 示例:节点资源不足导致Pod调度失败
- 控制器感知到“期望3个Pod,但实际仅2个运行”,会持续尝试调度第3个Pod;
- 若集群新增节点或原有节点释放资源,控制器立即完成调度,补齐3个Pod;
- 若长期调度失败,控制器会在事件日志中记录错误(如
FailedScheduling),便于排查。
6. 场景封装(适配不同业务需求)
| 控制器类型 | 适配场景 | 实操示例 |
|---|---|---|
| Deployment | 无状态服务(Nginx、微服务接口) | 上文的Nginx部署示例 |
| StatefulSet | 有状态服务(MySQL、Redis集群) | 创建MySQL集群,自动分配固定名称(mysql-0、mysql-1)、稳定PVC |
| DaemonSet | 节点专属服务(监控、日志采集) | 部署Prometheus Node Exporter,每个节点自动运行1个Pod |
| Job | 一次性批处理任务(数据备份) | 执行kubectl create job backup --image=busybox -- /bin/sh -c "tar -czf /backup/data.tar.gz /data",任务完成后Pod自动终止 |
| CronJob | 定时任务(每日凌晨备份) | 配置schedule: "0 0 * * *",控制器每天凌晨自动创建Job执行备份 |
三、控制器与 Pod 的核心关系(补充示例)
控制器是 Pod 的上层管理者,Pod 是控制器的管理对象,核心层级为:用户操作控制器 → 控制器管理底层中间资源(如 ReplicaSet) → 底层资源管理 Pod
核心原则(示例验证)
- 控制器不直接运行 Pod:
- 控制器仅通过 API Server 下发“创建3个Nginx Pod”的指令;
- 调度器负责将Pod调度到具体节点,节点上的kubelet负责拉取镜像、启动容器。
- 一个 Pod 仅归属一个控制器:
# 查看Pod的控制器归属(OWNER REFERENCES字段) kubectl describe pod <nginx Pod名称> | grep "Owner References" # 输出仅指向一个ReplicaSet,该ReplicaSet又指向一个Deployment - 禁止创建裸 Pod:
# 创建裸Pod(无控制器管理) kubectl run nginx-bare --image=nginx # 模拟节点宕机:裸Pod不会被重建,服务永久中断;而Deployment管理的Pod会自动重建
典型层级示例(可视化)
总结
- 控制器核心是通过「控制循环」保证资源「实际状态」与「期望状态」一致,所有示例可直接落地,是 K8s 自动化、高可用的核心;
- 核心价值集中在故障自愈、弹性扩缩容、版本管控、资源编排四大维度,不同控制器封装专属场景逻辑,覆盖无状态/有状态/定时任务等全业务场景;
- 控制器是 Pod 的上层管理者,生产环境必须通过控制器管理 Pod(禁止裸 Pod),层级化管理可保证资源管控的一致性和可追溯性。
更多推荐
所有评论(0)