3. K8s 更新机制:RollingUpdate 策略详解与参数配置
在 Kubernetes 集群中,RollingUpdate(滚动更新)是 Deployment 默认且最常用的更新策略。它通过逐步替换旧版本 Pod 实例为新版本,实现零停机的应用发布。理解其核心参数 maxSurge 与 maxUnavailable 的配置逻辑,是构建可靠回滚流水线的基础。
3.1 RollingUpdate 核心原理
滚动更新并非一次性销毁所有旧 Pod,而是遵循以下步骤循环执行:
- 启动新 Pod:根据
maxSurge参数,允许超出期望副本数启动新版本 Pod。 - 等待就绪:新 Pod 通过 Readiness Probe 探测后,标记为
Ready。 - 终止旧 Pod:根据
maxUnavailable参数,允许一定数量的旧 Pod 不可用。 - 重复迭代:直到所有旧 Pod 被新 Pod 替换,达到期望副本数。
关键优势: 更新过程中始终维持一定数量的可用 Pod 处理流量,避免服务中断。
3.2 核心参数:maxSurge 与 maxUnavailable
这两个参数共同控制滚动更新的速率和资源占用,直接影响发布的安全性与效率。
| 参数 | 含义 | 默认值 | 配置方式 |
|---|---|---|---|
| maxSurge | 更新过程中,允许超出期望副本数的最大 Pod 数量(或百分比) | 25% | 值(如 2)或百分比(如 30%) |
| maxUnavailable | 更新过程中,允许不可用 Pod 的最大数量(或百分比) | 25% | 值(如 1)或百分比(如 20%) |
3.3 参数配置示例与计算逻辑
假设 Deployment 期望副本数 replicas=10,配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 3 # 允许最多超出 3 个 Pod
maxUnavailable: 2 # 允许最多 2 个 Pod 不可用
template:
# Pod 模板定义
计算规则: 更新期间,总 Pod 数范围 = [期望副本数 - maxUnavailable, 期望副本数 + maxSurge]。
上例中,更新期间 Pod 总数保持在 8 ~ 13 之间。
上例中,更新期间 Pod 总数保持在 8 ~ 13 之间。
3.4 参数配置策略对比
| 场景 | maxSurge | maxUnavailable | 效果 |
|---|---|---|---|
| 快速发布 | 50% | 50% | 快速替换,但可能短暂降低服务容量 |
| 保守发布 | 25% | 0% | 严格保持可用 Pod 数,更新慢但最安全 |
| 资源受限 | 1 | 1 | 逐个替换,对集群资源冲击最小 |
| 金丝雀风格 | 10% | 10% | 小批量验证,适合高风险应用 |
3.5 参数配置避坑指南
- maxUnavailable 为 0 时:必须保证 maxSurge > 0,否则无法启动新 Pod。
- 百分比向下取整:K8s 将百分比转换为值时向下取整,最小为 1。
- 资源配额限制:maxSurge 过大可能导致集群资源不足,Pod 调度失败。
- StatefulSet 差异:StatefulSet 默认使用
OnDelete策略,不支持 RollingUpdate 的 maxSurge/maxUnavailable。
生产建议: 对于关键业务,推荐设置
maxUnavailable: 0 配合 maxSurge: 25%,确保更新期间服务容量不下降,但需预留额外资源。
3.6 更新进度监控与回滚触发
滚动更新过程中,K8s 通过 kubectl rollout status 监控进度。当新 Pod 启动失败或 Readiness 探测超时,更新会暂停。此时可手动触发回滚:
# 查看更新状态
kubectl rollout status deployment/my-app
# 查看更新历史
kubectl rollout history deployment/my-app
# 回滚到上一版本
kubectl rollout undo deployment/my-app
# 回滚到指定版本
kubectl rollout undo deployment/my-app --to-revision=2
3.7 与回滚流水线的集成要点
在 CI/CD 流水线中,RollingUpdate 参数配置直接影响回滚策略的设计:
- 更新历史保留:通过
spec.revisionHistoryLimit控制保留的旧版本数量,默认 10,建议至少保留 5 个版本用于回滚。 - 自动回滚触发:结合
ProgressDeadlineSeconds(默认 600s),超时后自动触发回滚。 - 流水线阶段控制:在 CI/CD 中设置
rollout status --timeout=300s,超时则执行rollout undo。
# 流水线脚本示例:自动回滚
kubectl set image deployment/my-app my-app=my-image:v2
if ! kubectl rollout status deployment/my-app --timeout=300s; then
echo "更新超时,触发回滚"
kubectl rollout undo deployment/my-app
fi
最佳实践: 将 maxSurge 和 maxUnavailable 作为流水线参数化配置,不同环境(dev/staging/prod)使用不同策略,实现灵活可控的发布与回滚。