当我们使用命令 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://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9142