擴展Kubernetes Scheduler

轉(zhuǎn)載請注明出處即可腔彰。
所使用源碼k8s源碼為release-1.18

如果對K8s的Scheduler不是很了解,可以先看下Kubernetes Scheduler簡介這篇文章

零、Scheduler擴展簡介

Scheduler的擴展有兩種方式孵构,一種是修改Scheduler的源碼恍飘,編寫調(diào)度和綁定兩個過程的插件。然后將插件注冊梯啤。


k8s目錄

還有一種是通過Extender來進行擴展凛驮, 可以通過http請求調(diào)用自己編寫的extender項目來處理自定義調(diào)度。


image.png

第一種的話条辟,需要修改源碼黔夭,但可以修改的階段比較靈活,而第二種方法羽嫡,處理的階段比較寬泛本姥。
本文主要是通過第二種方式, 首先先構(gòu)建k8s集群,然后構(gòu)建一個用于模擬調(diào)度擴展的項目杭棵。

一溉浙、環(huán)境準(zhǔn)備

需要準(zhǔn)備一個多節(jié)點的k8s集群,如果手上沒有現(xiàn)成的測試集群或者云服務(wù)籍琳。那么可以看kubernetes部署-基于vmware+centos7虛擬機3個節(jié)點這篇文章來搭建一個簡單的集群哩盲。
需要注意的是,本文使用的k8s版本為1.18滓侍,之前那篇文章上為1.17.4蒋川,需要升級。

generic_scheduler.go

需要多節(jié)點的原因如上圖撩笆,僅僅是一個節(jié)點的話捺球,也就無需考慮到底放到哪里了^_^

二夕冲、構(gòu)建項目

所使用的環(huán)境為 Go 1.14版本氮兵,并且配置了go mod。通過go mod來安裝相關(guān)包歹鱼∑唬框架主要使用gin,toml, k8s client等。

# 配置到.bash_profile中或者.zshrc中
export GOPROXY="https://goproxy.cn"
export GO111MODULE=on

因為考慮到大部分開發(fā)都在用Java南片,所以在這里多啰嗦幾句篙悯。
首先創(chuàng)建一個項目文件夾 scheduler-extender
然后進入到文件夾內(nèi)部執(zhí)行g(shù)o mod init scheduler-extender創(chuàng)建go.mod
然后安裝相關(guān)的包

go get github.com/BurntSushi/toml
go get github.com/gin-gonic/gin
go get k8s.io/kube-scheduler

如果安裝成功的話 go.mod如下圖所示,當(dāng)然版本可能會有所不同


go.mod

然后簡單封裝下https://gitee.com/VincentWang/scheduler-extender铃绒,具體extender實現(xiàn)都在這個項目中

項目封裝后鸽照,在看下需要如何接收與返回參數(shù),然后在考慮如果編寫相關(guān)邏輯颠悬。


extender.go

首先看下HTTPExtender的 send 方法, 發(fā)現(xiàn)使用的json格式矮燎,并且args參數(shù)會序列化成json后發(fā)送到自定義的extender服務(wù)中。

send方法有四處調(diào)用赔癌,分別對應(yīng)著诞外,

  • Filter: 在調(diào)度過程中,過濾掉不部署pod的node
  • Preempt: 在資源不足時候灾票,搶占低優(yōu)先級的pod資源峡谊,優(yōu)先保證高優(yōu)先級pod運行
  • Prioritize: node排序,在資源充足時刊苍,選擇"最佳"的node
  • Bind: 綁定階段

在看下具體調(diào)用send方法的地方既们,這里只看下Filter


v1/types.go

其實在上面的四個擴展都有對應(yīng)的傳參和返回值(ExtenderArgs是filter和prioritize兩個階段在共用),在scheduler-extender項目實現(xiàn)時正什,需要分別進行處理啥纸。

我這里的nodes環(huán)境如下。

ip host node role
192.168.179.137 ceph1 master
192.168.179.138 ceph2 master
192.168.179.139 ceph3 master

然后我們來模擬實現(xiàn)一個調(diào)度婴氮,filter階段過濾掉cehp3斯棒,prioritize階段, cehp1的優(yōu)先級高于ceph2, preempt, bind先不實現(xiàn)。實現(xiàn)后主经,理論上部署的pod會部署到ceph1中荣暮。


filter.go

prioritize.go

具體實現(xiàn)邏輯完成后,在ceph3中進行項目部署罩驻,生產(chǎn)環(huán)境中可以部署到k8s中穗酥。

三、Scheduler配置

首先先關(guān)注下如何進行配置鉴腻,才能讓Scheduler去調(diào)用scheduler-extender迷扇。

register.go

首先不穩(wěn)當(dāng)?shù)腶pi版本才會用internal百揭。

const (
    // APIVersionInternal may be used if you are registering a type that should not
    // be considered stable or serialized - it is a convention only and has no
    // special behavior in this package.
    APIVersionInternal = "__internal"
)

然后在看下v1alpha2版本的api爽哎,發(fā)現(xiàn)也可以使用Extenders配置。


register.go

保存以下配置到sched.yaml中, 這個配置可以參考源碼中的KubeSchedulerConfiguration struct器一,在官網(wǎng)沒有搜索到具體的配置項课锌,注意不要使用json的配置,k8s的這個api解析json有些bug。


KubeSchedulerConfiguration
apiVersion: kubescheduler.config.k8s.io/v1alpha2
kind: KubeSchedulerConfiguration
extenders:
  - urlPrefix: http://192.168.179.139/scheduler-extender
    filterVerb: filter
    prioritizeVerb: prioritize
    nodeCacheCapable: true
    enableHttps: false
    weight: 100000
leaderElection:
    leaderElect: true
clientConnection:
    kubeconfig: /etc/kubernetes/scheduler.conf

并將sched.yaml 放到/etc/kubernetesf中渺贤,然后修改/etc/kubernetes/manifests下的kube-scheduler.yaml文件

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
    - --config=/etc/kubernetes/sched.yaml
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    volumeMounts:
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
    - mountPath: /etc/kubernetes/sched.yaml
      name: schedconfig
      readOnly: true
  hostNetwork: true
  priorityClassName: system-cluster-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig
  - hostPath:
      path: /etc/kubernetes/sched.yaml
      type: FileOrCreate
    name: schedconfig
status: {}

主要增加了--config配置以及通過hostPath掛載sched.yaml
可以查看下是否存在配置錯誤

k logs -f kube-scheduler-ceph1 -n kube-system

log

修改過kube-scheduler.yaml后雏胃,k8s會自動重啟pod,但是需要將3個節(jié)點的配置都修改下才行志鞍。

四瞭亮、驗證自定義調(diào)度是否有效

上面小節(jié)的步驟都完成后,嘗試部署一個簡單的pod固棚。
在執(zhí)行指令前统翩,一定要確保scheduler-extender程序是在運行的。


scheduler-extender
kubectl run kubia --image=luksa/kubia --port=8080

在執(zhí)行后, 查看po的狀態(tài)

kubectl get po
kubia

這里我們也可以看到scheduler-extender也存在對應(yīng)的請求


scheduler-extender請求

最后看下是否部署到了ceph1節(jié)點

kubectl descibe po kubia
descibe po

DONE此洲,大功告成厂汗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呜师,隨后出現(xiàn)的幾起案子娶桦,更是在濱河造成了極大的恐慌,老刑警劉巖汁汗,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衷畦,死亡現(xiàn)場離奇詭異,居然都是意外死亡知牌,警方通過查閱死者的電腦和手機霎匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送爸,“玉大人铛嘱,你說我怎么就攤上這事∠В” “怎么了墨吓?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纹磺。 經(jīng)常有香客問我帖烘,道長,這世上最難降的妖魔是什么橄杨? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任秘症,我火速辦了婚禮,結(jié)果婚禮上式矫,老公的妹妹穿的比我還像新娘乡摹。我一直安慰自己,他們只是感情好采转,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布聪廉。 她就那樣靜靜地躺著瞬痘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪板熊。 梳的紋絲不亂的頭發(fā)上框全,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音干签,去河邊找鬼津辩。 笑死,一個胖子當(dāng)著我的面吹牛容劳,可吹牛的內(nèi)容都是我干的丹泉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鸭蛙,長吁一口氣:“原來是場噩夢啊……” “哼摹恨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娶视,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晒哄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肪获,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝凌,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年孝赫,在試婚紗的時候發(fā)現(xiàn)自己被綠了较木。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡青柄,死狀恐怖伐债,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情致开,我是刑警寧澤峰锁,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站双戳,受9級特大地震影響虹蒋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飒货,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一魄衅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塘辅,春花似錦晃虫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毅访。三九已至沮榜,卻和暖如春盘榨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟆融。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工草巡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人型酥。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓山憨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弥喉。 傳聞我的和親對象是個殘疾皇子郁竟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359