Scheduling Framework 是k8s scheduler上的一個結構, 支援自定義調度器Plugin, 這些Plugin可以作為原有調度器的延伸,Scheduling Framework會定義一些擴展點讓用戶可以在Plugin上依照情境搭配多個擴展點使用。
在Pod的調度週期可以分為調度(Scheduling Cycle)和綁定(Binding Cycle)兩個階段, 調度是為了要幫Pod選定一個適合的節點, 綁定則是要將調度的結果通知Cluster, 調度的過程是有順序的, 綁定則是併發的, 如果Pod在調度的過程中發生錯誤則會被放回調度序列重新排隊。
QueueSort: 用在調度序列排序, 一次只有一個調度器Plugin可以運作PreFilter: 在Pod調度前先對cluster或pod進行的檢查, 一個調度週期只會做一次, 如果檢查失敗會中斷調度Filter: 過濾不能運行Pod的節點PostFilter: 節點預選後調用的, 可以用來記錄logPreScore: 預先針對調度節點打分數, 如果檢查失敗會中斷調度Score: 根據配置的權重針對調度節點打分數NormalizeScore: 在結算節點排名之前修改節點分數, 如果檢查失敗會中斷調度Reserve: 為防止資源競爭需要先幫選定的Pod預留節點上的資源Permit: 針對Pod綁定前檢查或是延遲Pod綁定
Unreserve
deny的流程PreBind: 在Pod綁定到節點之前執行Bind: 在所有PreBind都執行完後才執行PostBind: Pod成功綁定後才執行, 是綁定(Binding Cycle)的最後一個擴展點Unreserve: Pod保留後被拒絕才會執行調度器一次只處理一個調度週期,在下一個調度開始之前會先確認所有包含Reserve在內的擴展點都已經完成, Plugin API必須要對調度器註冊並依照配置文件配置初始化內容才能使用擴展點接口, 在調度器的配置中大部分的Plugin都是啟用的。
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
}
// ...
今天就這樣。