当前位置: 首页 > news >正文

K8s调度器扩展(scheduler)

1.K8S调度器 筛选插件扩展

为了熟悉 K8S调度器扩展步骤,目前只修改 筛选 插件

  1. 准备环境(到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调度器扩展步骤&#xff0c;目前只修改 筛选 插件 准备环境&#xff08;到GitHub直接下载压缩包&#xff0c;然后解压&#xff0c;解压要在Linux系统下完成&#xff09; 2. 编写调度器插件代码 在 Kubernetes 源代码目录下编写调度插件…...

IntelliJ IDEA 中,自动导包功能

在 IntelliJ IDEA 中&#xff0c;自动导包功能可以极大地提高开发效率&#xff0c;减少手动导入包所带来的繁琐和错误。以下是如何在 IntelliJ IDEA 中设置和使用自动导包功能的详细步骤&#xff1a; 一、设置自动导包 打开 IntelliJ IDEA&#xff1a; 启动 IntelliJ IDEA 并打…...

Spring事务笔记

目录 1.Spring 编程式事务 2.Transactional 3.事务隔离级别 4.Spring 事务传播机制 什么是事务? 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成 功, 要么同时失败 1.Spri…...

SQLite 管理工具 SQLiteStudio 3.4.5 发布

SQLiteStudio 3.4.5 版本现已发布&#xff0c;它带来了大量的 bug 修复&#xff0c;并增加了一些小功能。SQLiteStudio 是一个跨平台的 SQLite 数据库的管理工具。 具体更新内容包括&#xff1a; 现在可以使用 Collations Editor 窗口在数据库中注册 Extension-based collatio…...

QT 实现组织树状图

1.实现效果 在Qt中使用QGraphicsItem和QGraphicsScene实现树状图,你需要创建自定义的QGraphicsItem类来表示树的节点,并管理它们的位置和连接,以下是实现效果图。 2.实现思路 可以看见,上图所示,我们需要自定义连线类和节点类。 每个节点类Node,需要绘制矩形框体文字…...

go-学习

文章目录 简介标识符字符串的拼接&#xff0c;关键字数据类型声明变量常量算术运算符关系运算符逻辑运算符位运算赋值运算符其他运算符 简介 Go 语言的基础组成有以下几个部分&#xff1a; 1.包声明 2.引入包 3.函数 4.变量 5.语句 & 表达式 6.注释 package main import &q…...

【面试分享】主流编程语言的内存回收机制及其优缺点

以下是几种主流编程语言的内存回收机制及其优缺点&#xff1a; 一、Java 内存回收机制&#xff1a; Java 使用自动内存管理&#xff0c;主要通过垃圾回收器&#xff08;Garbage Collector&#xff0c;GC&#xff09;来回收不再被使用的对象所占用的内存。Java 的垃圾回收器会定…...

STM32-- 串口发送数据

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)RESET);&#xff1f;&#xff1f; 答&#xff1a; 这行代码&#xff1a; while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) RESET);的作用是等待串口 USART2 的发送数据寄存器&#xff08;TXE&#xff0c;Transmit Dat…...

数据结构 (13)串的应用举例

前言 数据结构中的串&#xff08;String&#xff09;&#xff0c;也称为字符串&#xff0c;是一种常见且重要的数据结构&#xff0c;在计算机科学中被广泛应用于各种场景。 一、文本处理 文本编辑器&#xff1a;在文本编辑器中&#xff0c;字符串被用来表示和存储用户输入的文本…...

qt-- - 版本和下载介绍

qt版本很多&#xff0c;每个大版本都有几个版本是长期支持的&#xff08;LTS&#xff09;&#xff0c;最好使用长期支持的。 例如qt5.15 qt6.2 qt6.8 都是LTS版本的。 qt在线安装需要提供账号&#xff0c;之前安装qt6.8因为账号问题试了很长时间&#xff0c;密码错了。 …...

解锁 Vue 项目中 TSX 配置与应用简单攻略

在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验&#xff0c;特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤&#xff1a; 一、安装相关依赖 首先&#xff0c;我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…...

ShuffleNet:一种为移动设备设计的极致高效的卷积神经网络

摘要 https://arxiv.org/pdf/1707.01083 我们介绍了一种名为ShuffleNet的计算效率极高的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;该架构专为计算能力非常有限的移动设备&#xff08;例如10-150 MFLOPs&#xff09;而设计。新架构利用两种新操作&#xff1a;逐…...

yum源问题的解决方案

linux课堂作业 问题描述 yum 直接安装tree的问题截图 这个错误表明你的系统没有正确注册到 Red Hat Subscription Management&#xff08;这个问题不用管&#xff09;&#xff0c;也没有配置有效的 YUM 软件仓库&#xff0c;因此无法安装或更新软件包。 解决方案&#xff08…...

在Linux中备份msyql数据库和表的详细操作

目录 前情提要 一、备份mysql数据库 原库展示 (一)新建一个数据库 (二)在linux根目录下找个位置暂时存放 (三)临时sql还原真正存放到库中 (四)查看是否备份成功 备份库成功展示 二、备份表的操作 ​编辑 原表emp展示 (一)快速新建一个原结构相同的表 (二)原表所…...

实时数仓Kappa架构:从入门到实战

引言 随着大数据技术的不断发展&#xff0c;企业对实时数据处理和分析的需求日益增长。实时数仓&#xff08;Real-Time Data Warehouse, RTDW&#xff09;应运而生&#xff0c;其中Kappa架构作为一种简化的数据处理架构&#xff0c;通过统一的流处理框架&#xff0c;解决了传统…...

【老白学 Java】Warship v2.0(四)

Warship v2.0&#xff08;四&#xff09; 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章中&#xff0c;老白仔细分析了 v2.0 的设计思路以及实现手段&#xff0c;如果大家有好的设计方案也可以自行尝试。 本篇文章的主要内容是对 Warship 类进行最后的修改&a…...

LLM之学习笔记(一)

前言 记录一下自己的学习历程&#xff0c;也怕自己忘掉了某些知识点 Prefix LM 和 Causal LM区别是什么&#xff1f; Prefix LM &#xff08;前缀语⾔模型&#xff09;和 Causal LM&#xff08;因果语言模型&#xff09;是两者不同类型的语言模型&#xff0c;它们的区别在于生…...

C# 反射详解

反射是C#中的一个强大特性&#xff0c;允许程序在运行时检查和操作类型和对象的信息。 通过反射&#xff0c;你可以获取类型的属性、方法、构造函数等信息&#xff0c;并可以动态创建对象、调用方法或访问属性&#xff0c;甚至可以实现某些框架或库的核心功能。 反射的基本概念…...

pgadmin安装后运行不能启动界面的问题

在本人机器上安装了pgsql10后&#xff0c;自带的pgadmin安装后运行时能打开edge并显示数据库server和数据库的&#xff0c;后来又安装了pgsql17&#xff0c;结果安装后想打开pgadmin&#xff0c;结果一直在等待最后&#xff0c;爆出类似于下面的错误。 pgAdmin Runtime Enviro…...

跳表(Skip List)

跳表&#xff08;Skip List&#xff09; 跳表是一种用于快速查找、插入和删除的概率型数据结构&#xff0c;通常用于替代平衡二叉搜索树&#xff08;如 AVL 树或红黑树&#xff09;。跳表通过在有序链表的基础上增加多层索引&#xff0c;使得查找操作的平均时间复杂度降低&…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...