kube-scheduler排程擴充套件
Kubernetes 自帶了一個預設排程器kube-scheduler,其內建了很多節點預選和優選的排程演算法,一般排程場景下可以滿足要求。但是在一些特殊場景下,預設排程器不能滿足我們複雜的排程需求。我們就需要對排程器進行擴充套件,以達到排程適合業務場景的目的。
背景
中介軟體redis容器化後,需要兩主不能在同一個節點上,一對主從不能在同一節點上;elasticsearch容器化後,兩個data例項不能在同一節點上。在這類場景下,預設排程器內建的預選、優選演算法不能滿足需求,我們有以下三種選擇:
將新的排程演算法新增到預設排程程式中,並重新編譯映象,最終該映象執行的例項作為kubernetes叢集排程器;
參考kube-scheduler實現滿足自己業務場景的排程程式,並編譯映象,將該程式作為獨立的排程器執行到kubernetes叢集內,需要用該排程器排程的pod例項,在spec.schedulerName裡指定該排程器;
image
實現“排程擴充套件程式“:預設排程器kube-scheduler在進行預選時會呼叫該擴充套件程式進行過濾節點;在優選時會呼叫該擴充套件程式進行給節點打分,或者在bind操作時,呼叫該擴充套件器進行bind操作。
對上述三種方式進行評估:
第一種:將自己的排程演算法新增到預設排程器kube-scheduler中,對原生程式碼侵入性較高,而且隨著kubernetes版本升級,維護成本也較高;
第二種:預設排程器裡內建了很多優秀排程演算法,如:檢查節點資源是否充足;埠是否佔用;volume是否被其他pod掛載;親和性;均衡節點資源利用等,如果完全使用自己開發的排程器程式,可能在達到了實際場景排程需求同時,失去更佳的排程方案,除非整合預設排程器中的演算法到自己獨立排程程式中,但這無疑是不現實的;
第三種:通過啟動引數的policy配置,選用某些預設排程器中的預選、優選排程演算法的同時,也可以呼叫外部擴充套件排程程式的演算法,計算得到最優的排程節點,無需修改kube-scheduler程式碼,只需要在啟動引數中增加配置檔案即可將預設排程程式和擴充套件排程程式相互關聯。
可以參考:
https://github.com/kubernetes...
故採用第三種:實現擴充套件排程程式的方案。
整體架構
image
kube-scheduler在排程pod例項時,首先獲取到Node1、Node2、Node3三個節點資訊,進行預設的預選階段,篩選滿足要求的節點,其次再呼叫擴充套件程式中的預選演算法,選出剩下的節點,假設預選階段Node3上資源不足被過濾掉,預選結束後只剩Node1和Node2;Node1和Node2進入kube-scheduler預設的優選階段進行節點打分,其次再呼叫擴充套件排程程式中的優選演算法進行打分,kube-scheduler會將所有演算法的打分結果進行加權求和,獲得分數最高的節點作為pod最終bind節點,然後kube-scheduler呼叫apiserver進行bind操作。
實現步驟
實現擴充套件排程程式程式碼
編寫擴充套件排程器程式程式碼,根據實際業務排程場景編寫預選邏輯、優選邏輯:
image
實現預選介面,入參為schedulerapi.ExtenderArgs,出參為schedulerapi.ExtenderFilterResult:
image
實現優選介面,入參為schedulerapi.ExtenderArgs,出參為schedulerapi.HostPriorityList:
image
暴露http介面:
image
參考:
https://github.com/ll83744879...
預設排程器部署
由於kubernetes叢集內已經有了一個名為default-scheduler的預設排程器,為了不影響叢集正常排程功能,下面會建立一個名為my-kube-scheduler的排程器,這個排程器和default-scheduler除了啟動引數不一樣外,映象無差別。
1、建立一個名為my-scheduler-config的configmaps,data下的config.yaml檔案指定了排程器的一些引數,包括leader選舉,排程演算法策略的選擇(指定另一個configmaps),以及指定排程器的名稱為my-kube-scheduler。
相應的建立一個my-scheduler-policy的configmaps,裡面指定了選擇哪些預選、優選策略,以及外部擴充套件排程程式的urlPrefix、擴充套件預選URI、擴充套件優選URI、擴充套件pod優先順序搶佔URI、擴充套件bind URI、擴充套件優選演算法的權重等。
以保證my-kube-scheduler和擴充套件排程程式的通訊。
apiVersion: v1
kind: ConfigMap
metadata:
name: my-scheduler-config
namespace: kube-system
data:
config.yaml: |
apiVersion: kubescheduler.config.k8s.io/v1alpha1 kind: KubeSchedulerConfiguration schedulerName: my-kube-scheduler algorithmSource: policy: configMap: namespace: kube-system name: my-scheduler-policy leaderElection: leaderElect: false lockObjectName: my-kube-scheduler lockObjectNamespace: kube-system
apiVersion: v1
kind: ConfigMap
metadata:
name: my-scheduler-policy
namespace: kube-system
data:
policy.cfg : |
{
"kind" : "Policy", "apiVersion" : "v1", "predicates" : [ {"name" : "PodFitsHostPorts"}, {"name" : "PodFitsResources"}, {"name" : "NoDiskConflict"}, {"name" : "MatchNodeSelector"}, {"name" : "HostName"} ], "priorities" : [ {"name" : "LeastRequestedPriority", "weight" : 1}, {"name" : "BalancedResourceAllocation", "weight" : 1}, {"name" : "ServiceSpreadingPriority", "weight" : 1}, {"name" : "EqualPriority", "weight" : 1} ], "extenders" : [{ "urlPrefix": "http://10.168.107.12:80/scheduler", "filterVerb": "predicates/always_true", "prioritizeVerb": "priorities/zero_score", "preemptVerb": "preemption", "bindVerb": "", "weight": 1, "enableHttps": false, "nodeCacheCapable": false }], "hardPodAffinitySymmetricWeight" : 10
}
2、在my-kube-scheduler yaml檔案中將configmaps:my-scheduler-config以檔案的形式掛載到容器內/my-scheduler目錄下,並在啟動引數中指定--config=/my-scheduler/config.yaml,使用和預設排程器一樣的映象。
image
增加掛載:
image
image
擴充套件排程器映象製作和部署
1、編譯擴充套件排程程式my-scheduler-extender映象,以下為Dockerfile:
image
推送my-scheduler-extender映象到harbor:
image
2、建立外部擴充套件程式my-scheduler-extender的deployment,如下為yaml描述:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-scheduler-extender
namespace: kube-system
labels:
app: my-scheduler-extender
spec:
replicas: 1
selector:
matchLabels: app: my-scheduler-extender
template:
metadata: labels: app: my-scheduler-extender spec: containers: - name: my-scheduler-extender image: 192.168.26.46/k8s-deploy/my-scheduler-extender:v1.0 imagePullPolicy: Always livenessProbe: httpGet: path: /version port: 80 readinessProbe: httpGet: path: /version port: 80 ports: - containerPort: 80
驗證
檢視my-kube-scheduler pod日誌,載入到了policy裡的extender資訊,獲取到了擴充套件排程器的介面地址:
image
建立一個nginx的pod,指定schedulerName為my-kube-scheduler:
image
檢視擴充套件排程器pod日誌,發現預設排程器會呼叫extender擴充套件排程器,如下為extender日誌列印的入參、出參:
image
從而可以通過編寫擴充套件排程程式,對預設排程器的預選和優選演算法進行擴充套件。
https://github.com/ll83744879...
最後,csdn資源,收集了海量學習資料,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括java、go、python、springcloud、elk、嵌入式 、大資料、面試資料、前端等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以關注以下公眾號後回覆【2】,獲取。
我是小碗湯,我們一起學習,掃碼關注,精彩內容第一時間推給你
長按掃碼關注一起交流
Docker與... kubernetes Kubernetes
2
小禮物走一走,來簡書關注我
讚賞支援
老公在這裡買翡翠超划算,緬甸天然翡翠!
廣告