Pod 调度就绪性
Kubernetes v1.30 [stable]
Pod 在被创建后即被视为可调度。Kubernetes 调度器会尽职尽责地寻找节点来放置所有处于 Pending 状态的 Pod。然而,在实际场景中,一些 Pod 可能会长时间处于“缺少必要资源”的状态。这些 Pod 实际上以不必要的方式搅乱了调度器(以及下游集成方,例如 Cluster AutoScaler)。
通过指定/移除 Pod 的 .spec.schedulingGates
,你可以控制 Pod 何时准备好被调度器考虑。
配置 Pod 调度门
schedulingGates
字段包含一个字符串列表,每个字符串字面量都被视为 Pod 在被调度前应满足的条件。此字段只能在 Pod 创建时初始化(由客户端创建或在准入时修改)。创建后,每个调度门可以按任意顺序移除,但禁止添加新的调度门。
图。Pod 调度门
使用示例
要将 Pod 标记为“不可调度”,你可以使用一个或多个调度门创建它,如下所示:
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 具有调度门时,你可以在某些约束下修改其调度指令。总的来说,你只能收紧 Pod 的调度指令。换句话说,更新后的指令将导致 Pod 只能调度到它之前可以匹配的节点子集上。更具体地说,更新 Pod 调度指令的规则如下:
对于
.spec.nodeSelector
,只允许添加。如果不存在,则允许设置。对于
spec.affinity.nodeAffinity
,如果为 nil,则允许设置任何值。如果
NodeSelectorTerms
为空,则允许设置。如果非空,则只允许向matchExpressions
或fieldExpressions
中添加NodeSelectorRequirements
,不允许更改现有的matchExpressions
和fieldExpressions
。这是因为.requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
中的术语是 OR 关系,而nodeSelectorTerms[].matchExpressions
和nodeSelectorTerms[].fieldExpressions
中的表达式是 AND 关系。对于
.preferredDuringSchedulingIgnoredDuringExecution
,允许所有更新。这是因为首选术语不具有权威性,因此策略控制器不会验证这些术语。
下一步
- 请阅读 PodSchedulingReadiness KEP 了解更多详细信息。