关于kubernetes:Kubernetes-pod的关闭流程

39次阅读

共计 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"]

参考

  1. kubernetes in action

正文完
 0