关于 kubelet
和 kube-apiserver< 之间的交互,我试图在“幕后”更好地了解 Kubernetes Pod 调度和创建过程的工作原理
.
我了解 Kubernetes 调度程序选择一个节点来分配新的 pod,并将此通知 API 服务器。但是,我不清楚 API 服务器如何通知相关节点上的 kubelet
启动 pod。 kubelet
中是否有一个查询 API 服务器更改的轮询过程?还是有事件监听/回调类型的交互?
如果有人知道答案或可以指出一些文档的方向,将不胜感激!
最佳答案
阿里巴巴有一个really insightful blog post on the inner workings of the scheduler .来自博客:
调度器基本上是这样工作的:
- 调度器维护一个调度的 podQueue 并监听 APIServer。
- 当我们创建 Pod 时,我们首先通过 APIServer 将 Pod 元数据写入 etcd。
- 调度器通过 Informer 监听 Pod 状态。当添加新的 Pod 时,该 Pod 被添加到 podQueue。
- 主进程不断从podQueue中提取Pod,并为Pod分配节点。
- 调度过程包括两个步骤:筛选匹配节点并根据 Pod 配置(例如,通过资源使用率和亲和性等指标)对这些节点进行优先级排序,从而对节点进行评分并选择得分最高的节点。
- 节点分配成功后,调用apiServer的绑定(bind)pod接口(interface),为分配的pod设置pod.Spec.NodeName。
- 节点上的 kubelet 也监听 ApiServer。如果它发现一个新的 Pod 被调度到该节点,则调用本地 dockerDaemon 来运行容器。
- 如果调度器调度一个Pod失败,如果启用了优先级和抢占,则首先进行抢占尝试,删除节点上优先级低的Pod,将要调度的Pod调度到该节点。如果未启用抢占或抢占尝试失败,则会在日志中记录相关信息,并将Pod添加到podQueue的末尾。
关于 Kubelet 轮询: 实际上,API 服务器支持一种“监视”模式,它使用 WebSocket 协议(protocol)。通过这种方式,Kubelet 会收到主机名等于 Kubelet 主机名的 Pod 的任何更改。
关于kubernetes - Kubernetes API server 如何在一个节点上启动一个新调度的 pod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64260771/