Pod 调度就绪

功能状态: Kubernetes v1.30 [稳定]

Pod 在创建后就被认为已准备好进行调度。Kubernetes 调度程序尽职尽责地查找节点来放置所有待处理的 Pod。但是,在实际情况下,一些 Pod 可能在很长一段时间内保持 "缺少必要资源" 状态。这些 Pod 实际上在没有必要的情况下让调度程序(以及集群自动缩放器等下游集成器)过度工作。

通过指定/移除 Pod 的 .spec.schedulingGates,您可以控制何时将 Pod 视为准备好进行调度。

配置 Pod schedulingGates

schedulingGates 字段包含一个字符串列表,每个字符串文字都被视为 Pod 应该满足的条件,只有满足这些条件后才能被认为是可调度的。此字段只能在 Pod 创建时(由客户端创建或在准入期间被修改)初始化。创建后,可以以任意顺序移除每个 schedulingGate,但禁止添加新的 schedulingGate。

pod-scheduling-gates-diagram

图. Pod SchedulingGates

用法示例

要将 Pod 标记为不准备进行调度,您可以使用一个或多个 schedulingGates 创建它,如下所示

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  schedulingGates:
  - name: example.com/foo
  - name: example.com/bar
  containers:
  - name: pause
    image: registry.k8s.io/pause:3.6

在 Pod 创建后,您可以使用以下命令检查其状态

kubectl get pod test-pod

输出显示它处于 SchedulingGated 状态

NAME       READY   STATUS            RESTARTS   AGE
test-pod   0/1     SchedulingGated   0          7s

您还可以通过运行以下命令检查其 schedulingGates 字段

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

输出为

[{"name":"example.com/foo"},{"name":"example.com/bar"}]

要通知调度程序此 Pod 已准备好进行调度,您可以通过重新应用修改后的清单来完全删除其 schedulingGates

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: pause
    image: registry.k8s.io/pause:3.6

您可以通过运行以下命令检查 schedulingGates 是否已清除

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

预期输出为空。您可以通过运行以下命令检查其最新状态

kubectl get pod test-pod -o wide

鉴于 test-pod 未请求任何 CPU/内存资源,预期此 Pod 的状态将从之前的 SchedulingGated 过渡到 Running

NAME       READY   STATUS    RESTARTS   AGE   IP         NODE
test-pod   1/1     Running   0          15s   10.0.0.4   node-2

可观察性

指标 scheduler_pending_pods 附带一个新的标签 "gated",用于区分 Pod 是否已尝试调度但被认定为不可调度,或者被明确标记为不准备进行调度。您可以使用 scheduler_pending_pods{queue="gated"} 检查指标结果。

可变 Pod 调度指令

当 Pod 具有 schedulingGates 时,您可以修改其调度指令,但要遵守某些限制。总的来说,您只能收紧 Pod 的调度指令。换句话说,更新后的指令将导致 Pod 只能被调度到其先前匹配的节点子集上。更具体地说,更新 Pod 调度指令的规则如下

  1. 对于 .spec.nodeSelector,只允许添加。如果不存在,则允许设置。

  2. 对于 spec.affinity.nodeAffinity,如果为 nil,则允许设置任何内容。

  3. 如果 NodeSelectorTerms 为空,则允许设置。如果非空,则只允许在 matchExpressionsfieldExpressions 中添加 NodeSelectorRequirements,并且不允许对现有的 matchExpressionsfieldExpressions 进行任何更改。这是因为 .requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms 中的条款是通过 OR 连接的,而 nodeSelectorTerms[].matchExpressionsnodeSelectorTerms[].fieldExpressions 中的表达式是通过 AND 连接的。

  4. 对于 .preferredDuringSchedulingIgnoredDuringExecution,允许进行所有更新。这是因为首选条款没有权威性,因此策略控制器不会验证这些条款。

下一步

上次修改时间为 2024 年 2 月 20 日 下午 5:24 PST:将 PodSchedulingReadiness 功能提升到稳定状态 (42af37b091)