排程框架

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

排程框架是 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.32 [Beta 版]

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

QueueSort

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

PreFilter

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

Filter

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

PostFilter

這些外掛程式在 Filter 階段之後被調用,但僅當沒有為 Pod 找到可行的節點時才調用。外掛程式按照配置的順序調用。如果任何 postFilter 外掛程式將節點標記為 Schedulable,則不會調用剩餘的外掛程式。典型的 PostFilter 實作是搶佔,它試圖透過搶佔其他 Pod 來使 Pod 可排程。

PreScore

這些外掛程式用於執行「預先評分」工作,這會產生一個可共享的狀態供 Score 外掛程式使用。如果 PreScore 外掛程式返回錯誤,則排程週期將中止。

Score

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

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. 批准(approve)
    一旦所有許可外掛程式都批准一個 Pod,它就會被送去綁定。

  2. 拒絕(deny)
    如果任何許可外掛程式拒絕一個 Pod,它就會被退回排程佇列。這將會觸發 Reserve 外掛程式 中的 Unreserve 階段。

  3. 等待(wait)(帶有逾時)
    如果許可外掛程式傳回「等待(wait)」,則 Pod 會被保存在一個內部的「等待中」Pod 清單中,並且此 Pod 的綁定週期會開始,但會直接阻塞,直到它獲得批准。如果發生逾時,等待(wait) 會變成 拒絕(deny),並且 Pod 會被退回排程佇列,從而觸發 Reserve 外掛程式 中的 Unreserve 階段。

PreBind

這些外掛程式用於在 Pod 被綁定之前執行任何必要的工作。例如,pre-bind 外掛程式可能會佈建網路磁碟區,並在允許 Pod 在目標節點上執行之前將其掛載到目標節點上。

如果任何 PreBind 外掛程式傳回錯誤,Pod 會被 拒絕 並退回排程佇列。

Bind

這些外掛程式用於將 Pod 綁定到節點。Bind 外掛程式只有在所有 PreBind 外掛程式都完成後才會被呼叫。每個 bind 外掛程式都會按照配置的順序被呼叫。一個 bind 外掛程式可以選擇是否要處理給定的 Pod。如果一個 bind 外掛程式選擇處理一個 Pod,剩餘的 bind 外掛程式將會被跳過

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 或更高版本,您可以將一組外掛程式配置為排程器設定檔,然後定義多個設定檔以適應各種類型的工作負載。在 多個設定檔 中了解更多資訊。

上次修改時間:2024 年 11 月 12 日 11:26 AM PST:fix: modify the note on the concept page (3847493bfd)