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 创建,携带版本标签 |
2.3 滚动更新机制
滚动更新是 Deployment 的默认更新策略,它通过逐步替换旧版本 Pod 为新版本 Pod 来实现零停机发布。更新过程由两个关键参数控制:maxUnavailable 和 maxSurge。
2.3.1 滚动更新参数
| 参数 | 默认值 | 含义 | 故障注入关注点 |
|---|---|---|---|
maxUnavailable |
25% | 更新过程中允许不可用的最大 Pod 数量(值或百分比) | 设为 0 可强制要求所有旧 Pod 必须保持可用 |
maxSurge |
25% | 更新过程中允许超出期望副本数的最大 Pod 数量 | 设为 0 可限制资源消耗,但可能阻塞更新 |
2.3.2 滚动更新流程
- 创建新 ReplicaSet:Deployment 控制器检测到 Pod 模板变更,创建新版本的 ReplicaSet。
- 扩容新 RS:根据
maxSurge参数,新 RS 开始创建新版本 Pod。 - 缩容旧 RS:新 Pod 进入 Ready 状态后,旧 RS 开始销毁旧版本 Pod。
- 迭代直至完成:重复步骤 2-3,直到所有旧 Pod 被替换,新 RS 达到期望副本数。
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 设置合理的超时时间,避免故障注入实验导致更新永久阻塞。