背景 很多团队第一次把服务上到 Kubernetes 时,会觉得滚动发布已经帮我们解决了“不中断发布”的问题。
实际上,RollingUpdate 只是开始,不是答案。
线上真正导致发布抖动的,往往是这些细节:
新 Pod 还没准备好就被加进流量 老 Pod 收到 SIGTERM 后立刻退出 长连接请求被中途切断 readiness 和 liveness 配置混乱 ingress、service、应用本身三层状态不同步 想做到真正意义上的零中断,得把整条链路串起来看。
先理解滚动发布到底做了什么 Deployment 默认使用 RollingUpdate 策略,大致过程是:
拉起新 Pod 等新 Pod Ready 逐步减少旧 Pod 直到新版本全部替换完成 一个常见配置如下:
strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 1 这表示:
发布期间不允许可用实例减少 每次最多多起一个新 Pod 它能降低抖动概率,但不能保证应用层面的请求一定不受影响。
Readiness Probe 决定流量什么时候进来 如果只配了 liveness,没有配 readiness,基本等于告诉集群:
“只要进程还活着,就可以接流量。”
这在很多服务里是错的。
比如一个 API 服务启动后还要做这些事情:
加载配置 预热缓存 建立数据库连接池 初始化路由和依赖客户端 在这些动作完成之前,进程虽然活着,但根本不适合接请求。
readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 3 periodSeconds: 5 timeoutSeconds: 1 failureThreshold: 3 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 10 这两个探针不要混用:
...