kube-schedulersimulator 模拟调度器环境

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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 集群。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5月前
|
调度 Apache
airflow scheduler -D 是什么作用
【6月更文挑战第30天】airflow scheduler -D 是什么作用
101 1
|
运维 资源调度 Kubernetes
Kubernetes Scheduler Framework 扩展: 1. Coscheduling
# 前言 ## 为什么Kubernetes需要Coscheduling功能? Kubernetes目前已经广泛的应用于在线服务编排,为了提升集群的的利用率和运行效率,我们希望将Kubernetes作为一个统一的管理平台来管理在线服务和离线作业。但是默认的调度器是以Pod为调度单元进行依次调度,不会考虑Pod之间的相互关系。但是很多数据计算类的作业具有All-or-Nothing特点,要求所有的
3115 0
|
3月前
|
Kubernetes 算法 调度
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
|
5月前
|
Kubernetes 监控 调度
K8S中Scheduler原理分析
【6月更文挑战第20天】K8S Scheduler是集群的关键组件,它监听API Server,为新Pod选择合适的Node。
|
5月前
|
存储 调度 Apache
airflow scheduler 这些命令是什么作用
【6月更文挑战第30天】airflow scheduler 这些命令是什么作用
41 0
|
6月前
|
Kubernetes 监控 调度
|
6月前
|
资源调度
在SchedulerX中,你可以使用`schedulerx.output()`函数来向Worker报告运行结果
【1月更文挑战第7天】【1月更文挑战第35篇】在SchedulerX中,你可以使用`schedulerx.output()`函数来向Worker报告运行结果
45 1
|
6月前
|
存储 JavaScript 前端开发
RxJS中的调度器(Scheduler)机制
RxJS中的调度器(Scheduler)机制
176 0
|
11月前
|
Kubernetes 算法 调度
基于kube-scheduler-simulator编写自己的调度程序
基于kube-scheduler-simulator编写自己的调度程序
129 0
|
Kubernetes 算法 调度