Pod 排程就緒性

特性狀態: Kubernetes v1.30 [stable]

Pod 在被建立後即被視為可排程。Kubernetes 排程器會盡職盡責地尋找節點來放置所有處於 Pending 狀態的 Pod。然而,在實際場景中,一些 Pod 可能會長時間處於“缺少必要資源”的狀態。這些 Pod 實際上以不必要的方式攪亂了排程器(以及下游整合方,例如 Cluster AutoScaler)。

透過指定/移除 Pod 的 .spec.schedulingGates,你可以控制 Pod 何時準備好被排程器考慮。

配置 Pod 排程門

schedulingGates 欄位包含一個字串列表,每個字串字面量都被視為 Pod 在被排程前應滿足的條件。此欄位只能在 Pod 建立時初始化(由客戶端建立或在准入時修改)。建立後,每個排程門可以按任意順序移除,但禁止新增新的排程門。

pod-scheduling-gates-diagram

圖。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 排程指令的規則如下:

  1. 對於 .spec.nodeSelector,只允許新增。如果不存在,則允許設定。

  2. 對於 spec.affinity.nodeAffinity,如果為 nil,則允許設定任何值。

  3. 如果 NodeSelectorTerms 為空,則允許設定。如果非空,則只允許向 matchExpressionsfieldExpressions 中新增 NodeSelectorRequirements,不允許更改現有的 matchExpressionsfieldExpressions。這是因為 .requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms 中的術語是 OR 關係,而 nodeSelectorTerms[].matchExpressionsnodeSelectorTerms[].fieldExpressions 中的表示式是 AND 關係。

  4. 對於 .preferredDuringSchedulingIgnoredDuringExecution,允許所有更新。這是因為首選術語不具有權威性,因此策略控制器不會驗證這些術語。

下一步

上次修改於 2024 年 2 月 20 日下午 5:24 PST:將特性 PodSchedulingReadiness 提升為穩定版 (42af37b091)