当我们使用命令 kubectl delete pod,Pod 就会被删除,端点控制器会从服务和 etcd 中移除其 IP 地址和端口(端点)。
你可以使用 kubectl describe service 命令来观察这个过程。
但这还不够!
有几个组件同步本地的端点列表:
对于 Ingress 控制器、Istio 等也是如此。
所有这些组件都会(最终)移除之前的端点,以便再也没有流量可以到达它。同时,kubelet 也会被通知更改并删除 Pod。
那么,当 kubelet 在其他组件之前删除 Pod 时会发生什么呢?
不幸的是,你会经历停机时间,因为像 kube-proxy、CoreDNS、ingress 控制器等组件仍然使用该 IP 地址来路由流量。
那么你能做什么呢?
等待!
如果你在删除 Pod 之前等待足够长的时间,正在进行的流量仍然可以处理的,新的流量可以被分配给其他 Pods。
那么应该如何等待呢?
当 kubelet 删除一个 Pod 时,它会经历以下步骤:
你可以使用 preStop 钩子来插入人为的延迟。
你可以在你的应用程序中监听 SIGTERM 信号并等待。
此外,你可以在等待结束时优雅地停止进程并退出。
Kubernetes 会给你 30 秒来做这件事(可配置),如下代码所示:
那么你应该等待 10 秒、20 秒还是 30 秒呢?
事实上这并没有统一的答案。
虽然传播端点可能只需要几秒钟,但 Kubernetes 并不保证任何时间,也不保证所有组件都会在同一时间完成。
如果想了解更多相关信息,可以参考下面的一些链接:
原文链接:
https://itnext.io/how-do-you-gracefully-shut-down-pods-in-kubernetes-fb19f617cd67
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。