Pod 排程就緒性
Kubernetes v1.30 [穩定]
Pod 在建立後即被視為已準備好進行排程。Kubernetes 排程器會盡其所能尋找節點來放置所有待處理的 Pod。然而,在真實世界的案例中,有些 Pod 可能會在「miss-essential-resources」狀態中停留很長一段時間。這些 Pod 實際上以不必要的方式攪動排程器(以及叢集自動擴充器等下游整合器)。
透過指定/移除 Pod 的 .spec.schedulingGates
,您可以控制 Pod 何時準備好被視為可排程。
配置 Pod schedulingGates
schedulingGates
欄位包含字串清單,每個字串文字都被視為 Pod 在被視為可排程之前應滿足的條件。此欄位只能在建立 Pod 時初始化(由用戶端或在許可期間變更)。建立後,每個 schedulingGate 都可以任意順序移除,但不允許新增新的 schedulingGate。
圖. Pod SchedulingGates
使用範例
若要將 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 只能排程在先前可能符合的節點子集上。更具體來說,更新 Pod 排程指令的規則如下
對於
.spec.nodeSelector
,僅允許新增。如果不存在,則允許設定。對於
spec.affinity.nodeAffinity
,如果為 nil,則允許設定任何內容。如果
NodeSelectorTerms
為空,則允許設定。如果非空,則僅允許在matchExpressions
或fieldExpressions
中新增NodeSelectorRequirements
,並且不允許變更現有的matchExpressions
和fieldExpressions
。這是因為.requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
中的條款是進行 OR 運算,而nodeSelectorTerms[].matchExpressions
和nodeSelectorTerms[].fieldExpressions
中的表示式是進行 AND 運算。對於
.preferredDuringSchedulingIgnoredDuringExecution
,允許所有更新。這是因為偏好設定不具權威性,因此策略控制器不會驗證這些條款。
後續步驟
- 請閱讀 PodSchedulingReadiness KEP 以了解更多詳細資訊