3

我试图更好地了解 Kubernetes Pod 调度和创建过程的工作原理,以及 和 之间的kubelet交互kube-apiserver

我知道 Kubernetes 调度程序选择一个节点来分配一个新的 pod 并通知 API 服务器。但是,我不清楚 API 服务器如何通知相关kubelet节点上的 pod 启动。是否有轮询过程kubelet查询 API 服务器的更改?还是有事件监听/回调类型交互?

如果有人知道答案或可以指出我将不胜感激的一些文档的方向!

4

2 回答 2

3

阿里巴巴有一篇关于调度程序内部工作原理的非常有见地的博客文章。来自博客:


调度器基本上是这样工作的:

  • 调度器维护一个调度的 podQueue 并监听 APIServer。
  • 我们在创建 Pod 时,首先通过 APIServer 将 Pod 元数据写入 etcd。
  • 调度器通过 Informer 监听 Pod 状态。添加新 Pod 时,会将 Pod 添加到 podQueue。
  • 主进程不断地从 podQueue 中提取 Pod,并将节点分配给 Pod。
  • 调度过程包括两个步骤:过滤匹配节点并根据 Pod 配置(例如,通过资源使用和亲和性等指标)对这些节点进行优先级排序,以对节点进行评分并选择得分最高的节点。
  • 节点分配成功后,调用apiServer的绑定pod接口,将pod.Spec.NodeName设置为分配的pod。
  • 节点上的 kubelet 也会监听 ApiServer。如果它发现一个新的 Pod 被调度到该节点,则调用本地 dockerDaemon 来运行容器。
  • 如果调度器调度 Pod 失败,如果启用了优先级和抢占,首先进行抢占尝试,删除节点上低优先级的 Pod,将要调度的 Pod 调度到该节点。如果未启用抢占或抢占尝试失败,相关信息将记录在日志中,并将 Pods 添加到 podQueue 的末尾。

关于 Kubelet 轮询:实际上,API 服务器支持“监视”模式,它使用 WebSocket 协议。通过这种方式,Kubelet 会收到主机名与 Kubelet 主机名相同的 Pod 的任何更改通知。

于 2020-10-08T12:44:09.667 回答
2

在没有源代码链接的情况下回答,但我肯定会kubelet这样工作:

Query Parameters
...
watch   Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

监视功能继承自 etcd(API 服务器背后的数据库):https ://etcd.io/docs/v3.2.17/learning/api/ 。见Watch streams

Watches are long running requests and use gRPC streams to stream event data.

所以这是一种长轮询。

于 2020-10-08T12:27:05.017 回答