Pod 调度就绪
Kubernetes v1.30 [稳定]Pod 创建后就被认为已准备好进行调度。Kubernetes 调度器会尽职尽责地查找节点来放置所有待处理的 Pod。但是,在实际情况下,某些 Pod 可能会长时间处于“缺少必要资源”状态。这些 Pod 实际上会搅动调度器(以及集群自动伸缩器等下游集成器),造成不必要的麻烦。
通过指定/删除 Pod 的 .spec.schedulingGates,您可以控制 Pod 何时准备好被视为可调度。
配置 Pod schedulingGates
schedulingGates 字段包含一个字符串列表,每个字符串字面量都被视为 Pod 在被认为可调度之前应满足的标准。此字段只能在创建 Pod 时初始化(无论是通过客户端,还是在准入期间变异)。创建后,每个 schedulingGate 都可以按任意顺序删除,但不允许添加新的 scheduling gate。
图。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 已准备好进行调度,您可以重新应用修改后的清单完全删除其 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 调度指令的规则如下
对于
.spec.nodeSelector,仅允许添加。如果不存在,则允许设置。对于
spec.affinity.nodeAffinity,如果为 nil,则允许设置任何内容。如果
NodeSelectorTerms为空,则允许设置。如果非空,则仅允许将NodeSelectorRequirements添加到matchExpressions或fieldExpressions,并且不允许更改现有的matchExpressions和fieldExpressions。这是因为.requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms中的术语是 ORed,而nodeSelectorTerms[].matchExpressions和nodeSelectorTerms[].fieldExpressions中的表达式是 ANDed。对于
.preferredDuringSchedulingIgnoredDuringExecution,允许所有更新。这是因为首选术语不是权威的,因此策略控制器不会验证这些术语。
接下来
- 阅读 PodSchedulingReadiness KEP 以获取更多详细信息