Kubernetes 滚动发布中的就绪探针与请求排空
滚动发布期间,新 Pod 开始接收流量,旧 Pod 逐步退出服务。旧实例上仍可能存在尚未完成的请求,代理也需要时间更新路由。发布配置需要同时考虑新实例何时接入、流量如何切换,以及旧实例怎样处理完手头的工作。
就绪探针决定何时接流量
readinessProbe 的检查结果表示容器是否准备好接收流量。启动时,必要初始化和预热完成后,探针再返回成功;运行中,也可以用它表达暂时无法服务的状态。就绪探针失败不会直接重启容器,存活探针用于判断是否需要重启恢复。[1] /readyz 应与应用的接流量状态关联,只检查端口已监听容易早于业务准备完成。就绪状态变化影响路由选择,已经进入应用的请求仍由应用继续处理。
退出钩子与应用共用终止预算
正常的宽限终止中,如果配置了 preStop,且宽限期不为零,kubelet 会先执行该钩子,再请求容器运行时发送停止信号。常见默认信号是 SIGTERM,镜像等配置也可能改变它。[2][3] 配置退出流程时,需要核对实际发送的信号以及应用的处理方式。入口脚本还需要正确转发信号,让应用进程有机会执行退出逻辑。
terminationGracePeriodSeconds 是这次终止的时间预算。计时在退出钩子执行前已经开始,钩子耗时与后续进程退出共用这段时间。[3] 例如预算为 60 秒,钩子已占用 40 秒,进程收到信号后的可用时间就会相应缩短。宽限期结束时,仍在运行的容器会进入强制终止流程。[2] 设置预算时,需要把钩子执行、请求排空和资源清理的耗时一起考虑,并保留余量。
端点状态与进程退出并行变化
控制平面更新 EndpointSlice,与节点侧执行钩子、停止进程并行推进。对 Pod 对应的端点,terminating 表达正在终止;通常 ready 相当于“serving 且未 terminating”,因此终止端点的 ready 为 false。服务配置 publishNotReadyAddresses=true 时,ready 则会保持 true。[4] 排查流量切换问题时,需要同时查看端点条件和服务配置。
serving 表达实际可服务状态,对 Pod 端点映射到 Pod 的 Ready 条件。代理通常忽略终止端点,但所有可用端点都在终止等情况下,仍可能利用 serving 继续转发。[4] ready=false 是端点状态,进程是否已经退出、各层网关是否已经停止发送请求,还需要各自的日志和指标确认。
应用负责完成请求排空
应用的退出流程可以分为接流量、排空和退出三个阶段。preStop 可以调用应用提供的管理接口启动排空,应用也可以在收到停止信号后启动排空。管理接口需要由应用实现。排空过程中,应用保留处理在途请求的能力,结合实际代理的传播窗口和连接协议,逐步停止接收新工作,等待活动请求结束,再释放连接池等资源。钩子如果需要等待排空完成,应设置等待上限。
排空需要明确的完成条件。普通接口可以用活动请求数归零表示请求处理结束;涉及异步任务时,还要区分“请求已返回”和“后台工作已完成”。数据库连接、工作线程等资源应在依赖它们的请求完成后再关闭。对于可能长期不结束的任务,需要预先约定截止时间、取消方式及恢复路径,让退出流程有明确的结束边界。
固定等待可以为路由更新预留时间,但端点切片、入口代理、外部负载均衡器和连接缓存的收敛情况仍需观察,慢请求是否完成也需要单独判断。长连接、多路复用流或双向会话需要对应服务器、代理和客户端配合。配置时应核对各层连接与请求超时,并记录进入排空、收到信号、在途归零和进程退出的时间。
用请求结果检查发布过程
验证时,可以持续发送带请求标识的短请求与慢请求,再执行滚动更新,联合观察端点条件、应用退出日志、客户端错误率及延迟。连接复用、钩子超时和请求超出预算也需要覆盖。每次记录请求总数、成功数、失败数与未完成数,便于发现平均延迟之外的少量中断。客户端启用自动重试时,还应保留首次失败的记录,检查重试前发生了什么。
将请求记录与端点变化、应用退出时间对齐,可以判断问题出现在路由切换、请求处理还是退出超时。发布状态和业务请求结果应一起纳入验收,排空参数则根据目标链路的观测结果调整。
参考资料(Kubernetes 官方文档):
[1] Liveness, Readiness, and Startup Probes:https://kubernetes.io/docs/concepts/workloads/pods/probes/
[2] Pod Lifecycle:Pod Termination Flow 与 Stop Signals:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination-flow
[3] Container Lifecycle Hooks:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
[4] EndpointSlices:Conditions:https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/#conditions
- 点赞
- 收藏
- 关注作者
评论(0)