4. Deployment 基础回顾:Deployment、ReplicaSet 与滚动更新策略
在深入节点池健康联动之前,必须重新夯实 Deployment 的核心运行机制。Deployment 是 Kubernetes 中管理无状态工作负载的顶层控制器,它通过 ReplicaSet 实现 Pod 副本的精确控制,并通过 滚动更新策略 完成版本切换。理解这三层关系是后续巡检与故障定位的基石。
4.1 三层架构:Deployment → ReplicaSet → Pod
Deployment 并不直接管理 Pod,而是通过 ReplicaSet 进行间接控制。这种分层设计使得版本回滚、扩缩容、滚动更新等操作可以解耦执行。
核心关系: Deployment 负责声明式更新与版本记录;ReplicaSet 负责确保指定数量的 Pod 副本运行;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 滚动更新流程
- 创建新 ReplicaSet: Deployment 根据新模板创建新的 ReplicaSet(v2),初始副本数为 0。
- 扩容新 RS: 按照
maxSurge限制,逐步增加新 ReplicaSet 的副本数。 - 缩容旧 RS: 按照
maxUnavailable限制,逐步减少旧 ReplicaSet(v1)的副本数。 - 健康检查: 新 Pod 通过 Readiness Probe 后,才继续下一批替换。
- 完成: 旧 ReplicaSet 副本数降为 0,新 ReplicaSet 达到期望副本数。
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 历史记录。