Kubernetes - API Server / etcd 如何知道每个 Pod 的状态?

Kubernetes - How does API Server / etcd know the status of each Pod?

我了解 kubelet 负责获取 PodSpec(通常来自 API 服务器)和 运行 Pod。

Kubernetes Components > Node Components > kubelet

"The kubelet takes a set of PodSpecs that are provided through various mechanisms and ensures that the containers described in those PodSpecs are running and healthy."

但是 API 服务器如何跟踪每个 Pod 的状态(例如 运行 / 失败)? kubelet 是否定期向 API 服务器发送请求?还是 API 服务器定期轮询 kubelet?或者其他一些机制?

kubelet 在节点上做所有事情。创建 pod 的典型过程如下:

  1. 默认情况下,kubelet 通过这个名为 watch 的 "thing" 连接到 api-server。这是一种 pub/sub。因此 kubelet 将订阅 "create pod" 事件,并且 api-server 会在需要创建 pod 时通知它。
  2. kubelet 将获取容器运行时(docker 或 rkt)以及其他 pod 规范,并创建 pod。

注意:这里涉及到更多组件,例如调度程序和控制器管理器(在您的 post 中作为各种机制提到),但我将跳过它们。

  1. kubelet 将进行必要的活性和就绪探测,并将状态报告回 api-server。说成功!
  2. api-server 将更新 etcd(通过添加 pod 的元数据)以跟踪集群中发生的事情。

此时kubelet将负责这个pod。如果 pod 宕机,kubelet 会报告 api-server,api-server 会发出杀死 pod 的命令,启动一个新的 pod,并再次更新 etcd server。

需要指出的一点是,k8s 中的所有组件都直接与 api-server 通信。所以,controller manager 或 scheduler 不会告诉 kubelet 做什么。相反,他们对 api-server 说,api-server 对 kubelet 说。