4. Deployment 基础回顾:Deployment、ReplicaSet 与滚动更新策略

在深入节点池健康联动之前,必须重新夯实 Deployment 的核心运行机制。Deployment 是 Kubernetes 中管理无状态工作负载的顶层控制器,它通过 ReplicaSet 实现 Pod 副本的精确控制,并通过 滚动更新策略 完成版本切换。理解这三层关系是后续巡检与故障定位的基石。

4.1 三层架构:Deployment → ReplicaSet → Pod

Deployment 并不直接管理 Pod,而是通过 ReplicaSet 进行间接控制。这种分层设计使得版本回滚、扩缩容、滚动更新等操作可以解耦执行。

核心关系: Deployment 负责声明式更新与版本记录;ReplicaSet 负责确保指定数量的 Pod 副本运行;Pod 是实际承载容器的工作负载单元。
Deployment 三层架构关系图 Deployment → ReplicaSet → Pod 三层架构 Deployment ReplicaSet (v1) ReplicaSet (v2) Pod-1 Pod-2 Pod-3 Pod-4 Pod-5 说明:Deployment 通过 .spec.replicas 控制副本数,ReplicaSet 通过 .spec.selector 匹配 Pod 标签

4.2 ReplicaSet 的工作原理

ReplicaSet 的核心职责是 确保集群中运行着指定数量的 Pod 副本。它通过标签选择器(Label Selector)持续监听 Pod 状态,当 Pod 数量不足或超出时,执行创建或删除操作。

组件 字段 说明
副本数 .spec.replicas 期望运行的 Pod 数量,默认 1
标签选择器 .spec.selector 匹配 Pod 标签,决定哪些 Pod 归该 ReplicaSet 管理
Pod 模板 .spec.template 创建 Pod 的模板,包含容器、卷、资源限制等定义
所有者引用 metadata.ownerReferences 标记该 ReplicaSet 属于哪个 Deployment
巡检要点: 当 Pod 频繁重启或无法调度时,应首先检查对应 ReplicaSet 的 status.availableReplicas 与 status.readyReplicas 是否匹配期望值。若不一致,说明副本健康联动出现异常。

4.3 滚动更新策略详解

滚动更新(Rolling Update)是 Deployment 默认的更新方式,它允许以可控速率逐步替换旧版本 Pod,实现零停机发布。核心参数定义在 .spec.strategy.rollingUpdate 中。

4.3.1 关键参数

参数 默认值 含义 影响
maxUnavailable 25% 更新过程中允许不可用的最大 Pod 数量(值或百分比) 值越小,更新越保守,可用性越高
maxSurge 25% 更新过程中允许超出期望副本数的最大 Pod 数量(值或百分比) 值越大,更新速度越快,资源消耗越高

4.3.2 滚动更新流程

  1. 创建新 ReplicaSet: Deployment 根据新模板创建新的 ReplicaSet(v2),初始副本数为 0。
  2. 扩容新 RS: 按照 maxSurge 限制,逐步增加新 ReplicaSet 的副本数。
  3. 缩容旧 RS: 按照 maxUnavailable 限制,逐步减少旧 ReplicaSet(v1)的副本数。
  4. 健康检查: 新 Pod 通过 Readiness Probe 后,才继续下一批替换。
  5. 完成: 旧 ReplicaSet 副本数降为 0,新 ReplicaSet 达到期望副本数。
滚动更新流程示意图 滚动更新流程(maxSurge=1, maxUnavailable=1, replicas=3) 旧 RS (v1) : 3 Pod 新 RS (v2) : 0 Pod 旧 RS (v1) : 3 Pod 新 RS (v2) : 1 Pod 旧 RS (v1) : 2 Pod 新 RS (v2) : 1 Pod 旧 RS : 0 新 RS : 3 滚动更新关键行为 1. 新 Pod 通过 Readiness Probe 后才视为可用,继续下一批替换 2. 更新过程中,总 Pod 数在 [replicas - maxUnavailable, replicas + maxSurge] 之间波动 3. 若新 Pod 启动失败,Deployment 会暂停更新,保留旧版本继续服务 4. 更新历史记录存储在 Deployment 的 .spec.revisionHistoryLimit 中,默认保留 10 个版本

4.4 滚动更新策略配置示例

以下是一个典型的 Deployment YAML 配置,展示了滚动更新策略的完整定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1        # 允许最多 1 个 Pod 不可用
      maxSurge: 1              # 允许最多超出 1 个 Pod
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        readinessProbe:        # 就绪探针,决定 Pod 是否加入 Service
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
常见陷阱: 如果未配置 Readiness Probe,Deployment 会默认 Pod 启动后立即就绪,可能导致滚动更新期间流量路由到尚未完全初始化的 Pod,引发 502 错误。在节点池健康联动场景中,Readiness Probe 是判断 Pod 是否“健康”的第一道关卡。

4.5 版本回滚机制

Deployment 的滚动更新历史记录使得回滚变得简单。每次更新都会生成一个新的 ReplicaSet,旧版本 ReplicaSet 不会被立即删除,而是保留副本数为 0 的状态。

命令 作用
kubectl rollout history deployment/web-app 查看更新历史版本列表
kubectl rollout undo deployment/web-app 回滚到上一个版本
kubectl rollout undo deployment/web-app --to-revision=2 回滚到指定版本号
kubectl rollout status deployment/web-app 查看滚动更新状态
巡检联动: 在节点池部署后,如果新节点上的 Pod 持续 CrashLoopBackOff,应优先执行 kubectl rollout undo 快速回滚,避免故障范围扩大。回滚操作会触发新的滚动更新,复用已有的 ReplicaSet 历史记录。