Kubernetes 控制器(Controller)

控制器是 K8s 集群控制面的核心组件,基于「控制循环」和「声明式 API」设计,核心作用是持续监控资源「实际状态」与用户定义的「期望状态」,当两者不一致时自动调谐,实现集群资源的自动化管理、故障自愈、弹性扩缩容等核心能力。
简单来说:控制器是 K8s 的「自动化运维管家」—— 用户只需定义“想要的结果”(如运行3个Nginx Pod),无需关心实现过程,控制器会兜底保证资源状态符合预期。

一、核心工作原理

所有控制器均遵循「感知→对比→调谐」的无限循环模型,是自动化的核心:

  1. 感知(Observe):通过 API Server 监控目标资源(Pod/Deployment 等)的实际状态(数量、运行节点、容器状态),以及集群关联状态(节点可用性、资源充足度);
  2. 对比(Compare):将实际状态与 YAML 中定义的期望状态(如 replicas: 3、镜像版本)对比,判断是否存在差异;
  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

核心原则(示例验证)

  1. 控制器不直接运行 Pod
    • 控制器仅通过 API Server 下发“创建3个Nginx Pod”的指令;
    • 调度器负责将Pod调度到具体节点,节点上的kubelet负责拉取镜像、启动容器。
  2. 一个 Pod 仅归属一个控制器
    # 查看Pod的控制器归属(OWNER REFERENCES字段)
    kubectl describe pod <nginx Pod名称> | grep "Owner References"
    # 输出仅指向一个ReplicaSet,该ReplicaSet又指向一个Deployment
    
  3. 禁止创建裸 Pod
    # 创建裸Pod(无控制器管理)
    kubectl run nginx-bare --image=nginx
    # 模拟节点宕机:裸Pod不会被重建,服务永久中断;而Deployment管理的Pod会自动重建
    

典型层级示例(可视化)

用户

Deployment

ReplicaSet

Pod1

Pod2

Pod3

用户

StatefulSet

mysql-0 Pod

mysql-1 Pod

用户

DaemonSet

node-1上的Node Exporter Pod

node-2上的Node Exporter Pod

总结

  1. 控制器核心是通过「控制循环」保证资源「实际状态」与「期望状态」一致,所有示例可直接落地,是 K8s 自动化、高可用的核心;
  2. 核心价值集中在故障自愈、弹性扩缩容、版本管控、资源编排四大维度,不同控制器封装专属场景逻辑,覆盖无状态/有状态/定时任务等全业务场景;
  3. 控制器是 Pod 的上层管理者,生产环境必须通过控制器管理 Pod(禁止裸 Pod),层级化管理可保证资源管控的一致性和可追溯性。

更多推荐