Kube-Scheduler外掛的自定義

大雄45發表於2022-01-23

Kube-Scheduler外掛的自定義Kube-Scheduler外掛的自定義
k8s的發展越來越像是一個框架,然後把各種擴充套件的能力留給開發者。開發者可以基於這些介面結合自己的業務場景,實現自己的場景化需求。其中kube scheduler 就是充分體現了這個特質,關於kube scheduler 本身的介紹參加之前的文章,今天我想介紹如何給scheduler 新增一個排程plugin。

我們首先通過yaml定義這個plugin
Kube-Scheduler外掛的自定義Kube-Scheduler外掛的自定義

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 
}

這樣一個簡單的,基於網路流量排程的外掛就實現了。

原文來自: https://www.toutiao.com/i7046924965886591502/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1×tamp=1640910789&app=news_article&utm_source=weixin&utm_medium=toutiao_ios&use_new_style=1&re

本文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2852451/,如需轉載,請註明出處,否則將追究法律責任。

相關文章