K8s调度器扩展(scheduler)
1.K8S调度器 筛选插件扩展
为了熟悉 K8S调度器扩展步骤,目前只修改 筛选 插件
- 准备环境(到GitHub直接下载压缩包,然后解压,解压要在Linux系统下完成)


2. 编写调度器插件代码
在 Kubernetes 源代码目录下编写调度插件代码。我们将在 pkg/scheduler/framework/plugins/ 目录下创建一个新的插件目录。
cd pkg/scheduler/framework/plugins/
mkdir highcomm
cd highcomm
在 highcomm 目录中,创建 highcomm.go 文件,这是插件的核心代码。
插件代码 highcomm.go
package highcommimport ("context"v1 "k8s.io/api/core/v1""k8s.io/apimachinery/pkg/runtime""k8s.io/kubernetes/pkg/scheduler/framework"
)const (// 插件名称Name = "HighCommPodFilter"
)// 定义插件结构体
type HighCommPodFilter struct {handle framework.Handle
}// 构造函数
func New(obj runtime.Object, handle framework.Handle) (framework.Plugin, error) {return &HighCommPodFilter{handle: handle}, nil
}// 实现 Filter 接口
func (f *HighCommPodFilter) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {// 检查 Pod 是否有 high-comm 标签if _, exists := pod.Labels["high-comm"]; !exists {return framework.NewStatus(framework.Success)}// 检查节点是否带有 RDMA 标签if value, exists := nodeInfo.Node().Labels["node.kubernetes.io/rdma-enabled"]; !exists || value != "true" {return framework.NewStatus(framework.Unschedulable, "Node does not support RDMA")}return framework.NewStatus(framework.Success)
}// Name 返回插件名称
func (f *HighCommPodFilter) Name() string {return Name
}
func (r *RdmaAware) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {// 检查 Pod 是否有 "high-comm=true" 标签if value, ok := pod.Labels["high-comm"]; !ok || value != "true" {return framework.NewStatus(framework.Unschedulable, "Pod does not have high-comm=true label")}// 检查节点是否有 "rdma=true" 标签node := nodeInfo.Node()if value, ok := node.Labels["rdma"]; !ok || value != "true" {return framework.NewStatus(framework.Unschedulable, "Node does not support RDMA")}// 允许调度return nil
}
在这个插件中,我们定义了一个 Filter 函数,只有带有 high-comm 标签的 Pod 才会被筛选检查,而具备 node.kubernetes.io/rdma-enabled=true 标签的节点会被认为合适。
注册插件
在 kubernetes/pkg/scheduler/framework/plugins/registry.go 文件中注册插件:
import ("k8s.io/kubernetes/pkg/scheduler/framework/plugins/highcomm" // 添加此行
)// 在 PluginRegistry 中注册插件
func NewDefaultRegistry() Registry {return Registry{...highcomm.Name: highcomm.New, // 注册新插件}
}
3.编译调度器插件


使用这个命令 make WHAT=cmd/kube-scheduler
4.创建调度器配置文件
创建一个 kube-scheduler 的配置文件 kube-scheduler-config.yaml,启用 HighCommPodFilter 插件:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:kubeconfig: /etc/kubernetes/scheduler.conf
profiles:- schedulerName: default-schedulerplugins:filter:enabled:- name: HighCommPodFilter

5. 创建调度器镜像
将自定义的 kube-scheduler 二进制文件打包为 Docker 镜像,以便在 Kubernetes 中运行:
(现在dockerhub我不能拉取构建需要的K8S相关镜像,所以我这个步骤是在原来的调度镜像上构建自己的调度器镜像)
![]()
sudo docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.7 k8s.gcr.io/kube-scheduler:v1.22.7
# Dockerfile
FROM k8s.gcr.io/kube-scheduler:v1.22.7
COPY _output/bin/kube-scheduler /usr/local/bin/kube-scheduler
COPY kube-scheduler-config.yaml /etc/kubernetes/kube-scheduler-config.yamlCMD ["kube-scheduler", "--config=/etc/kubernetes/kube-scheduler-config.yaml"]
上面如果构建不成功,说找不到,就把文件复制到K8S主目录下
# Dockerfile
FROM k8s.gcr.io/kube-scheduler:v1.22.7
COPY kube-scheduler /usr/local/bin/kube-scheduler
COPY kube-scheduler-config.yaml /etc/kubernetes/kube-scheduler-config.yamlCMD ["kube-scheduler", "--config=/etc/kubernetes/kube-scheduler-config.yaml"]
构建镜像:
docker build -t custom-kube-scheduler:v1.22.7 .
6. 部署自定义调度器
这一步修改了4个地方



apiVersion: v1
kind: Pod
metadata:name: kube-schedulernamespace: kube-system
spec:containers:- name: kube-schedulerimage: custom-kube-scheduler:v1.22.7command:- "/usr/local/bin/kube-scheduler"- --config=/etc/kubernetes/kube-scheduler-config.yamlvolumeMounts:- mountPath: /etc/kubernetes/kube-scheduler-config.yamlname: schedulerconfigreadOnly: truevolumes:- hostPath:path: /etc/kubernetes/kube-scheduler-config.yamltype: FileOrCreatename: schedulerconfig
7. 验证调度器插件
# 给一个节点添加 RDMA 标签
kubectl label node <rdma-node> node.kubernetes.io/rdma-enabled=true# 确保其他节点没有该标签
kubectl label node <non-rdma-node> node.kubernetes.io/rdma-enabled-
创建高通信需求的 Pod
- 创建 YAML 文件:将 Pod 配置写入到一个 YAML 文件中,例如
high-comm-pod.yaml。 - 内容:将以下内容粘贴到
high-comm-pod.yaml文件中:
创建带有 high-comm 标签的测试 Pod:
apiVersion: v1
kind: Pod
metadata:name: no-selector-podlabels:high-comm: "true"
spec:containers:- name: nginximage: nginx:1.7.9如果所有节点没有标签,不会调度
apiVersion: v1
kind: Pod
metadata:name: wrong-selector-pod
spec:containers:- name: nginximage: nginx:1.7.9
kubectl apply -f high-comm-pod.yaml
调度器还是原来的名字,但是功能实现了

1.

sudo systemctl restart kubelet
相关文章:
K8s调度器扩展(scheduler)
1.K8S调度器 筛选插件扩展 为了熟悉 K8S调度器扩展步骤,目前只修改 筛选 插件 准备环境(到GitHub直接下载压缩包,然后解压,解压要在Linux系统下完成) 2. 编写调度器插件代码 在 Kubernetes 源代码目录下编写调度插件…...
IntelliJ IDEA 中,自动导包功能
在 IntelliJ IDEA 中,自动导包功能可以极大地提高开发效率,减少手动导入包所带来的繁琐和错误。以下是如何在 IntelliJ IDEA 中设置和使用自动导包功能的详细步骤: 一、设置自动导包 打开 IntelliJ IDEA: 启动 IntelliJ IDEA 并打…...
Spring事务笔记
目录 1.Spring 编程式事务 2.Transactional 3.事务隔离级别 4.Spring 事务传播机制 什么是事务? 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成 功, 要么同时失败 1.Spri…...
SQLite 管理工具 SQLiteStudio 3.4.5 发布
SQLiteStudio 3.4.5 版本现已发布,它带来了大量的 bug 修复,并增加了一些小功能。SQLiteStudio 是一个跨平台的 SQLite 数据库的管理工具。 具体更新内容包括: 现在可以使用 Collations Editor 窗口在数据库中注册 Extension-based collatio…...
QT 实现组织树状图
1.实现效果 在Qt中使用QGraphicsItem和QGraphicsScene实现树状图,你需要创建自定义的QGraphicsItem类来表示树的节点,并管理它们的位置和连接,以下是实现效果图。 2.实现思路 可以看见,上图所示,我们需要自定义连线类和节点类。 每个节点类Node,需要绘制矩形框体文字…...
go-学习
文章目录 简介标识符字符串的拼接,关键字数据类型声明变量常量算术运算符关系运算符逻辑运算符位运算赋值运算符其他运算符 简介 Go 语言的基础组成有以下几个部分: 1.包声明 2.引入包 3.函数 4.变量 5.语句 & 表达式 6.注释 package main import &q…...
【面试分享】主流编程语言的内存回收机制及其优缺点
以下是几种主流编程语言的内存回收机制及其优缺点: 一、Java 内存回收机制: Java 使用自动内存管理,主要通过垃圾回收器(Garbage Collector,GC)来回收不再被使用的对象所占用的内存。Java 的垃圾回收器会定…...
STM32-- 串口发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)RESET);?? 答: 这行代码: while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) RESET);的作用是等待串口 USART2 的发送数据寄存器(TXE,Transmit Dat…...
数据结构 (13)串的应用举例
前言 数据结构中的串(String),也称为字符串,是一种常见且重要的数据结构,在计算机科学中被广泛应用于各种场景。 一、文本处理 文本编辑器:在文本编辑器中,字符串被用来表示和存储用户输入的文本…...
qt-- - 版本和下载介绍
qt版本很多,每个大版本都有几个版本是长期支持的(LTS),最好使用长期支持的。 例如qt5.15 qt6.2 qt6.8 都是LTS版本的。 qt在线安装需要提供账号,之前安装qt6.8因为账号问题试了很长时间,密码错了。 …...
解锁 Vue 项目中 TSX 配置与应用简单攻略
在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验,特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤: 一、安装相关依赖 首先,我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…...
ShuffleNet:一种为移动设备设计的极致高效的卷积神经网络
摘要 https://arxiv.org/pdf/1707.01083 我们介绍了一种名为ShuffleNet的计算效率极高的卷积神经网络(CNN)架构,该架构专为计算能力非常有限的移动设备(例如10-150 MFLOPs)而设计。新架构利用两种新操作:逐…...
yum源问题的解决方案
linux课堂作业 问题描述 yum 直接安装tree的问题截图 这个错误表明你的系统没有正确注册到 Red Hat Subscription Management(这个问题不用管),也没有配置有效的 YUM 软件仓库,因此无法安装或更新软件包。 解决方案(…...
在Linux中备份msyql数据库和表的详细操作
目录 前情提要 一、备份mysql数据库 原库展示 (一)新建一个数据库 (二)在linux根目录下找个位置暂时存放 (三)临时sql还原真正存放到库中 (四)查看是否备份成功 备份库成功展示 二、备份表的操作 编辑 原表emp展示 (一)快速新建一个原结构相同的表 (二)原表所…...
实时数仓Kappa架构:从入门到实战
引言 随着大数据技术的不断发展,企业对实时数据处理和分析的需求日益增长。实时数仓(Real-Time Data Warehouse, RTDW)应运而生,其中Kappa架构作为一种简化的数据处理架构,通过统一的流处理框架,解决了传统…...
【老白学 Java】Warship v2.0(四)
Warship v2.0(四) 文章来源:《Head First Java》修炼感悟。 上一篇文章中,老白仔细分析了 v2.0 的设计思路以及实现手段,如果大家有好的设计方案也可以自行尝试。 本篇文章的主要内容是对 Warship 类进行最后的修改&a…...
LLM之学习笔记(一)
前言 记录一下自己的学习历程,也怕自己忘掉了某些知识点 Prefix LM 和 Causal LM区别是什么? Prefix LM (前缀语⾔模型)和 Causal LM(因果语言模型)是两者不同类型的语言模型,它们的区别在于生…...
C# 反射详解
反射是C#中的一个强大特性,允许程序在运行时检查和操作类型和对象的信息。 通过反射,你可以获取类型的属性、方法、构造函数等信息,并可以动态创建对象、调用方法或访问属性,甚至可以实现某些框架或库的核心功能。 反射的基本概念…...
pgadmin安装后运行不能启动界面的问题
在本人机器上安装了pgsql10后,自带的pgadmin安装后运行时能打开edge并显示数据库server和数据库的,后来又安装了pgsql17,结果安装后想打开pgadmin,结果一直在等待最后,爆出类似于下面的错误。 pgAdmin Runtime Enviro…...
跳表(Skip List)
跳表(Skip List) 跳表是一种用于快速查找、插入和删除的概率型数据结构,通常用于替代平衡二叉搜索树(如 AVL 树或红黑树)。跳表通过在有序链表的基础上增加多层索引,使得查找操作的平均时间复杂度降低&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
