Pod 排程就緒性

功能狀態: Kubernetes v1.30 [穩定]

Pod 在建立後即被視為已準備好進行排程。Kubernetes 排程器會盡其所能尋找節點來放置所有待處理的 Pod。然而,在真實世界的案例中,有些 Pod 可能會在「miss-essential-resources」狀態中停留很長一段時間。這些 Pod 實際上以不必要的方式攪動排程器(以及叢集自動擴充器等下游整合器)。

透過指定/移除 Pod 的 .spec.schedulingGates,您可以控制 Pod 何時準備好被視為可排程。

配置 Pod schedulingGates

schedulingGates 欄位包含字串清單,每個字串文字都被視為 Pod 在被視為可排程之前應滿足的條件。此欄位只能在建立 Pod 時初始化(由用戶端或在許可期間變更)。建立後,每個 schedulingGate 都可以任意順序移除,但不允許新增新的 schedulingGate。

pod-scheduling-gates-diagram

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

  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)