2. Kubernetes Deployment 基础:资源定义、ReplicaSet、滚动更新与回滚机制

Deployment 是 Kubernetes 中用于声明式管理 Pod 和 ReplicaSet 的核心工作负载资源。它提供了无状态应用的完整生命周期管理能力,包括期望状态维持、滚动更新、版本回滚以及扩缩容。理解 Deployment 的底层机制是进行故障注入与 IDP 隔离验证设计的前提。

2.1 Deployment 资源定义结构

一个标准的 Deployment YAML 清单包含四个主要部分:apiVersion、kind、metadata 和 spec。其中 spec 内部又细分为 replicas、selector、template 和 strategy。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
关键字段说明:
  • replicas:期望运行的 Pod 副本数,控制器会持续确保实际数量与期望一致。
  • selector.matchLabels:标签选择器,必须与 Pod 模板中的标签匹配,用于关联 ReplicaSet。
  • template:Pod 模板,定义了 Pod 的容器、挂载卷、资源限制等规格。
  • strategy:更新策略,默认为 RollingUpdate,也可设置为 Recreate。

2.2 ReplicaSet:Deployment 的编排引擎

Deployment 并不直接管理 Pod,而是通过管理 ReplicaSet 来实现对 Pod 的编排。每个 Deployment 版本对应一个 ReplicaSet,ReplicaSet 负责维持指定数量的 Pod 副本。

核心关系: Deployment → ReplicaSet → Pod。Deployment 控制 ReplicaSet 的创建、缩放和删除;ReplicaSet 控制 Pod 的创建和销毁。
组件 职责 版本关联
Deployment 声明式更新、版本管理、回滚触发 管理多个 ReplicaSet 版本
ReplicaSet Pod 副本数维持、Pod 模板快照 每个版本对应一个 RS
Pod 运行容器实例 由 RS 创建,携带版本标签
Deployment 与 ReplicaSet 层级关系 Deployment ReplicaSet v2 (当前) ReplicaSet v1 (旧) ReplicaSet v0 (历史) Pod (v2) Pod (v2) Pod (v1) Pod (v0) Deployment 保留历史 ReplicaSet 用于回滚,当前 RS 负责运行期望数量的 Pod

2.3 滚动更新机制

滚动更新是 Deployment 的默认更新策略,它通过逐步替换旧版本 Pod 为新版本 Pod 来实现零停机发布。更新过程由两个关键参数控制:maxUnavailable 和 maxSurge。

2.3.1 滚动更新参数

参数 默认值 含义 故障注入关注点
maxUnavailable 25% 更新过程中允许不可用的最大 Pod 数量(值或百分比) 设为 0 可强制要求所有旧 Pod 必须保持可用
maxSurge 25% 更新过程中允许超出期望副本数的最大 Pod 数量 设为 0 可限制资源消耗,但可能阻塞更新

2.3.2 滚动更新流程

  1. 创建新 ReplicaSet:Deployment 控制器检测到 Pod 模板变更,创建新版本的 ReplicaSet。
  2. 扩容新 RS:根据 maxSurge 参数,新 RS 开始创建新版本 Pod。
  3. 缩容旧 RS:新 Pod 进入 Ready 状态后,旧 RS 开始销毁旧版本 Pod。
  4. 迭代直至完成:重复步骤 2-3,直到所有旧 Pod 被替换,新 RS 达到期望副本数。
滚动更新流程(replicas=3, maxSurge=1, maxUnavailable=1) 阶段 1 初始状态 v1 v1 v1 阶段 2 扩容新 RS v1 v1 v2 阶段 3 缩容旧 RS v1 v2 v2 阶段 4 完成 v2 v2 滚动更新关键行为 1. 新 Pod 创建成功后,旧 Pod 才会被销毁(保证可用性) 2. maxSurge=1 允许临时超出 1 个 Pod(3→4),maxUnavailable=1 允许 1 个 Pod 不可用 3. 如果新 Pod 启动失败(CrashLoopBackOff),更新会暂停,旧 Pod 继续运行 4. 可通过 kubectl rollout status 实时观察更新进度 5. 故障注入场景:模拟新 Pod 启动失败、就绪检查延迟、资源不足导致调度失败

2.4 回滚机制

Deployment 的版本管理基于 ReplicaSet 的历史快照。每次更新都会创建一个新的 ReplicaSet,旧的 ReplicaSet 会被保留(默认保留 10 个版本)。回滚操作本质上是将 Deployment 的 Pod 模板恢复到某个历史版本,触发一次新的滚动更新。

2.4.1 回滚触发条件

  • 手动回滚:使用 kubectl rollout undo deployment/<name> 命令。
  • 自动回滚:结合 progressDeadlineSeconds 参数,当更新在指定时间内未完成时,可触发自动回滚(需配合 CI/CD 策略)。
  • 故障注入触发:在混沌工程实验中,通过注入 Pod 故障导致更新失败,验证回滚机制的可靠性。

2.4.2 回滚流程

步骤 操作 ReplicaSet 状态变化
1 执行回滚命令 Deployment 控制器识别目标版本
2 目标 RS 扩容 目标版本的 ReplicaSet 开始创建 Pod
3 当前 RS 缩容 当前版本的 ReplicaSet 开始销毁 Pod
4 更新完成 目标 RS 成为当前版本,旧 RS 保留为历史版本
故障注入验证要点:
  • 验证回滚过程中是否出现 Pod 长时间不可用(maxUnavailable 配置不当)。
  • 验证回滚到不存在的版本时,Deployment 是否保持当前状态不崩溃。
  • 验证回滚期间再次触发更新,Deployment 的版本管理是否一致。
  • 验证历史版本数超过 revisionHistoryLimit 时,旧 RS 是否被正确清理。

2.5 故障注入视角的关键配置

在混沌工程和 IDP 隔离验证设计中,以下 Deployment 配置直接影响故障注入实验的设计和结果分析:

配置项 故障注入影响 推荐实验值
replicas 副本数过少可能导致故障注入后完全不可用 ≥3 以观察部分故障行为
maxUnavailable 设为 0 可强制零停机,但更新速度变慢 0 或 1(根据容错要求)
maxSurge 设为 0 可限制资源峰值,但可能阻塞更新 1 或 25%
progressDeadlineSeconds 超时后标记更新失败,触发回滚策略 60-120s(模拟慢启动场景)
revisionHistoryLimit 限制历史版本数,影响回滚范围 5(平衡存储与回滚能力)
minReadySeconds Pod 就绪后等待时间,影响滚动更新速度 5-10s(模拟就绪延迟)
IDP 隔离验证设计提示: 在 IDP(隔离域)中部署 Deployment 时,建议将 revisionHistoryLimit 设置为较小的值(如 3),以减少跨隔离域的 ReplicaSet 资源残留。同时,通过 progressDeadlineSeconds 设置合理的超时时间,避免故障注入实验导致更新永久阻塞。