3. Deployment 基础:ReplicaSet、Pod 模板、滚动更新策略、声明式配置

Deployment 是 Kubernetes 中最常用的工作负载控制器,它通过声明式配置管理 Pod 的副本数量、更新策略与回滚操作。理解 Deployment 的底层组件与运行机制,是进行节点扩容与资源调度的前提。本节将拆解 Deployment 的四个核心要素:ReplicaSet、Pod 模板、滚动更新策略与声明式配置。

3.1 核心组件:ReplicaSet 与 Pod 模板

Deployment 并不直接管理 Pod,而是通过 ReplicaSet 间接控制 Pod 的副本数量与生命周期。每个 Deployment 在创建或更新时,都会生成一个对应的 ReplicaSet,该 ReplicaSet 持有完整的 Pod 模板副本。

关键概念: Deployment → ReplicaSet → Pod。Deployment 负责声明期望状态,ReplicaSet 负责维持实际副本数,Pod 是实际运行容器的工作负载单元。
组件 职责 关键字段
Deployment 声明期望状态(副本数、更新策略、回滚配置) replicas, strategy, revisionHistoryLimit
ReplicaSet 确保指定数量的 Pod 副本始终运行 replicas, selector, template
Pod 模板 定义 Pod 的容器、卷、标签、资源请求与限制 spec.template.spec.containers, resources
Deployment → ReplicaSet → Pod 层级关系 Deployment ReplicaSet Pod (副本 1) Pod (副本 2) Pod (副本 N) Deployment 通过 ReplicaSet 管理 Pod 副本,每个 ReplicaSet 对应一个版本的 Pod 模板

3.2 滚动更新策略

滚动更新是 Deployment 默认的更新方式,它通过逐步替换旧版本 Pod 来减少服务中断。更新策略由 spec.strategy.rollingUpdate 控制,核心参数包括 maxSurge 和 maxUnavailable。

  • maxSurge:更新期间允许超出期望副本数的最大 Pod 数量(可以是数或百分比)。例如 maxSurge: 25% 表示最多允许超出期望副本数的 25%。
  • maxUnavailable:更新期间允许不可用的最大 Pod 数量。例如 maxUnavailable: 1 表示最多允许 1 个 Pod 不可用。
最佳实践: 对于无状态应用,建议设置 maxSurge: 25% 和 maxUnavailable: 25%,在保证可用性的同时加快更新速度。对于有状态应用,建议使用 maxUnavailable: 0 确保零中断。
滚动更新流程(期望副本数=3) 阶段 1:更新前 v1 v1 v1 阶段 2:启动新 Pod v1 v1 v2 阶段 3:逐步替换 v2 v1 v2 阶段 4:更新完成 v2 v2 v2 滚动更新关键行为 • 先启动新版本 Pod(v2),等待就绪后再终止旧版本 Pod(v1) • maxSurge 控制额外 Pod 数量,maxUnavailable 控制允许中断的 Pod 数量 • 更新过程中新旧 ReplicaSet 同时存在,更新完成后旧 ReplicaSet 副本数缩为 0

3.3 声明式配置与 YAML 清单

Deployment 采用声明式配置模型,用户只需在 YAML 文件中定义期望状态,控制器会自动将实际状态调整为期望状态。以下是一个完整的 Deployment 示例,包含副本数、Pod 模板、资源限制与滚动更新策略。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "250m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
常见陷阱: 如果 spec.selector 与 template.metadata.labels 不匹配,Deployment 将无法管理 Pod。另外,replicas 字段在 HPA(水平 Pod 自动扩缩)启用时会被覆盖,不要同时手动修改。

3.4 声明式配置的优势与操作对比

操作方式 示例命令 适用场景 风险
声明式(推荐) kubectl apply -f deployment.yaml 生产环境、CI/CD 流水线、版本管理 低,YAML 文件可审计、可回滚
命令式 kubectl set image deployment/web-app nginx=nginx:1.26 快速调试、临时变更 中,变更不可追溯,容易覆盖
直接编辑 kubectl edit deployment web-app 紧急修复、单次调整 高,容易误操作,无版本记录
生产建议: 始终将 Deployment YAML 文件纳入 Git 仓库管理,使用 kubectl diff 预览变更后再执行 kubectl apply。对于扩容操作,直接修改 replicas 字段并重新 apply 即可触发 ReplicaSet 调整。

3.5 回滚机制与版本管理

Deployment 默认保留最近 10 个版本的 ReplicaSet 历史记录(由 revisionHistoryLimit 控制)。当滚动更新出现问题时,可以快速回滚到上一个稳定版本。

  • 查看更新历史: kubectl rollout history deployment/web-app
  • 回滚到上一版本: kubectl rollout undo deployment/web-app
  • 回滚到指定版本: kubectl rollout undo deployment/web-app --to-revision=2

回滚操作会创建一个新的 ReplicaSet,其 Pod 模板与目标版本一致,然后执行与滚动更新相同的逐步替换流程。这意味着回滚本身也是一次受控的滚动更新,不会中断服务。

Deployment 版本管理与回滚流程 ReplicaSet v1 ReplicaSet v2 ReplicaSet v3 ReplicaSet v4 回滚操作:kubectl rollout undo deployment/web-app --to-revision=2 回滚会创建新的 ReplicaSet(v5),其 Pod 模板与 v2 一致,然后执行滚动替换

3.6 扩容场景中的 Deployment 行为

当需要增加 Pod 副本数以应对流量增长时,只需修改 spec.replicas 字段。Deployment 会立即更新对应的 ReplicaSet,ReplicaSet 再创建新的 Pod。如果集群节点资源不足,新 Pod 会处于 Pending 状态,等待调度器分配可用节点。

扩容流程: 修改 replicas → Deployment 更新 ReplicaSet → ReplicaSet 创建新 Pod → Scheduler 分配节点 → kubelet 启动容器 → Pod 进入 Running 状态。