问题描述
就<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
的工作方式如下:
- 列出豆荚https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#list-pod-v1-core
- 将
watch
放在列表中 - 处于
PodScheduled
状态的grep吊舱 - grep豆荚,其中
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.
这是一种长时间的轮询。