新聞中心
調(diào)度框架
FEATURE STATE: Kubernetes 1.19 [stable]

臨潼ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
調(diào)度框架是面向 Kubernetes 調(diào)度器的一種插件架構(gòu), 它為現(xiàn)有的調(diào)度器添加了一組新的“插件” API。插件會(huì)被編譯到調(diào)度器之中。 這些 API 允許大多數(shù)調(diào)度功能以插件的形式實(shí)現(xiàn),同時(shí)使調(diào)度“核心”保持簡單且可維護(hù)。
框架工作流程
調(diào)度框架定義了一些擴(kuò)展點(diǎn)。調(diào)度器插件注冊后在一個(gè)或多個(gè)擴(kuò)展點(diǎn)處被調(diào)用。 這些插件中的一些可以改變調(diào)度決策,而另一些僅用于提供信息。
每次調(diào)度一個(gè) Pod 的嘗試都分為兩個(gè)階段,即 調(diào)度周期 和 綁定周期。
調(diào)度周期和綁定周期
調(diào)度周期為 Pod 選擇一個(gè)節(jié)點(diǎn),綁定周期將該決策應(yīng)用于集群。 調(diào)度周期和綁定周期一起被稱為“調(diào)度上下文”。
調(diào)度周期是串行運(yùn)行的,而綁定周期可能是同時(shí)運(yùn)行的。
如果確定 Pod 不可調(diào)度或者存在內(nèi)部錯(cuò)誤,則可以終止調(diào)度周期或綁定周期。 Pod 將返回隊(duì)列并重試。
擴(kuò)展點(diǎn)
下圖顯示了一個(gè) Pod 的調(diào)度上下文以及調(diào)度框架公開的擴(kuò)展點(diǎn)。 在此圖片中,“過濾器”等同于“斷言”,“評分”相當(dāng)于“優(yōu)先級函數(shù)”。
一個(gè)插件可以在多個(gè)擴(kuò)展點(diǎn)處注冊,以執(zhí)行更復(fù)雜或有狀態(tài)的任務(wù)。
隊(duì)列排序
這些插件用于對調(diào)度隊(duì)列中的 Pod 進(jìn)行排序。 隊(duì)列排序插件本質(zhì)上提供 ?less(Pod1, Pod2)? 函數(shù)。 一次只能啟動(dòng)一個(gè)隊(duì)列插件。
PreFilter
這些插件用于預(yù)處理 Pod 的相關(guān)信息,或者檢查集群或 Pod 必須滿足的某些條件。 如果 PreFilter 插件返回錯(cuò)誤,則調(diào)度周期將終止。
Filter
這些插件用于過濾出不能運(yùn)行該 Pod 的節(jié)點(diǎn)。對于每個(gè)節(jié)點(diǎn), 調(diào)度器將按照其配置順序調(diào)用這些過濾插件。如果任何過濾插件將節(jié)點(diǎn)標(biāo)記為不可行, 則不會(huì)為該節(jié)點(diǎn)調(diào)用剩下的過濾插件。節(jié)點(diǎn)可以被同時(shí)進(jìn)行評估。
PostFilter
這些插件在 Filter 階段后調(diào)用,但僅在該 Pod 沒有可行的節(jié)點(diǎn)時(shí)調(diào)用。 插件按其配置的順序調(diào)用。如果任何 PostFilter 插件標(biāo)記節(jié)點(diǎn)為“Schedulable”, 則其余的插件不會(huì)調(diào)用。典型的 PostFilter 實(shí)現(xiàn)是搶占,試圖通過搶占其他 Pod 的資源使該 Pod 可以調(diào)度。
PreScore
這些插件用于執(zhí)行 “前置評分(pre-scoring)” 工作,即生成一個(gè)可共享狀態(tài)供 Score 插件使用。 如果 PreScore 插件返回錯(cuò)誤,則調(diào)度周期將終止。
Score
這些插件用于對通過過濾階段的節(jié)點(diǎn)進(jìn)行排序。調(diào)度器將為每個(gè)節(jié)點(diǎn)調(diào)用每個(gè)評分插件。 將有一個(gè)定義明確的整數(shù)范圍,代表最小和最大分?jǐn)?shù)。 在標(biāo)準(zhǔn)化評分階段之后,調(diào)度器將根據(jù)配置的插件權(quán)重 合并所有插件的節(jié)點(diǎn)分?jǐn)?shù)。
NormalizeScore
這些插件用于在調(diào)度器計(jì)算 Node 排名之前修改分?jǐn)?shù)。 在此擴(kuò)展點(diǎn)注冊的插件被調(diào)用時(shí)會(huì)使用同一插件的 Score 結(jié)果。 每個(gè)插件在每個(gè)調(diào)度周期調(diào)用一次。
例如,假設(shè)一個(gè) ?BlinkingLightScorer ?插件基于具有的閃爍指示燈數(shù)量來對節(jié)點(diǎn)進(jìn)行排名。
func ScoreNode(_ *v1.pod, n *v1.Node) (int, error) {
return getBlinkingLightCount(n)
}然而,最大的閃爍燈個(gè)數(shù)值可能比 ?NodeScoreMax ?小。要解決這個(gè)問題, ?BlinkingLightScorer ?插件還應(yīng)該注冊該擴(kuò)展點(diǎn)。
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 插件返回錯(cuò)誤,則調(diào)度階段將終止。
Note: 希望執(zhí)行“預(yù)保留”工作的插件應(yīng)該使用 NormalizeScore 擴(kuò)展點(diǎn)。
Reserve
Reserve 是一個(gè)信息性的擴(kuò)展點(diǎn)。 管理運(yùn)行時(shí)狀態(tài)的插件(也成為“有狀態(tài)插件”)應(yīng)該使用此擴(kuò)展點(diǎn),以便 調(diào)度器在節(jié)點(diǎn)給指定 Pod 預(yù)留了資源時(shí)能夠通知該插件。 這是在調(diào)度器真正將 Pod 綁定到節(jié)點(diǎn)之前發(fā)生的,并且它存在是為了防止 在調(diào)度器等待綁定成功時(shí)發(fā)生競爭情況。
這個(gè)是調(diào)度周期的最后一步。 一旦 Pod 處于保留狀態(tài),它將在綁定周期結(jié)束時(shí)觸發(fā) ?Unreserve ?插件 (失敗時(shí))或 ?PostBind ?插件(成功時(shí))。
Permit
Permit 插件在每個(gè) Pod 調(diào)度周期的最后調(diào)用,用于防止或延遲 Pod 的綁定。 一個(gè)允許插件可以做以下三件事之一:
- 批準(zhǔn)
- 拒絕
- 等待(帶有超時(shí))
一旦所有 Permit 插件批準(zhǔn) Pod 后,該 Pod 將被發(fā)送以進(jìn)行綁定。
如果任何 Permit 插件拒絕 Pod,則該 Pod 將被返回到調(diào)度隊(duì)列。 這將觸發(fā)?Unreserve ?插件。
如果一個(gè) Permit 插件返回 “等待” 結(jié)果,則 Pod 將保持在一個(gè)內(nèi)部的 “等待中” 的 Pod 列表,同時(shí)該 Pod 的綁定周期啟動(dòng)時(shí)即直接阻塞直到得到 批準(zhǔn)。如果超時(shí)發(fā)生,等待 變成 拒絕,并且 Pod 將返回調(diào)度隊(duì)列,從而觸發(fā) ?Unreserve ?插件。
Note: 盡管任何插件可以訪問 “等待中” 狀態(tài)的 Pod 列表并批準(zhǔn)它們 (查看 FrameworkHandle)。 我們期望只有允許插件可以批準(zhǔn)處于 “等待中” 狀態(tài)的預(yù)留 Pod 的綁定。 一旦 Pod 被批準(zhǔn)了,它將發(fā)送到 ?
PreBind?階段。
PreBind
這些插件用于執(zhí)行 Pod 綁定前所需的所有工作。 例如,一個(gè) PreBind 插件可能需要制備網(wǎng)絡(luò)卷并且在允許 Pod 運(yùn)行在該節(jié)點(diǎn)之前 將其掛載到目標(biāo)節(jié)點(diǎn)上。
如果任何 PreBind 插件返回錯(cuò)誤,則 Pod 將被 拒絕 并且 退回到調(diào)度隊(duì)列中。
Bind
Bind 插件用于將 Pod 綁定到節(jié)點(diǎn)上。直到所有的 PreBind 插件都完成,Bind 插件才會(huì)被調(diào)用。 各 Bind 插件按照配置順序被調(diào)用。Bind 插件可以選擇是否處理指定的 Pod。 如果某 Bind 插件選擇處理某 Pod,剩余的 Bind 插件將被跳過。
PostBind
這是個(gè)信息性的擴(kuò)展點(diǎn)。 PostBind 插件在 Pod 成功綁定后被調(diào)用。這是綁定周期的結(jié)尾,可用于清理相關(guān)的資源。
Unreserve
這是個(gè)信息性的擴(kuò)展點(diǎn)。 如果 Pod 被保留,然后在后面的階段中被拒絕,則 Unreserve 插件將被通知。 Unreserve 插件應(yīng)該清楚保留 Pod 的相關(guān)狀態(tài)。
使用此擴(kuò)展點(diǎn)的插件通常也使用 Reserve。
插件 API
插件 API 分為兩個(gè)步驟。首先,插件必須完成注冊并配置,然后才能使用擴(kuò)展點(diǎn)接口。 擴(kuò)展點(diǎn)接口具有以下形式。
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
}
// ...
插件配置
你可以在調(diào)度器配置中啟用或禁用插件。 如果你在使用 Kubernetes v1.18 或更高版本,大部分調(diào)度 插件 都在使用中且默認(rèn)啟用。
除了默認(rèn)的插件,你還可以實(shí)現(xiàn)自己的調(diào)度插件并且將它們與默認(rèn)插件一起配置。 你可以訪問 scheduler-plugins 了解更多信息。
如果你正在使用 Kubernetes v1.18 或更高版本,你可以將一組插件設(shè)置為 一個(gè)調(diào)度器配置文件,然后定義不同的配置文件來滿足各類工作負(fù)載。
分享文章:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes調(diào)度框架
鏈接分享:http://m.fisionsoft.com.cn/article/dpddijc.html


咨詢
建站咨詢
