排程框架

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

排程框架是 Kubernetes 排程器的可插拔架構。它包含一組直接編譯到排程器中的“外掛”API。這些 API 允許將大多數排程功能作為外掛實現,同時保持排程“核心”輕量級且易於維護。有關框架設計的更多技術資訊,請參閱排程框架設計提案

框架工作流

排程框架定義了一些擴充套件點。排程器外掛註冊以在一個或多個擴充套件點被呼叫。其中一些外掛可以改變排程決策,有些則僅提供資訊。

每次嘗試排程一個 Pod 都分為兩個階段:排程週期繫結週期

排程週期和繫結週期

排程週期為 Pod 選擇一個節點,繫結週期將該決策應用到叢集。排程週期和繫結週期統稱為“排程上下文”。

排程週期序列執行,而繫結週期可以併發執行。

如果 Pod 被確定為不可排程或發生內部錯誤,則排程或繫結週期可以中止。Pod 將返回佇列並重試。

介面

下圖顯示了 Pod 的排程上下文以及排程框架公開的介面。

一個外掛可以實現多個介面來執行更復雜或有狀態的任務。

某些介面與可以透過排程器配置配置的排程器擴充套件點相匹配。

排程框架擴充套件點

PreEnqueue(入隊前)

這些外掛在 Pod 被新增到內部活動佇列(Pod 被標記為準備好排程)之前被呼叫。

只有當所有 PreEnqueue 外掛都返回 Success 時,Pod 才被允許進入活動佇列。否則,它將被放入內部不可排程 Pod 列表,並且不會獲得 Unschedulable 條件。

有關內部排程器佇列如何工作的更多詳細資訊,請閱讀kube-scheduler 中的排程佇列

EnqueueExtension(入隊擴充套件)

EnqueueExtension 是外掛可以根據叢集中的變化控制是否重試排程被此外掛拒絕的 Pod 的介面。實現 PreEnqueue、PreFilter、Filter、Reserve 或 Permit 的外掛應該實現此介面。

QueueingHint(入隊提示)

特性狀態: Kubernetes v1.34 [穩定] (預設啟用:true)

QueueingHint 是一個回撥函式,用於決定 Pod 是否可以重新排入活動佇列或退避佇列。它在叢集中發生某種型別的事件或變化時執行。當 QueueingHint 發現事件可能使 Pod 可排程時,Pod 將被放入活動佇列或退避佇列,以便排程器將重試 Pod 的排程。

QueueSort(佇列排序)

這些外掛用於在排程佇列中對 Pod 進行排序。佇列排序外掛本質上提供了一個 Less(Pod1, Pod2) 函式。一次只能啟用一個佇列排序外掛。

PreFilter(預過濾)

這些外掛用於預處理 Pod 的資訊,或檢查叢集或 Pod 必須滿足的某些條件。如果 PreFilter 外掛返回錯誤,排程週期將中止。

Filter(過濾)

這些外掛用於過濾掉無法執行 Pod 的節點。對於每個節點,排程器將按照其配置的順序呼叫過濾外掛。如果任何過濾外掛將節點標記為不可行,則不會為該節點呼叫其餘外掛。節點可以併發評估。

PostFilter(後過濾)

這些外掛在過濾階段之後被呼叫,但僅當未找到可行的節點時才被呼叫。外掛按照其配置的順序被呼叫。如果任何 PostFilter 外掛將節點標記為 Schedulable,則不會呼叫其餘外掛。典型的 PostFilter 實現是搶佔,它嘗試透過搶佔其他 Pod 使 Pod 可排程。

PreScore(預打分)

這些外掛用於執行“預打分”工作,為 Score 外掛生成可共享狀態。如果 PreScore 外掛返回錯誤,排程週期將中止。

Score(打分)

這些外掛用於對已透過過濾階段的節點進行排名。排程器將為每個節點呼叫每個打分外掛。將有一個明確定義的整數範圍表示最小和最大分數。在NormalizeScore階段之後,排程器將根據配置的外掛權重組合所有外掛的節點分數。

容量打分

特性狀態: `Kubernetes v1.33 [alpha]`(預設啟用:false)

功能門控 VolumeCapacityPriority 在 v1.32 中用於支援靜態供應的儲存。從 v1.33 開始,新的功能門控 StorageCapacityScoring 取代了舊的 VolumeCapacityPriority 門控,並增加了對動態供應儲存的支援。當 StorageCapacityScoring 啟用時,kube-scheduler 中的 VolumeBinding 外掛被擴充套件,根據每個節點上的儲存容量對節點進行打分。此功能適用於支援儲存容量的 CSI 卷,包括由 CSI 驅動程式支援的本地儲存。

NormalizeScore(標準化打分)

這些外掛用於在排程器計算節點的最終排名之前修改分數。註冊此擴充套件點的外掛將使用同一外掛的Score結果進行呼叫。每個排程週期每個外掛呼叫一次。

例如,假設一個外掛 BlinkingLightScorer 根據節點有多少閃爍燈來對節點進行排名。

func ScoreNode(_ *v1.pod, n *v1.Node) (int, error) {
    return getBlinkingLightCount(n)
}

但是,閃爍燈的最大計數可能相對於 NodeScoreMax 較小。為了解決這個問題,BlinkingLightScorer 也應該註冊此擴充套件點。

func NormalizeScores(scores map[string]int) {
    highest := 0
    for _, score := range scores {
        highest = max(highest, score)
    }
    for node, score := range scores {
        scores[node] = score*NodeScoreMax/highest
    }
}

如果任何 NormalizeScore 外掛返回錯誤,排程週期將中止。

Reserve(保留)

實現 Reserve 介面的外掛有兩個方法,即 ReserveUnreserve,它們分別支援兩個資訊性排程階段:Reserve 和 Unreserve。維護執行時狀態(又稱“有狀態外掛”)的外掛應使用這些階段,以便排程器在為給定 Pod 保留和取消保留節點上的資源時通知它們。

Reserve 階段發生在排程器實際將 Pod 繫結到其指定節點之前。它的存在是為了防止排程器等待繫結成功時出現競態條件。每個 Reserve 外掛的 Reserve 方法可以成功或失敗;如果一個 Reserve 方法呼叫失敗,則後續外掛不會執行,並且 Reserve 階段被視為失敗。如果所有外掛的 Reserve 方法都成功,則 Reserve 階段被視為成功,並執行排程週期的其餘部分和繫結週期。

如果 Reserve 階段或後續階段失敗,則會觸發 Unreserve 階段。此時,所有 Reserve 外掛的 Unreserve 方法將以與 Reserve 方法呼叫相反的順序執行。此階段用於清理與保留 Pod 相關聯的狀態。

Permit(許可)

Permit 外掛在每個 Pod 的排程週期結束時被呼叫,以防止或延遲繫結到候選節點。許可外掛可以執行以下三件事之一:

  1. 批准
    一旦所有許可外掛批准一個 Pod,它就會被髮送進行繫結。

  2. 拒絕
    如果任何許可外掛拒絕一個 Pod,它將返回到排程佇列。這將觸發保留外掛中的 Unreserve 階段。

  3. 等待(帶超時)
    如果許可外掛返回“wait”,則 Pod 將保留在內部“等待”Pod 列表中,並且此 Pod 的繫結週期開始但直接阻塞,直到獲得批准。如果發生超時,等待將變為拒絕,並且 Pod 將返回到排程佇列,觸發保留外掛中的 Unreserve 階段。

PreBind(預繫結)

這些外掛用於在 Pod 繫結之前執行任何所需的工作。例如,預繫結外掛可以在允許 Pod 在目標節點上執行之前預配網路卷並將其掛載到目標節點上。

如果任何 PreBind 外掛返回錯誤,Pod 將被拒絕並返回到排程佇列。

Bind(繫結)

這些外掛用於將 Pod 繫結到節點。在所有 PreBind 外掛完成之前,不會呼叫繫結外掛。每個繫結外掛都按照配置的順序呼叫。繫結外掛可以選擇是否處理給定的 Pod。如果繫結外掛選擇處理一個 Pod,則跳過其餘繫結外掛

PostBind(後繫結)

這是一個資訊性介面。Post-bind 外掛在 Pod 成功繫結後被呼叫。這是繫結週期的結束,可以用於清理相關聯的資源。

外掛 API

外掛 API 有兩個步驟。首先,外掛必須註冊並進行配置,然後它們使用擴充套件點介面。擴充套件點介面具有以下形式。

type Plugin interface {
    Name() string
}

type QueueSortPlugin interface {
    Plugin
    Less(*v1.pod, *v1.pod) bool
}

type PreFilterPlugin interface {
    Plugin
    PreFilter(context.Context, *framework.CycleState, *v1.pod) error
}

// ...

外掛配置

您可以在排程器配置中啟用或停用外掛。如果您使用的是 Kubernetes v1.18 或更高版本,大多數排程外掛預設都已啟用。

除了預設外掛,您還可以實現自己的排程外掛,並將其與預設外掛一起配置。您可以訪問scheduler-plugins獲取更多詳細資訊。

如果您使用的是 Kubernetes v1.18 或更高版本,您可以將一組外掛配置為排程器配置檔案,然後定義多個配置檔案以適應各種型別的工作負載。在多個配置檔案中瞭解更多資訊。

上次修改時間:2025 年 7 月 4 日上午 6:50 PST:KEP-4247:將 SchedulerQueueingHints 功能提升到 GA (e2c0fe17d6)