📄️ 优雅终止介绍
本文视频教程//www.bilibili.com/video/BV1fu411m73C
📄️ Pod 终止流程
我们先了解下容器在 Kubernetes 环境中的终止流程:
📄️ 业务代码处理 SIGTERM 信号
要实现优雅终止,首先业务代码得支持下优雅终止的逻辑,在业务代码里面处理下 SIGTERM 信号,一般主要逻辑就是"排水",即等待存量的任务或连接完全结束,再退出进程。
📄️ 为什么收不到 SIGTERM 信号?
我们的业务代码通常会捕捉 SIGTERM 信号,然后执行停止逻辑以实现优雅终止。在 Kubernetes 环境中,业务发版时经常会对 workload 进行滚动更新,当旧版本 Pod 被删除时,K8S 会对 Pod 中各个容器中的主进程发送 SIGTERM 信号,当达到超时时间进程还未完全停止的话,K8S 就会发送 SIGKILL 信号将其强制杀死。
📄️ 在 SHELL 中传递信号
在 Kubernetes 中,Pod 停止时 kubelet 会先给容器中的主进程发 SIGTERM 信号来通知进程进行 shutdown 以实现优雅停止,如果超时进程还未完全停止则会使用 SIGKILL 来强行终止。
📄️ 合理使用 preStop
若你的业务代码中没有处理 SIGTERM 信号,或者你无法控制使用的第三方库或系统来增加优雅终止的逻辑,也可以尝试为 Pod 配置下 preStop,在这里面实现优雅终止的逻辑,示例:
📄️ 长连接场景
如果业务是长链接场景,比如游戏、会议、直播等,客户端与服务端会保持着长链接:
📄️ LB 直通 Pod 场景
传统 NodePort 场景