首页 > 其他分享 >基于scheduler framework开发自定义调度器

基于scheduler framework开发自定义调度器

时间:2023-08-12 20:22:52浏览次数:47  
标签:Node Name 自定义 framework scheduler labelAB k8s

k8s v1.19.0
基于scheduler framework开发插件,本质上是实现接口。

下载代码

mkdir sigs.k8s.io
cd sigs.k8s.io
git clone https://github.com/kubernetes-sigs/scheduler-plugins.git
cd scheduler-plugins
git checkout release-1.19

新增代码

pkg目录下新增label_a_b目录

package label_a_b

import (
	"context"
	"log"

	v1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/runtime"
	framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
)

// Name is the name of the plugin used in the plugin registry and configurations.
const Name = "labelAB"

type labelAB struct{}

var _ framework.FilterPlugin = &labelAB{}
var _ framework.PreScorePlugin = &labelAB{}

// New initializes a new plugin and returns it.
func New(_ runtime.Object, _ framework.FrameworkHandle) (framework.Plugin, error) {
	return &labelAB{}, nil
}

// Name returns name of the plugin.
func (pl *labelAB) Name() string {
	return Name
}

func (pl *labelAB) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
	log.Printf("filter pod: %v, node: %v", pod.Name, nodeInfo)
	log.Println(state)
	// 排除没有a=b标签的节点
	if nodeInfo.Node().Labels["a"] != "b" {
		return framework.NewStatus(framework.Unschedulable, "Node: "+nodeInfo.Node().Name)
	}
	return framework.NewStatus(framework.Success, "Node: "+nodeInfo.Node().Name)
}

func (pl *labelAB) PreScore(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodes []*v1.Node) *framework.Status {
	log.Println(nodes)
	return framework.NewStatus(framework.Success, "Pod: "+pod.Name)
}

cmd/scheduler/main.go

注册自己的插件,注释其他

编译二进制

cd cmd/scheduler
go build -o label_a_b main.go
chmod +x label_a_b

构建镜像

cd scheduler-plugins
cat > Dockerfile <<EOF
FROM busybox:1.36
WORKDIR /
COPY label_a_b /usr/bin
CMD ["label_a_b"]
EOF
docker build --load -t label_a_b:v1 .

创建RBAC和ConfigMap以及deploy

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: label-a-b-sa
  namespace: kube-system
EOF

cat <<EOF | kubectl create -f -
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sample-scheduler-clusterrolebinding
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: label-a-b-sa
  namespace: kube-system
EOF

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: scheduler-config
  namespace: kube-system
data:
  scheduler-config.yaml: |
    apiVersion: kubescheduler.config.k8s.io/v1beta1
    kind: KubeSchedulerConfiguration
    leaderElection:
      leaderElect: false
    profiles:
    - schedulerName: label_a_b
      plugins:
        filter:
          enabled:
          - name: labelAB
        preScore:
          enabled:
            - name: labelAB
          disabled:
            - name: "*"
EOF

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: label-a-b
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      component: label_a_b
  template:
    metadata:
      labels:
        component: label_a_b
    spec:
      serviceAccount: label-a-b-sa
      priorityClassName: system-cluster-critical
      volumes:
      - name: scheduler-config
        configMap:
          name: scheduler-config
      containers:
      - name: label-a-b
        image: label_a_b:v1
        command:
        - /usr/bin/label_a_b
        - --config=/etc/kubernetes/scheduler-config.yaml
        - --v=3
        volumeMounts:
        - name: scheduler-config
          mountPath: /etc/kubernetes
EOF

验证

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      schedulerName: label_a_b
      containers:
      - image: busybox:1.36
        name: nginx
EOF

node1打上a:b标签后调度到该节点上。

参考资料

https://www.helloworld.net/p/5208016489

标签:Node,Name,自定义,framework,scheduler,labelAB,k8s
From: https://www.cnblogs.com/WJQ2017/p/17625413.html

相关文章

  • Odoo12_自定义导出excel
    1.首先按钮或者菜单出发一个后端方法返回url动作defdownload_xxx_excel(self):url='/export_xxx_excel?id={self.id}return{'type':'ir.actions.act_url','url':url,'tar......
  • Qt自定义控件之动画文本
    @TOC前言在Qt中,自定义控件可以让我们实现丰富的用户界面效果和交互体验。其中,动画文本是一种常见的效果,通过文本的动态变化可以吸引用户的注意力,增强用户体验。本文将介绍如何使用Qt实现一个动画文本的自定义控件,让你的应用程序更加生动活泼。一、动画文本的效果功能实现:基础功......
  • 在传奇游戏界面添加或删除自定义功能按钮
    本教程是以HERO引擎和非凡登录器(原猎鹰登录器)为例进行示范,其他引擎请自行进行测试,。自定义功能按钮就是在游戏界面中处于小地图,组队等按钮上面的一排可自定义进行功能设置的按钮,如图中所示,用方框选中的就是想要达到的效果。以下是具体添加方法:首先要下载下面我们给大家准备好的一......
  • SpringBoot复习:(21)自定义ImportBeanDefinitionRegistrar
    要达到的目的:将某个包下使用了某个自定义注解(比如@MyClassMapper)的类注册到Spring容器。一、自定义注解:packagecom.example.demo.service;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)publ......
  • 自定义键盘
    1.下载刷写工具在https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html 下载WCHISPStudio工具此工具为CH552G芯片厂商沁恒官方烧录工具(仅有windows版本)2.刷写最新键盘固件最新固件:threekey_v5.1.hex 点击下载3、设置下载固件打开WCHISPStudio按下图设置将USB线......
  • Android FrameWork——Binder机制详解
    1.前面我曾经发表过一篇blog介绍了aidl实现机制(aidl实现机制浅析),不过那只是停留在java表层,并遗留了一个问题,那就是BinderProxy.transact该方法本地化实现,同时我指出了它的具体代码位置:\frameworks\base\core\jni\android_util_Binder.cpp->staticjbooleanandroid_os_BinderPr......
  • Android FrameWork——Touch事件派发过程详解
    对于android的窗口window管理,一直感觉很混乱,总想找个时间好好研究,却不知如何入手,现在写的Touch事件派发过程详解,其实跟android的窗口window管理服务WindowManagerService存在紧密联系,所以从这里入手切入到WindowManagerService的研究,本blog主要讲述一个touch事件如何从用户消息的采......
  • 【金九银十面试冲刺】Android岗面试题每日分享——Android Framework篇
    又到了面试题分享的时间,今天分享的是AndroidFramework方面的的面试题,总共包含以下四大类:系统启动流程面试题解析Binder面试题解析Handler面试题解析AMS面试题解析话不多说,直接接上面试题!!!!一、你了解Android系统启动流程吗?当按电源键触发开机,首先会从ROM中预定义的地方加载引导......
  • Apache Nginx中记录自定义Header
    从Apache切到Nginx需要保持日志格式统一,以便兼容之前的数据统计脚本现在Apache的日志格式为:LogFormat"%h%t%m%U%q%>s%{HEAD}i%D"说明:%h:客户端IP地址%t:时间(标准英语格式)%m:请求的方法(GET,POST)%U:请求的URL路径,不包含查询字符串%q:查询字符串%>s:请求的最终状态%{HEAD}i:请......
  • 自定义feign 解码器Decoder
    直接上代码packagecom.haier.hibp.stock.config;importcom.alibaba.fastjson.JSON;importcom.haier.hibp.stock.constant.WebConstants;importcom.haier.hibp.stock.service.form.FeignResultDto;importfeign.FeignException;importfeign.Response;importfeign.Uti......