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 瞭解更多詳細資訊。