公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !

当我们使用命令 kubectl delete pod
,Pod 就会被删除,端点控制器会从服务和 etcd 中移除其 IP 地址和端口(端点)。
你可以使用 kubectl describe service
命令来观察这个过程。

但这还不够!
有几个组件同步本地的端点列表:
kube-proxy 保留了一个本地的端点列表,用于编写 iptables 规则。
CoreDNS 使用端点来重新配置 DNS 条目。
对于 Ingress 控制器、Istio 等也是如此。

所有这些组件都会(最终)移除之前的端点,以便再也没有流量可以到达它。同时,kubelet 也会被通知更改并删除 Pod。
那么,当 kubelet 在其他组件之前删除 Pod 时会发生什么呢?

不幸的是,你会经历停机时间,因为像 kube-proxy、CoreDNS、ingress 控制器等组件仍然使用该 IP 地址来路由流量。
那么你能做什么呢?
等待!

如果你在删除 Pod 之前等待足够长的时间,正在进行的流量仍然可以处理的,新的流量可以被分配给其他 Pods。
那么应该如何等待呢?

当 kubelet 删除一个 Pod 时,它会经历以下步骤:
触发
preStop
钩子(如果有的话)。发送
SIGTERM
信号。发送
SIGKILL
信号(30 秒后)。

你可以使用 preStop
钩子来插入人为的延迟。

你可以在你的应用程序中监听 SIGTERM
信号并等待。
此外,你可以在等待结束时优雅地停止进程并退出。
Kubernetes 会给你 30 秒来做这件事(可配置),如下代码所示:

那么你应该等待 10 秒、20 秒还是 30 秒呢?
事实上这并没有统一的答案。
虽然传播端点可能只需要几秒钟,但 Kubernetes 并不保证任何时间,也不保证所有组件都会在同一时间完成。

如果想了解更多相关信息,可以参考下面的一些链接:
https://learnk8s.io/graceful-shutdown
https://freecontent.manning.com/handling-client-requests-properly-with-kubernetes/
https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of
https://medium.com/tailwinds-navigator/kubernetes-tip-how-to-gracefully-handle-pod-deletion-b28d23644ccc
https://medium.com/flant-com/kubernetes-graceful-shutdown-nginx-php-fpm-d5ab266963c2
https://www.openshift.com/blog/kubernetes-pods-life
原文链接:https://itnext.io/how-do-you-gracefully-shut-down-pods-in-kubernetes-fb19f617cd67
本文转载自:「k8s技术圈」,原文:https://url.hi-linux.com/0setm,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
GitHub 星标 5.2K Star,这款利器助你轻松管理多种开发环境
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!