k8s排程演算法原始碼跟讀
簡單來說,k8s中的排程演算法就是給pod分配合適的node節點,具體分兩步:預選、優選。其中預選是指k8s會預設註冊一堆預選演算法,只有某個節點通過所有預選演算法成功執行pod,那麼這個節點才能通過預選,進行下一步優選,這樣經過預選之後會淘汰一大批節點。接下來的優選就是優中選優,首先讓每個節點通過所有優選演算法,得到一個加權分,最後取最高分,即為最優節點,也就是最終執行pod的節點。這裡主要通讀一下排程模組的程式碼邏輯。
- scheduler的入口函式所在檔案E:\dev\golang\k8s\src\k8s.io\kubernetes\cmd\kube-scheduler\scheduler.go
image.png
-
執行上圖中47行程式碼command.Execute()時,對應command中的Run方法會被執行,即下圖中的85行:
image.png
進一步會執行86行的runCommand方法,該方法會跑起一個scheduler。
- 接下來跳進runCommand方法,比較重要的程式碼如下:
image.png
- 繼續往下
image.png
-
再往下
image.png
不難發現,在呼叫ApplyFeatureGates方法之前,會先執行init方法,接下來就是本文的重點。
- init函式先是呼叫registerAlgorithmProvider函式,入參是defaultPredicates()和defaultPriorities(),明顯是註冊預設的預選、優選演算法,我們先關注預選演算法預設有哪14個:
NoVolumeZoneConflictPred MaxEBSVolumeCountPred MaxGCEPDVolumeCountPred MaxAzureDiskVolumeCountPred MaxCSIVolumeCountPred MatchInterPodAffinityPred NoDiskConflictPred GeneralPred CheckNodeMemoryPressurePred CheckNodeDiskPressurePred CheckNodePIDPressurePred CheckNodeConditionPred PodToleratesNodeTaintsPred CheckVolumeBindingPred
接著又註冊了5個預選演算法:
factory.RegisterFitPredicate("PodFitsPorts", predicates.PodFitsHostPorts)//這個只是為了相容舊版本,所以仍舊保留,較新的版本已經用PodFitsHostPorts這個名字取代了PodFitsPorts,也就是下面的一個預選演算法 factory.RegisterFitPredicate(predicates.PodFitsHostPortsPred, predicates.PodFitsHostPorts) factory.RegisterFitPredicate(predicates.PodFitsResourcesPred, predicates.PodFitsResources) factory.RegisterFitPredicate(predicates.HostNamePred, predicates.PodFitsHost) factory.RegisterFitPredicate(predicates.MatchNodeSelectorPred, predicates.PodMatchNodeSelector)
優選:
factory.RegisterPriorityConfigFactory( "ServiceSpreadingPriority", factory.PriorityConfigFactory{ MapReduceFunction: func(args factory.PluginFactoryArgs) (algorithm.PriorityMapFunction, algorithm.PriorityReduceFunction) { return priorities.NewSelectorSpreadPriority(args.ServiceLister, algorithm.EmptyControllerLister{}, algorithm.EmptyReplicaSetLister{}, algorithm.EmptyStatefulSetLister{}) }, Weight: 1, }, ) factory.RegisterPriorityFunction2("EqualPriority", core.EqualPriorityMap, nil, 1) factory.RegisterPriorityFunction2("MostRequestedPriority", priorities.MostRequestedPriorityMap, nil, 1) factory.RegisterPriorityFunction2( "RequestedToCapacityRatioPriority", priorities.RequestedToCapacityRatioResourceAllocationPriorityDefault().PriorityMap, nil, 1)