滚动升级 & 回滚机制
flowchart TD step1["① 掐入口<br/>把旧版本 v1 readiness 设为 false<br/>新流量不再打到 v1"] --> step2 step2["② 拉新版本 v2<br/>先启动少量 Pod,做健康检查"] --> step3 step3{"健康检查通过?"} -->|否| rollback["暂停或回滚:直接恢复 v1"] step3 -->|是| step4 step4["③ 切流量<br/>Service 逐步把新流量给 v2<br/>旧 Pod 只处理遗留请求"] --> step5 step5["④ 优雅退出旧 Pod<br/>v1 完成在途请求后退出,不再接新流量"] --> step6 step6["⑤ 扩容 v2<br/>按需要增加更多 v2 Pod<br/>最终承接全部流量"] --> done([完成滚动])
- Deployment 控制器先创建新 ReplicaSet,再“加新 Pod、减旧 Pod”,由
maxSurge/maxUnavailable控制并行度。 - Service 通过就绪探针选择可用 Pod,未就绪的新 Pod 不接流量;旧 Pod 缩容前仍保持 Ready。
- 失败时可
kubectl rollout undo deployment/<name>回滚到上一个 revision(旧 ReplicaSet 仍在,只是被缩容到 0)。 - 支持
rollout pause/resume,便于人工验证或观察指标后再继续。
Pod 优雅退出:感知 kill 信号
sequenceDiagram participant Kubelet participant Pod as Pod/Container participant Service Kubelet->>Service: 将 Pod readiness 设为 false(摘流) Service-->>Clients: 不再转发请求到该 Pod Kubelet->>Pod: 发送 SIGTERM Pod->>Pod: 执行 preStop Hook(可睡眠/完成收尾) Pod->>Pod: 停止接收新请求,完成在途请求 Note over Pod: 需在 terminationGracePeriod 内退出 Kubelet-->>Pod: 如超时发送 SIGKILL 强制退出
实现要点:
- 在应用内捕获 SIGTERM,关闭接入、等待在途请求完成,再退出进程。
- 配置
preStopHook(如短暂 sleep 或调用下线接口)和terminationGracePeriodSeconds,确保有足够时间优雅收尾。 readinessProbe失败后会立即摘流,避免在退出过程中继续接新请求。