kube-schedulersimulator 模拟调度器环境

简介: kube-schedulersimulator 模拟调度器环境


网络异常,图片无法展示
|

由于默认的 Kubernetes 调度器是高度可配置的,在很多情况下我们不需要编写任何代码来自定义调度行为。但是,想要了解调度器如何工作或者有更多二次开发需求的人员可能会尝试开发自己的调度器,在本文中,我将介绍如何借助 kube-scheduler-simulator 这个调度器模拟器来构建调度程序开发环境。

安装模拟器

首先 Clone 模拟器的代码:

$ git clone https://github.com/kubernetes-sigs/kube-scheduler-simulator$ cd kube-scheduler-simulator

为 web 前端和模拟器服务端构建镜像,执行 make docker_build_and_up 命令即可:

网络异常,图片无法展示
|

镜像构建完成后我们可以直接使用 docker-compose up 命令来启动模拟器:

网络异常,图片无法展示
|

启动后我们可以直接在浏览器中通过 localhost:3000 来访问模拟器的 Web 页面,如下所示:

网络异常,图片无法展示
|

页面上提供了新建多种资源的方法,比如我们可以点击 NEW NODE 按钮来新建一些节点:

网络异常,图片无法展示
|

只需要点击 APPLY 按钮即可新增一个节点,我们这里新增了 5 个节点。然后用同样的方式点击 NEW POD 新建一个 Pod,就会模拟整个调度过程:

网络异常,图片无法展示
|

新建的 Pod 被调度到了其中一个节点上:

网络异常,图片无法展示
|

点击 Pod 的名称可以查看到该 Pod 的整个调度过程,包括 Filter 阶段、Score 阶段和最终打分结果。

网络异常,图片无法展示
|

我们可以直接点击左上角的设置按钮来对调度器进行配置,实际上就是修改 KubeSchedulerConfiguration 对象:

网络异常,图片无法展示
|

使用

我们了解了如果通过模拟器来了解 Pod 的调度,那么如果我们要开发一个新的调度器插件,那么又应该怎么结合模拟器来使用呢?

这里我们以 https://github.com/sanposhiho/mini-kube-scheduler 这个程序为例进行说明,这个调度器实现了随机决定 Pod 的 Node。

要让我们在模拟器中使用该调度器,需要执行以下一些过程:

  • mini-kube-scheduler/minisched (从分支 initial-random-scheduler)复制到 kube-scheduler-simulator
  • 修改 kube-scheduler-simulator/scheduler/scheduler.go 文件来使用 minisched

修改 kube-scheduler-simulator/scheduler/scheduler.go 文件的内容如下所示,主要看 StartScheduler 函数的修改:

package scheduler
import ( "context"
 "sigs.k8s.io/kube-scheduler-simulator/simulator/minisched"
 "golang.org/x/xerrors" v1 "k8s.io/api/core/v1" clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/events" "k8s.io/klog/v2" v1beta2config "k8s.io/kube-scheduler/config/v1beta2" "k8s.io/kubernetes/pkg/scheduler" "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config/scheme" "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 simulatorschedconfig "sigs.k8s.io/kube-scheduler-simulator/simulator/scheduler/config" "sigs.k8s.io/kube-scheduler-simulator/simulator/scheduler/plugin")// ......
// StartScheduler starts scheduler.func (s *Service) StartScheduler(versionedcfg *v1beta2config.KubeSchedulerConfiguration) error { clientSet := s.clientset ctx, cancel := context.WithCancel(context.Background())
 informerFactory := scheduler.NewInformerFactory(clientSet, 0) evtBroadcaster := events.NewBroadcaster(&events.EventSinkImpl{  Interface: clientSet.EventsV1(), })
 evtBroadcaster.StartRecordingToSink(ctx.Done())
 s.currentSchedulerCfg = versionedcfg.DeepCopy() sched := minisched.New(  clientSet,  informerFactory, )
 informerFactory.Start(ctx.Done()) informerFactory.WaitForCacheSync(ctx.Done())
 go sched.Run(ctx)
 s.shutdownfn = cancel
 return nil}// ......

将调度器改成 sched := minisched.New(clientSet informerFactory, ),也就是现在我们只使用 minisched 这个调度器了。

修改完成后重新编译项目:

$ make docker_build_and_up

编译完成后重新启动容器:

$ docker-compose up

启动后可以再次通过 localhost:3000 访问模拟器,现在我们的模拟器中只有 minisched 这一个调度算法了,我们可以新建几个 Pod 进行测试:

网络异常,图片无法展示
|

现在就看不到之前调度器的几个阶段了,因为我们没有注册:

网络异常,图片无法展示
|

比如我们将 minisched 调度器的调度算法从随机选择一个节点改成固定选择第一个节点,修改 kube-scheduler-simulator/simulator/minisched/minisched.go 文件的 scheduleOne 函数,如下所示:

网络异常,图片无法展示
|

同样修改后重新编译、重新启动容器,然后重新访问模拟器的 Web 页面,现在我们新建的 Pod 可以发现始终都会调度到第一个 Node 节点去了。

网络异常,图片无法展示
|

现在我们就可以根据需求去开发自己的调度器算法了,完全不需要一个真实的 K8s 集群。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
资源调度 分布式计算 安全
伏羲—阿里云分布式调度系统
在12月12日的云栖社区在线培训上,“飞天”分布式系统核心开发人员陶阳宇分享了《伏羲-阿里云分布式调度系统》。他主要从伏羲系统架构、任务调度、资源调度、容错机制、规模挑战、安全与性能隔离方面介绍了伏羲分布式系统架构和设计理念。
24202 0
|
机器学习/深度学习 算法 决策智能
智能解决装箱问题:使用优化算法实现高效包装
装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。
|
机器学习/深度学习 资源调度 Kubernetes
进击的Kubernetes调度系统(三):支持批任务的Binpack Scheduling
阿里云容器服务团队结合多年Kubernetes产品与客户支持经验,对Kube-scheduler进行了大量优化和扩展,逐步使其在不同场景下依然能稳定、高效地调度各种类型的复杂工作负载。 《进击的Kubernetes调度系统》系列文章将把我们的经验、技术思考和实现细节全面地展现给Kubernetes用户和开发者,期望帮助大家更好地了解Kubernetes调度系统的强大能力和未来发展方向。
5549 124
|
传感器 监控 Java
如何正确理解 CPU 使用率和平均负载的关系?看完你就知道了
CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”。
5230 0
如何正确理解 CPU 使用率和平均负载的关系?看完你就知道了
|
11月前
|
人工智能 运维 调度
机房服务器快喘不过气?智能负载管理才是救命稻草
机房服务器快喘不过气?智能负载管理才是救命稻草
393 1
|
资源调度 分布式计算 Kubernetes
给 K8s 装上大数据调度引擎:伏羲架构升级 K8s 统一调度
飞天伏羲作为有着十多年历史的调度团队,在服务好 MaxCompute 大数据平台的过程中,一直在不断通过自我革新赶超业界先进水平,我们经历了 Fuxi 2.0 的这样的大规模升级,今天通过 K8s 统一调度项目又再次实现了系统架构的蜕变,将大数据平台强大的调度能力赋予 K8s 系统,同时去拥抱 K8s 周边丰富的生态。除了集团弹内集群,将来我们在公共云、专有云等多个场景,也会以 K8s 统一调度的方式进行输出,以更好地服务云上的用户,敬请期待!
3140 111
给 K8s 装上大数据调度引擎:伏羲架构升级 K8s 统一调度
|
资源调度 分布式计算 Kubernetes
技术抉择:阿里云13年后重构全部核心调度系统
在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择。
2352 122
技术抉择:阿里云13年后重构全部核心调度系统
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
398 1
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
资源调度 大数据 调度
【大数据技术干货】阿里云伏羲(fuxi)调度器FuxiMaster功能简介(三) 针对在线服务的资源强稳定
转载自xingbao各位好,这是介绍阿里云伏羲(fuxi)调度器系列文章的第三篇,今天主要介绍针对在线服务的资源强稳定 一、FuxiMaster简介 FuxiMaster和Yarn非常相似,定位于分布式系统中资源管理与分配的角色:一个典型的资源分配流程图如下所示: 作为调度器,目前FuxiMas
5300 0
|
Linux
超简单的Linux Man手册汉化使用配置教程
超简单的Linux Man手册汉化使用配置教程
348 0

热门文章

最新文章