3. 滚动更新策略原理:maxSurge、maxUnavailable 参数详解与工作流程
滚动更新(Rolling Update)是 Kubernetes Deployment 默认的更新策略,它通过逐步替换旧 Pod 实例来保证服务在更新期间始终可用。理解 maxSurge 和 maxUnavailable 两个核心参数,是掌握零停机证书轮换的关键。
3.1 核心参数详解
在 Deployment 的 spec.strategy.rollingUpdate 字段下,有两个参数共同控制滚动更新的速率和可用性边界:
| 参数 | 类型 | 默认值 | 含义 | 对证书轮换的影响 |
|---|---|---|---|---|
maxSurge |
整数或百分比 | 25% | 更新期间允许超出期望副本数的最大 Pod 数量 | 控制同时启动的新 Pod 数量,影响证书挂载速度 |
maxUnavailable |
整数或百分比 | 25% | 更新期间允许不可用 Pod 的最大数量 | 控制同时终止的旧 Pod 数量,决定最小可用实例数 |
关键公式:
更新期间最小可用 Pod 数 =
更新期间最大 Pod 总数 =
更新期间最小可用 Pod 数 =
replicas - maxUnavailable更新期间最大 Pod 总数 =
replicas + maxSurge
3.1.1 maxSurge 详解
- 整数模式:例如
maxSurge: 2,表示最多允许超出期望副本数 2 个 Pod。 - 百分比模式:例如
maxSurge: 25%,向上取整。若replicas=10,则允许额外启动 3 个新 Pod。 - 证书轮换场景:较大的
maxSurge可以加速新证书 Pod 的启动,但会消耗更多集群资源。
3.1.2 maxUnavailable 详解
- 整数模式:例如
maxUnavailable: 1,表示最多允许 1 个 Pod 不可用。 - 百分比模式:例如
maxUnavailable: 25%,向下取整。若replicas=10,则允许最多 2 个 Pod 不可用。 - 证书轮换场景:设置为 0 或较小值可保证服务零停机,但更新速度会变慢。
零停机最佳实践: 对于证书轮换这类敏感操作,建议设置
maxUnavailable: 0,确保旧 Pod 全部存活时才开始创建新 Pod。
3.2 滚动更新工作流程
当 Deployment 的 Pod 模板(如挂载的新证书 Secret)发生变化时,Kubernetes 控制器会按照以下步骤执行滚动更新:
- 创建新 ReplicaSet:控制器根据新的 Pod 模板创建 ReplicaSet,初始副本数为 0。
- 扩容新 ReplicaSet:按照
maxSurge的限制,逐步增加新 Pod 的数量。 - 缩容旧 ReplicaSet:在新 Pod 进入
Ready状态后,按照maxUnavailable的限制,逐步删除旧 Pod。 - 健康检查等待:每个新 Pod 必须通过
readinessProbe探测后,才会被视为可用。 - 重复迭代:步骤 2-4 反复执行,直到所有旧 Pod 被替换,新 ReplicaSet 达到期望副本数。
3.3 参数配置示例
以下是一个针对证书轮换优化的 Deployment 配置片段:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多额外启动 1 个新 Pod
maxUnavailable: 0 # 不允许旧 Pod 不可用,保证零停机
template:
spec:
containers:
- name: nginx
image: nginx:1.25
volumeMounts:
- name: tls-certs
mountPath: /etc/nginx/certs
readOnly: true
readinessProbe:
httpGet:
path: /healthz
port: 443
scheme: HTTPS
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: tls-certs
secret:
secretName: tls-certificate
注意: 当
maxUnavailable=0 时,滚动更新会严格等待每个新 Pod 就绪后才删除旧 Pod。如果 readinessProbe 配置不当或证书挂载失败,更新可能会卡住。建议在证书轮换前先验证新 Secret 的有效性。
3.4 滚动更新状态观察
使用以下命令可以实时观察滚动更新的进度:
# 查看更新状态
kubectl rollout status deployment/web-server
# 查看 ReplicaSet 变化
kubectl get rs -l app=web-server -w
# 查看 Pod 逐个替换过程
kubectl get pods -l app=web-server -w
3.5 证书轮换场景的参数推荐
| 场景 | replicas | maxSurge | maxUnavailable | 说明 |
|---|---|---|---|---|
| 严格零停机 | ≥3 | 1 | 0 | 最安全,更新速度较慢,适合生产环境 |
| 快速轮换 | ≥5 | 25% | 1 | 允许少量 Pod 不可用,加速更新 |
| 资源受限 | 2 | 1 | 0 | 最小副本数下的零停机方案 |
证书轮换建议: 对于关键服务的证书更新,推荐使用
maxUnavailable: 0 配合 maxSurge: 1。这样既能保证服务不降级,又能通过逐个替换的方式平稳加载新证书。如果集群资源充足,可以适当增大 maxSurge 来加速轮换过程。