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
}

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

Kube-Scheduler插件的自定义相关推荐

  1. Quartz Scheduler插件–隐藏的宝藏

    尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用. 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册. 您可以自由编写自己的插件,但我们将专注于 ...

  2. jquery倒计时插件可自定义多个倒计时间

    jquery倒计时插件设置多个自定义倒计时时间,任意设置天.小时.分钟.秒倒计时间功能. 查看演示>> <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  3. VBS操作IE ---(【当不使用IE时】可以使用Chrome插件,自定义JS插件操作浏览器)

    目录 ■前言 ■举个简单VBS操作IE的例子 --- ■如何让IE打开是IE,而不是Edge ■其他更多VBS相关 ・更多操作一览 ・按键 shift ctrl alt ・打开图片,以幻灯片形式显示 ...

  4. 【泛微系统】OA系统集成echart插件,自定义图表demo实例

    OA系统集成echart插件,自定义图表demo实例 前言 在公司有时候需要做一些自定义报表,因为系统自带的报表工具很low,这时候可以使用echart插件: 第一步:下载相关jar包 首先下载一下m ...

  5. 13、Kanzi插件——通过Kanzi Engine插件创建自定义节点+代码解析

    一.通过插件创建自定义类型的节点 在类Plugindemo 中添加一行 static kanzi::PropertyTypeEditorInfoSharedPtr makeEditorInfo(); ...

  6. 【java笔记-006】【uni-app】当前运行的基座不包含原生插件[xxx],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

    uni-app引入原生插件的步骤如下:https://nativesupport.dcloud.net.cn/NativePlugin/course/android 将制作好的原生安卓插件包 复制到 ...

  7. doom emacs如何安装新插件和自定义快捷键

    doom emacs如何安装新插件和自定义快捷键 最近在学习和使用doom emacs,遇到了2个问题. 问题1: 虽然doom emacs已经配置了很多的三方插件,但是还有些个性化的插件如何按doo ...

  8. 【Maven实战技巧】「插件使用专题」Maven-Archetype插件创建自定义maven项目骨架

    技术推荐 自定义Archetype Maven骨架/以当前项目为模板创建maven骨架,可以参考http://maven.apache.org/archetype/maven-archetype-pl ...

  9. pdfjs 插件进行 自定义 遮罩 打印

    pdfjs插件进行自定义遮罩 打印 效果展示 思路 pdfjs插件 每一张pdf都会生成一个canvas 在每个canvas的父级div添加事件 拖拽形成遮罩 (viewer.js 11981行左右 ...

最新文章

  1. matlab regstats()
  2. 腾讯动漫爬虫与动态随机加载反爬破解技术实战
  3. python编程案例教程书籍-清华大学出版社-图书详情-《Python开发案例教程》
  4. ios 内存深度优化_iOS 25个性能优化/内存优化常用方法
  5. java replaceall删除中括号和内容_「技术文章」《阿里巴巴 Java 开发手册》精华摘要...
  6. 演讲预告:一个月的住院经历,我悟到了哪些和程序员职场发展相关的心得
  7. 【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)
  8. DNN SEO专题 (收集)
  9. 使用GCC生成无格式二进制文件(plain binary files)
  10. 捕获标志位_如何通过捕获标志挑战来提高网络安全技能-PicoCTF演练
  11. python123第七周测验编程题答案_Python第七周编程题
  12. ​对不起!你的超融合认知已过期……
  13. Kafka、RabbitMQ、RocketMQ比较
  14. 51 nod 最长公共子序列问题(打印路径)
  15. python rtf转txt_批量定时任务将rtf文件转为docx,入参是rtf文件夹,生成一个docx文件夹...
  16. [转帖]张汝京:告别中芯国际这10年
  17. Use ulog to monitor ports logs (by quqi99)
  18. 我们都应该停止三种测试实践
  19. 错误提示 relocation overflow in R_ARM_THM_CALL
  20. 中国25张金融牌照大全

热门文章

  1. Adam 那么棒,为什么还对 SGD 念念不忘?一个框架看懂深度学习优化算法
  2. 深度学习-强化学习-图神经网络-自然语言处理等AI课程超级大列表-最新版
  3. 如何设计可自学习的五子棋AI?
  4. 【每日一算法】二叉树的最大深度
  5. 树莓派避障小车(python)
  6. 瓶框(bottle)架学习之模版使用
  7. 教你IDEA中如何快速查看Java字节码,必须点赞收藏!!!
  8. RNN 扫盲:循环神经网络解读及其 PyTorch 应用实现
  9. 利用OpenCV实现基于深度学习的超分辨率处理
  10. Nuxt.js - nuxt-link与router-link的差异