Kubernetes Deployment 基础:ReplicaSet、Pod 模板、更新策略

Deployment 是 Kubernetes 中用于声明式管理 Pod 和 ReplicaSet 的核心资源对象。理解其底层组件与更新策略,是掌握滚动更新与证书轮换协同方案的前提。本节将深入剖析 Deployment 的三层结构:ReplicaSet、Pod 模板与更新策略。

1. Deployment 的三层架构

Deployment 并不直接管理 Pod,而是通过 ReplicaSet 间接控制 Pod 的副本数量与版本。这种分层设计实现了版本控制与回滚能力。

Deployment 三层架构与版本关系 Deployment ReplicaSet v1 (rs-v1) ReplicaSet v2 (rs-v2) Pod v1-1 Pod v1-2 Pod v1-3 Pod v2-1 Pod v2-2 说明:Deployment 通过 .spec.revisionHistoryLimit 保留历史 ReplicaSet,支持一键回滚到任意旧版本

2. ReplicaSet:版本控制的基石

ReplicaSet 负责确保指定数量的 Pod 副本始终运行。每次 Deployment 更新(如镜像版本变更)都会创建一个新的 ReplicaSet,旧的 ReplicaSet 则被保留(默认保留 10 个版本)。

属性 说明 典型值
replicas 期望运行的 Pod 副本数 3、5、10
selector 标签选择器,用于匹配所管理的 Pod matchLabels: { app: nginx, version: v1 }
template Pod 模板,定义 Pod 的容器、卷、环境变量等 包含 image、ports、env 等字段
revisionHistoryLimit 保留的历史 ReplicaSet 数量 10(默认)
关键认知:ReplicaSet 的 selector 一旦创建不可修改。因此 Deployment 每次更新都会生成新的 ReplicaSet,而不是修改旧的。这是实现版本隔离和回滚的基础。

3. Pod 模板:定义运行时的蓝图

Pod 模板是 Deployment 中定义 Pod 规格的核心部分,位于 .spec.template 字段下。模板中的任何变更(如镜像标签、环境变量、挂载卷)都会触发 Deployment 的更新流程。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:                    # <-- Pod 模板开始
    metadata:
      labels:
        app: webapp
        version: "1.0.0"
    spec:
      containers:
      - name: app
        image: myapp:1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: CERT_PATH
          value: "/etc/certs"
        volumeMounts:
        - name: tls-certs
          mountPath: "/etc/certs"
          readOnly: true
      volumes:
      - name: tls-certs
        secret:
          secretName: app-tls-20240101
证书轮换场景提示:当证书 Secret 更新时,Pod 模板中的 secretName 或 mountPath 通常不变。但若证书格式或路径发生变化,则必须通过修改 Pod 模板来触发滚动更新,使新 Pod 挂载新证书。

4. 更新策略:Recreate vs RollingUpdate

Deployment 支持两种更新策略,通过 .spec.strategy.type 指定。选择哪种策略直接影响服务的可用性和证书轮换的平滑度。

策略 行为描述 适用场景 对证书轮换的影响
Recreate 先删除所有旧 Pod,再创建新 Pod 开发环境、允许短暂停服的应用 证书切换期间服务完全不可用,适合非关键证书更新
RollingUpdate 逐步替换旧 Pod,保持一定数量的 Pod 可用 生产环境、要求零停机的高可用服务 证书逐步生效,新旧 Pod 可能同时存在,需确保新旧证书均有效

4.1 RollingUpdate 参数详解

RollingUpdate 策略通过两个关键参数控制更新速率与可用性边界:

  • maxUnavailable:更新过程中允许的最大不可用 Pod 数量(值或百分比)。默认 25%。
  • maxSurge:更新过程中允许超出期望副本数的最大 Pod 数量(值或百分比)。默认 25%。
RollingUpdate 滚动替换流程(replicas=3, maxSurge=1, maxUnavailable=0) Pod v1 (Running) Pod v1 (Running) Pod v1 (Running) Step 1: 初始状态 Pod v1 (Terminating) Pod v1 (Running) Pod v1 (Running) Pod v2 (Pending) Step 2: 创建新 Pod Pod v2 (Running) Pod v1 (Running) Pod v1 (Running) Pod v2 (Running) Step 3: 新 Pod 就绪,继续下一轮

4.2 策略对比与选择建议

对比维度 Recreate RollingUpdate
服务中断时间 全部中断,直到新 Pod 就绪 无中断(若 maxUnavailable=0)
资源消耗峰值 低(仅运行新副本) 较高(新旧副本共存,受 maxSurge 控制)
更新速度 快(一次性替换) 慢(逐步替换,受 readinessProbe 影响)
证书轮换兼容性 新旧证书不共存,需确保新证书立即生效 新旧证书可能同时存在,需设计双证书信任链
回滚复杂度 低(直接切换 ReplicaSet) 低(kubectl rollout undo)
证书轮换关键约束:若使用 RollingUpdate 策略进行证书轮换,必须确保旧 Pod 持有的旧证书与新 Pod 持有的新证书在过渡期内均能被客户端信任。建议采用“双证书签发”或“信任锚点合并”策略,避免新旧 Pod 之间的 TLS 握手失败。

5. 更新策略与版本协同的实践要点

  • 版本标签规范化:Pod 模板中的 version 标签应与镜像标签、证书版本号保持一致,便于 ReplicaSet 的 selector 精确匹配。
  • readinessProbe 配置:滚动更新依赖 Pod 的就绪探针判断新 Pod 是否可用。证书轮换场景下,探针应验证证书加载是否成功。
  • revisionHistoryLimit 调整:证书轮换频繁时,建议增大历史版本保留数(如 20),确保有足够的回滚点。
  • 更新暂停与恢复:使用 kubectl rollout pause 暂停更新,验证新 Pod 的证书状态后再恢复,降低风险。
生产建议:对于证书轮换作业,推荐使用 RollingUpdate 策略,并设置 maxUnavailable: 0、maxSurge: 1,确保每次只替换一个 Pod,最小化影响面。同时配合 preStop 钩子优雅关闭旧连接。