一、什么是 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

核心操作场景:

  1. 版本迭代(滚动更新)

    修改镜像版本后应用配置,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

更多推荐