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

Kubernetes API服务器如何在节点上启动新调度的pod?,kubernetes,kubernetes-pod,kube-apiserver,Kubernetes,Kubernetes Pod,Kube Apiserver,我试图更好地了解Kubernetes吊舱调度和创建过程的“幕后”运作方式,即kubelet和kube apiserver之间的交互 我知道Kubernetes调度器选择一个节点来分配一个新的pod,并将此通知API服务器。但是,我不清楚API服务器如何通知相关节点上的kubelet启动pod。kubelet中是否有查询API服务器更改的轮询过程?或者是否存在事件侦听器/回调类型的交互 如果有人知道答案,或者能为我指出一些文档的方向,我将不胜感激 回答时没有源代码链接,但我确信kubelet的工作

我试图更好地了解Kubernetes吊舱调度和创建过程的“幕后”运作方式,即
kubelet
kube apiserver
之间的交互

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


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

回答时没有源代码链接,但我确信
kubelet
的工作原理如下:

  • 列出豆荚
  • 手表
    放在列表上
  • grep pods处于
    PodScheduled
    状态
  • grep pod,其中
    spec.nodeName==$hostname
  • 在每次观看比赛时重复
监视功能继承自etcd(API服务器后面的数据库):。请参见
监视流

Watches are long running requests and use gRPC streams to stream event data.
所以这是一种长时间的投票。

阿里巴巴有一个好的选择。从博客:


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

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


在Kubelet轮询上:实际上,API服务器支持“监视”模式,该模式使用WebSocket协议。这样,主机名等于Kubelet主机名的POD的任何更改都会通知Kubelet。

非常感谢您的回复。对watch streams功能非常感兴趣。不客气!一定要利用它,它从一开始就存在,所以它在库伯内特斯是一种非常成熟和广泛使用的方法。
Watches are long running requests and use gRPC streams to stream event data.