内容提要
该文章介绍了Kubernetes中的Kueue特性,它可以阻塞Pod的调度创建。文章详细介绍了Kueue的实现原理和整体流程,包括阻塞Pod创建调度、Pod自动关联创建workload、队列执行workload、Pod取消阻塞以及workload状态推进到终态等。
延伸解读
Kueue 与 schedulingGates 的依赖关系
Kueue 实现 Pod 调度阻塞的核心依赖于 Kubernetes 1.27 引入的 schedulingGates 特性。当 Pod 的 spec.schedulingGates 不为空时,Kubernetes 不会调度该 Pod,直到 gates 被移除。Kueue 的 pod_webhook 在 Pod 创建时自动添加名为 kueue.x-k8s.io/admission 的 gate,从而将 Pod 置于 SchedulingGated 状态。这意味着使用 Kueue 需要集群版本至少为 1.27,否则该
从 Pod 到 Workload 的自动关联机制
Kueue 通过 reconciler 监听 Pod 事件,当发现 Pod 需要被接管但没有对应的 Workload 时,会自动创建一个关联的 Workload。这一过程在源码中由 ensureOneWorkload 和 handleJobWithNoWorkload 等函数实现。Workload 创建后,workload_controller 会将其推送到所属的 ClusterQueue 中,由 scheduler 根据优先级和资源额度进行调度。这种自动关联简化了用户操作,但要求 Pod 带有特定的标签(如 ku
调度执行与 Pod 取消阻塞的流程
Kueue 的 scheduler 轮询 ClusterQueue,从队列中 Pop 出待执行的 Workload,并修改其状态为已提交。随后,reconciler 监听到 Workload 状态更新,会移除 Pod 中的 schedulingGates,使 Pod 不再被阻塞,从而被 Kubernetes 正常调度创建。这一流程确保了 Pod 只有在资源得到保证后才会实际运行,避免了资源不足时的无效调度。源码中通过 startJob 和 ungatedPod 等函数实现。
Workload 终态与队列资源状态更新
当 Pod 执行完成或失败后,Kueue 的 reconciler 会监听到该事件,并将关联的 Workload 状态更新为终态(如 WorkloadFinished)。随后,workload_controller 监听到 Workload 状态更新,会同步更新关联的 ClusterQueue 的资源使用状态,释放已占用的资源。这一机制保证了队列资源的准确核算,使得后续 Workload 可以基于最新资源状态进行调度。源码中通过 UpdateStatus 和 cache.UpdateWorkload 等函数实现。
Q&A
Kueue的主要功能是什么?
Kueue的主要功能是阻塞Pod的调度创建,直到满足特定条件。
Kubernetes 1.27版本引入了什么新特性?
Kubernetes 1.27版本引入了schedulingGates特性,允许Pod在特定条件下阻塞调度。
Pod在资源不足时会有什么状态标记?
当资源不足时,Pod的状态会被标记为SchedulingGated。
Kueue是如何处理Pod创建的?
Kueue通过监听Pod创建事件,自动添加schedulingGates值以阻塞Pod调度,并在条件满足时解除阻塞。
workload是如何与Pod关联的?
Kueue的reconciler会在Pod需要接管时自动创建关联的workload。
Kueue如何更新队列资源状态?
Kueue会根据workload的变化自动更新队列资源状态。