Kubernetes API服务器如何在节点上启动新调度的pod



我正试图更好地了解Kubernetes Pod调度和创建过程如何在kubeletkube-apiserver之间进行交互。

我知道Kubernetes调度程序选择一个节点来分配一个新的pod,并通知API服务器这一点。但是,我不清楚API服务器如何通知有问题的节点上的kubelet启动pod。kubelet中是否有查询API服务器以获取更改的轮询过程?或者是否存在事件侦听器/回调类型的交互?

如果有人知道答案,或者能为我指明一些文件的方向,我们将不胜感激!

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


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

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

关于Kubelet轮询:实际上,API服务器支持;手表;模式,该模式使用WebSocket协议。通过这种方式,Kubelet会被通知对主机名等于Kubelet主机名的Pods的任何更改。

在没有链接到源代码的情况下回答,但我确信kubelet的工作原理是这样的:

  • 列表podhttps://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#list-pod-v1核心
  • watch列入列表
  • 处于PodScheduled状态的grep pod
  • grep pod,其中spec.nodeName==$hostname
  • 在每次观看活动中重复
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.

所以这是一种长期的民意调查。

最新更新