Pod 调度就绪性

特性状态: Kubernetes v1.30 [稳定]

Pod 创建后即被视为可用于调度。Kubernetes 调度器会尽力找到节点来放置所有待定 Pod。然而,在实际场景中,一些 Pod 可能长时间处于“缺少必要资源”的状态。这些 Pod 实际上以不必要的方式搅动了调度器(以及下游集成者,例如 Cluster AutoScaler)。

通过指定/移除 Pod 的 .spec.schedulingGates 字段,你可以控制 Pod 何时可以被调度器考虑进行调度。

配置 Pod schedulingGates

schedulingGates 字段包含一个字符串列表,每个字符串字面值都被视为 Pod 在被认为可调度之前必须满足的标准。此字段只能在 Pod 创建时初始化(通过客户端或在准入期间修改)。创建后,每个 schedulingGate 可以按任意顺序移除,但禁止添加新的 schedulingGate。

pod-scheduling-gates-diagram

图:Pod SchedulingGates

使用示例

要将 Pod 标记为不可调度,你可以在创建时为其指定一个或多个 scheduling gate,如下所示

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 已准备好进行调度,你可以通过重新应用修改后的 manifest 来完全移除其 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 具有 scheduling gates 的同时,你可以修改 Pod 的调度指令,但存在某些限制。总的来说,你只能收紧 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,允许所有更新。这是因为 preferred terms 不具有权威性,因此策略控制器不会验证这些术语。

接下来

上次修改时间:2024 年 2 月 20 日下午 5:24(太平洋标准时间):将特性 PodSchedulingReadiness 提升到稳定版 (42af37b091)