微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

<td> <mat-form-field> <mat-label>Name</mat-label> <input matInput placeholder="Name" formControlName="name" autocomplete="off" required> </mat-form-field> <mat-error *ngIf="form.controls['name'].hasError('invalidName')"> Special characters not allowed! </mat-error> </td> kubelet间的交互作用而言,我试图更好地了解Kubernetes Pod的调度和创建过程如何工作。

我知道Kubernetes调度程序会选择一个节点来分配新的Pod并将此通知API服务器。但是,我不清楚API服务器如何通知有关节点上的kube-apiserver来启动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中提取Pods并将节点分配给Pods。
  • 调度过程包括两个步骤:筛选匹配的节点,并根据Pod配置(例如,通过诸如资源使用和亲和力等度量标准)对这些节点进行优先级排序,以对节点进行评分并选择评分最高的节点。
  • 成功分配节点后,调用apiServer的绑定pod接口,并将pod.Spec.NodeName设置为已分配的pod。
  • 节点上的kubelet也侦听ApiServer。如果发现有新的Pod已调度到该节点,则将调用本地dockerDaemon来运行容器。
  • 如果调度程序未能调度Pod,并且启用了优先级和抢占功能,则首先进行抢占尝试,删除节点上优先级低的Pod,然后将要调度的Pod调度到该节点。如果未启用抢占或抢占尝试失败,则相关信息将记录在日志中,并且Pod将添加到podQueue的末尾。

关于Kubelet轮询:实际上,API服务器支持使用WebSocket协议的“监视”模式。这样,当主机名等于Kubelet的主机名的Pod发生任何更改时,便会通知Kubelet。

,

没有链接到源代码的答案,但是我确定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.

这是一种长时间的轮询。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。