简介
由于默认的 Kubernetes 调度器是高度可配置的,在很多情况下我们不需要编写任何代码来自定义调度行为。但是,想要了解调度器如何工作或者有更多二次开发需求的人员可能会尝试开发自己的调度器,在本文中,我将介绍如何借助 kube-scheduler-simulator
这个调度器模拟器来构建调度程序开发环境。
安装
1 |
|
在simulator/Dockerfile
中添加ENV GOPROXY=https://goproxy.cn
1 |
|
修改docker-compose.yml
中的镜像
将registry.k8s.io
改为k8s.nju.edu.cn
1 |
|
修改docker-compose-local.yml
中的镜像
将registry.k8s.io
改为k8s.nju.edu.cn
1 |
|
修改web/Dockerfile
添加sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories&& \
1 |
|
环境变量(!!!!!!!!!!!!!!非常重要!!!!!!!!!!!!!!)
如果出现能正常运行但是不能创建node等(或者创建之后显示NetworkError)就是这个原因
1 |
|
执行make
1 |
|
启动和关闭
1 |
|
启动之后就可以通过http://localhost:3000/访问了
目前关闭之后创建的资源就会消失,所以记得及时export
自定义调度器
下面以一个随机调度器为例,说明如何在模拟器中实现自定义调度器。
1 |
|
将
mini-kube-scheduler/minisched
(从分支 initial-random-scheduler)复制到kube-scheduler-simulator
修改
kube-scheduler-simulator/simulator/scheduler/scheduler.go
文件来使用minisched
修改
kube-scheduler-simulator/simulator/scheduler/scheduler.go
文件的内容如下所示,主要看StartScheduler
函数的修改:先back一下scheduler.go
按照下面的修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62import (
"context"
+ "github.com/kubernetes-sigs/kube-scheduler-simulator/minisched"
+
"golang.org/x/xerrors"
v1 "k8s.io/api/core/v1"
clientset "k8s.io/client-go/kubernetes"
@@ -14,7 +16,6 @@ import (
"k8s.io/kubernetes/pkg/scheduler/apis/config"
"k8s.io/kubernetes/pkg/scheduler/apis/config/scheme"
"k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
- "k8s.io/kubernetes/pkg/scheduler/profile"
simulatorschedconfig "github.com/kubernetes-sigs/kube-scheduler-simulator/scheduler/config"
"github.com/kubernetes-sigs/kube-scheduler-simulator/scheduler/plugin"
@@ -59,7 +60,6 @@ func (s *Service) ResetScheduler() error {
// StartScheduler starts scheduler.
func (s *Service) StartScheduler(versionedcfg *v1beta2config.KubeSchedulerConfiguration) error {
clientSet := s.clientset
- restConfig := s.restclientCfg
ctx, cancel := context.WithCancel(context.Background())
informerFactory := scheduler.NewInformerFactory(clientSet, 0)
@@ -71,36 +71,10 @@ func (s *Service) StartScheduler(versionedcfg *v1beta2config.KubeSchedulerConfig
s.currentSchedulerCfg = versionedcfg.DeepCopy()
- cfg, err := convertConfigurationForSimulator(versionedcfg)
- if err != nil {
- cancel()
- return xerrors.Errorf("convert scheduler config to apply: %w", err)
- }
-
- registry, err := plugin.NewRegistry(informerFactory, clientSet)
- if err != nil {
- cancel()
- return xerrors.Errorf("plugin registry: %w", err)
- }
-
- sched, err := scheduler.New(
+ sched := minisched.New(
clientSet,
informerFactory,
- profile.NewRecorderFactory(evtBroadcaster),
- ctx.Done(),
- scheduler.WithKubeConfig(restConfig),
- scheduler.WithProfiles(cfg.Profiles...),
- scheduler.WithPercentageOfNodesToScore(cfg.PercentageOfNodesToScore),
- scheduler.WithPodMaxBackoffSeconds(cfg.PodMaxBackoffSeconds),
- scheduler.WithPodInitialBackoffSeconds(cfg.PodInitialBackoffSeconds),
- scheduler.WithExtenders(cfg.Extenders...),
- scheduler.WithParallelism(cfg.Parallelism),
- scheduler.WithFrameworkOutOfTreeRegistry(registry),
)
- if err != nil {
- cancel()
- return xerrors.Errorf("create scheduler: %w", err)
- }
informerFactory.Start(ctx.Done())
informerFactory.WaitForCacheSync(ctx.Done())修改完成后重新编译项目:
1
$ sudo make docker_build_and_up
失败成功方案
类似的问题,但并没有解决将自定义插件集成到模拟器中的问题 ·问题 #311 ·kubernetes-sigs/kube-scheduler-simulator (github.com)
非常感谢@sanposhiho 的帮助Cannot integrate custom plugins into the emulator · Issue #341 · kubernetes-sigs/kube-scheduler-simulator (github.com)
下面以官网的 nodenumber 为例
注册插件到outOfTreeRegistries
修改kube-scheduler-simulator/simulator/scheduler/config/plugin.go
1 |
|
执行下面的命令重新build并运行
1 |
|
打开 后在设置中添加下面的内容
1 |
|
这样nodeNumber就可以正常运行了
相关代码在这里