kubernetes - Kubernetes API server 如何在一个节点上启动一个新调度的 pod?

标签 kubernetes kubernetes-pod kube-apiserver

关于 kubeletkube-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/

相关文章:

azure - 将 ado 变量传递给 Azure ADO 上的 pv、pvc、配置映射和部署文件

django-celery - Celery 任务在本地运行时在正常关闭时重新排队进入代理,但尽管配置相同但在 kubernetes 中丢失

kubernetes - 如何在部署前将环境变量注入(inject) Kubernetes Pod

kube-apiserver - 重启后 Kubernetes 集群不运行

nginx - gke nginx ingress 创建额外的负载均衡器

kubernetes - 我如何才能批准处于“拒绝”状态的 CSR?

java - 如何使用 k8s-java-client 在同一 k8s 集群上的同一服务的 pod 之间进行通信?

Kubernetes - 准入 webhook - 验证部署中的规模操作

kubernetes - NodePort与kube-apiserver hostPort冲突

kubernetes - 如何使用 Kubernetes 资源的动态输出作为 Pod 中的环境变量?