Kube-Scheduler外掛的自定義
k8s的發展越來越像是一個框架,然後把各種擴充套件的能力留給開發者。開發者可以基於這些介面結合自己的業務場景,實現自己的場景化需求。其中kube scheduler 就是充分體現了這個特質,關於kube scheduler 本身的介紹參加之前的文章,今天我想介紹如何給scheduler 新增一個排程plugin。
我們首先通過yaml定義這個plugin
apiVersion: kubescheduler.config.k8s.io/v1beta1 kind: KubeSchedulerConfiguration clientConnection: kubeconfig: "/etc/kubernetes/scheduler.conf" profiles: - schedulerName: default-scheduler plugins: score: enabled: - name: HelloWorldPlugin disabled: - name: "*" pluginConfig: - name: HelloWorldPlugin args: xxx: "xxx" yyy: "123" zzz: 3
我們定義了一個 HelloWorldPlugin 的外掛,並且定義了這個外掛的啟動引數。然後需要修改kube scheduler啟動引數通過 --config 指定上面的配置檔案。
接下來我們就需要實現這個外掛,scheduler是通過每個外掛的打分的方式確定排程的主機。所以我們需要實現一個打分的介面
type ScorePlugin interface { Plugin // 打分 Score(ctx context.Context, state *CycleState, p *v1.Pod, nodeName string) (int64, *Status) ScoreExtensions() ScoreExtensions } type ScoreExtensions interface { // 打分歸一化,保證每個外掛的公平性 NormalizeScore(ctx context.Context, state *CycleState, p *v1.Pod, scores NodeScoreList) *Status }
我們根據自己的業務需求實現這個介面,譬如下面這個例子,基於主機網路頻寬的排程:首先通過promethues獲取主機的網路流量,打分依據網路流量大小。
func (n *HelloWorldPlugin) Score(ctx context.Context, state *framework.CycleState, p *v1.Pod, nodeName string) (int64, *framework.Status) { nodeBandwidth, err := n.prometheus.GetNodeBandwidthMeasure(nodeName) if err != nil { return 0, framework.NewStatus(framework.Error, fmt.Sprintf("error getting node bandwidth measure: %s", err)) } klog.Infof("[NetworkTraffic] node '%s' bandwidth: %s", nodeName, nodeBandwidth.Value) return int64(nodeBandwidth.Value), nil }
我們希望網路流量越大,得分越少,於是在歸一化處理的時候,我們通過下面簡單公式轉化成最終的分數。
func (n *HelloWorldPlugin) NormalizeScore(ctx context.Context, state *framework.CycleState, pod *v1.Pod, scores framework.NodeScoreList) *framework.Status { for i, node := range scores { scores[i].Score = framework.MaxNodeScore - (node.Score * framework.MaxNodeScore / higherScore) } klog.Infof("[NetworkTraffic] Nodes final score: %v", scores) return nil }
這樣一個簡單的,基於網路流量排程的外掛就實現了。
本文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2852451/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- gradle自定義外掛Gradle
- mybatis 自定義外掛MyBatis
- apisix~自定義外掛的部署API
- vue自定義全域性元件(或自定義外掛)Vue元件
- 自定義Gradle-Plugin 外掛GradlePlugin
- es 自定義分詞外掛分詞
- Cordova學習--iOS自定義外掛iOS
- 【django學習-24】自定義外掛Django
- gradle自定義任務和外掛Gradle
- APISIX Ingress 如何支援自定義外掛API
- Apache Maven Assembly自定義打包外掛的使用ApacheMaven
- 快速自定義Cordova外掛(-配置檔案)
- apisix-dashboard上新增自定義外掛API
- 二 阿里大模型接入:自定義外掛阿里大模型
- mybaits原始碼分析--自定義外掛(七)AI原始碼
- ##自定義一個自動注入Log 的 外掛
- Qt自定義外掛plugin的開發和呼叫QTPlugin
- [-Flutter外掛篇 1-] 從自定義外掛開始說起Flutter
- [外掛擴充套件]onethink自定義欄位外掛 百度地圖定位 外掛套件地圖
- 淺析MyBatis(三):聊一聊MyBatis的實用外掛與自定義外掛MyBatis
- svelte元件:Svelte3自定義Navbar+Tabbr元件|svelte自定義外掛元件
- iOS持續整合(三)——fastlane 自定義外掛iOSAST
- Higress 基於自定義外掛訪問 RedisRedis
- Java整合系列:高效構建自定義外掛Java
- JMeter自定義取樣器外掛開發JMeter
- [外掛擴充套件]自定義表單外掛【2015-02-28更新】套件
- Vue2自定義外掛的寫法-Vue.use()Vue
- IDEA Web渲染外掛開發(二)— 自定義JsDialogIdeaWebJS
- Custom Post Types [2.1.14] - WordPress高階自定義外掛
- Gradle核心思想(六)自定義Gradle外掛的三種方式Gradle
- JMeter 擴充套件開發:自定義 JMeter 外掛的除錯JMeter套件除錯
- apisix~14在自定義外掛中呼叫proxy_rewriteAPI
- Gradle理論與實踐四:自定義Gradle外掛Gradle
- 【Maven實戰技巧】「外掛使用專題」Maven-Assembly外掛實現自定義打包Maven
- JMeter 擴充套件外掛實現對自定義協議的支援JMeter套件協議
- 5分鐘教你使用idea除錯SeaTunnel自定義外掛Idea除錯
- 自定義Mybatis-plus外掛(限制最大查詢數量)MyBatis
- apisix~為自定義外掛設計一個configmap指令碼API指令碼