如何自定义 Kube-Scheduler 插件

开发 架构
k8s的发展越来越像是一个框架,然后把各种扩展的能力留给开发者。开发者可以基于这些接口结合自己的业务场景,实现自己的场景化需求。

 [[443171]]

 k8s的发展越来越像是一个框架,然后把各种扩展的能力留给开发者。开发者可以基于这些接口结合自己的业务场景,实现自己的场景化需求。其中kube scheduler 就是充分体现了这个特质,关于kube scheduler 本身的介绍参加之前的文章,今天我想介绍如何给scheduler 添加一个调度plugin。

 

我们首先通过yaml定义这个plugin

  1. apiVersion: kubescheduler.config.k8s.io/v1beta1 
  2. kind: KubeSchedulerConfiguration 
  3. clientConnection: 
  4.   kubeconfig: "/etc/kubernetes/scheduler.conf" 
  5. profiles: 
  6. - schedulerName: default-scheduler 
  7.   plugins: 
  8.     score: 
  9.       enabled: 
  10.       - name: HelloWorldPlugin 
  11.       disabled: 
  12.       - name"*" 
  13.   pluginConfig: 
  14.   - name: HelloWorldPlugin 
  15.     args: 
  16.       xxx: "xxx" 
  17.       yyy: "123" 
  18.       zzz: 3 

我们定义了一个 HelloWorldPlugin 的插件,并且定义了这个插件的启动参数。然后需要修改kube scheduler启动参数通过 --config 指定上面的配置文件。

接下来我们就需要实现这个插件,scheduler是通过每个插件的打分的方式确定调度的主机。所以我们需要实现一个打分的接口

  1. type ScorePlugin interface { 
  2.   Plugin 
  3.   // 打分 
  4.   Score(ctx context.Context, state *CycleState, p *v1.Pod, nodeName string) (int64, *Status) 
  5.    
  6.   ScoreExtensions() ScoreExtensions 
  7.  
  8. type ScoreExtensions interface { 
  9.   // 打分归一化,保证每个插件的公平性 
  10.   NormalizeScore(ctx context.Context, state *CycleState, p *v1.Pod, scores NodeScoreList) *Status 

我们根据自己的业务需求实现这个接口,譬如下面这个例子,基于主机网络带宽的调度:首先通过promethues获取主机的网络流量,打分依据网络流量大小。

  1. func (n *HelloWorldPlugin) Score(ctx context.Context, state *framework.CycleState, p *v1.Pod, nodeName string) (int64, *framework.Status) { 
  2.     nodeBandwidth, err := n.prometheus.GetNodeBandwidthMeasure(nodeName) 
  3.     if err != nil { 
  4.         return 0, framework.NewStatus(framework.Error, fmt.Sprintf("error getting node bandwidth measure: %s", err)) 
  5.     } 
  6.  
  7.     klog.Infof("[NetworkTraffic] node '%s' bandwidth: %s", nodeName, nodeBandwidth.Value) 
  8.     return int64(nodeBandwidth.Value), nil 

我们希望网络流量越大,得分越少,于是在归一化处理的时候,我们通过下面简单公式转化成最终的分数。

  1. func (n *HelloWorldPlugin) NormalizeScore(ctx context.Context, state *framework.CycleState, pod *v1.Pod, scores framework.NodeScoreList) *framework.Status { 
  2.     for i, node := range scores { 
  3.         scores[i].Score = framework.MaxNodeScore - (node.Score * framework.MaxNodeScore / higherScore) 
  4.     } 
  5.  
  6.     klog.Infof("[NetworkTraffic] Nodes final score: %v", scores) 
  7.     return nil 

这样一个简单的,基于网络流量调度的插件就实现了。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-11-29 09:29:48

Kuberneteskube

2021-12-28 15:38:46

Traefik中间件插件

2023-03-31 07:17:16

2022-01-14 09:17:13

PythonAPISIX插件

2013-06-27 11:10:01

iOS开发自定义UISlider

2012-11-19 11:07:42

IBMdw

2009-09-07 22:00:15

LINQ自定义

2010-02-07 14:02:16

Android 界面

2011-08-25 11:44:21

LUA脚本魔兽世界

2015-02-12 15:33:43

微信SDK

2015-02-12 15:38:26

微信SDK

2023-01-03 07:40:27

自定义滑块组件

2009-09-03 13:34:03

.NET自定义控件

2022-04-20 18:22:18

CSS拖拽预览图

2020-11-19 10:50:43

ImportPython代码

2016-12-26 15:25:59

Android自定义View

2016-11-16 21:55:55

源码分析自定义view androi

2023-06-15 08:01:01

Vite插件机制

2011-08-09 17:16:56

CoreAnimati动画

2019-08-22 13:40:27

GNOME 3桌面
点赞
收藏

51CTO技术栈公众号