共计 817 个字符,预计需要花费 3 分钟才能阅读完成。
整体流程
APIServer 接管到删除 Pod 的申请后:
- 首先,批改 etcd 中的状态;
-
而后,把删除 pod 的事件,告诉给 kubelet 和 endpoint-controller;
- kubelet: 负责 pod 资源的删除;
- endpoint-controller: 负责 endpoint 资源的删除;
- 两个组件并行执行;
Kubelet 解决 pod 敞开
kubelet 敞开 pod 的时候,会敞开 pod 中的每一个容器;kubelet 给容器肯定的工夫 (TerminationGracePeriod) 优雅的进行。
kubelet 终止容器的过程:
- 执行 preStop,期待它执行结束;
- 向容器的过程发送 SIGTERM;
- 期待容器优雅的敞开或超时(terminationGracePeriod);
- 若敞开超时,则发送 SIGKILL 强制敞开;
endpoint-controller 解决 pod 敞开
endpoint-controller 接管到 pod 删除的告诉时,向 APIServer 发送申请,批改 svc 的 endpoints 对象,从 pod 所在 svc 中删除该 pod 的 endpoint。
而后,APIServer 告诉节点上的 kube-proxy 组件,kube-proxy 会批改本机的 iptables/ipvs 规定,将该 endpoint 移除。
Kubelet 和 endpoint-controller 并行执行的问题
kube-proxy 可能因为过载解决申请变慢,会呈现:
kubelet 曾经把容器删除,但 kube-proxy 还未更新 iptables。
这种状况下,流量还会被散发到对应的 endpoint,然而 pod 已删除,客户端返回 ” 连贯回绝 ” 之类的谬误。
目前的解决办法,在 pod 的 preStop 中 sleep 一段时间,期待 kube-proxy 更新 iptables 结束:
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]
参考
- kubernetes in action
正文完
发表至: kubernetes
2021-10-16