Kubernetes必备知识: 扩展调度器

所属技术领域:

K8s

|名词定义|

Kubernetes 自带了一个默认调度器kube-scheduler,其内置了很多节点预选和优选的调度算法,一般调度场景下可以满足要求。但是在一些特殊场景下,默认调度器不能满足我们复杂的调度需求。我们就需要对调度器进行扩展,以达到调度适合业务场景的目的。

|技术特点|

 Scheduler Extender
-- 能做什么?
不改变原先调度的代码,直接在调度外起服务作为插件给调度器调用(类似webhook)
支持predicate,priority,bind的注入
一种ExtendResource,Bind只能一个extender
--如何配置
配置文件解释
--案例
申请GPU的显存,但是具体的卡有多少显存只有Extender知道,所以增加Extender的Filter
 Scheduler Framework
这里分成两点来说,从扩展点用途和并发模型分别介绍。
1.扩展点的主要用途
扩展点的主要用途主要有以下几个
QueueSort:用来支持自定义 Pod 的排序。如果指定 QueueSort 的排序算法,在调度队列里面就会按照指定的排序算法来进行排序;
Prefilter:对 Pod 的请求做预处理,比如 Pod 的缓存,可以在这个阶段设置;
Filter:就是对 Filter 做扩展,可以加一些自己想要的 Filter,比如说刚才提到的 gpu-shared 可以在这里面实现;
PostFilter:可以用于 logs/metircs,或者是对 Score 之前做数据预处理。比如说自定义的缓存插件,可以在这里面做;
Score:就是打分插件,通过这个接口来实现增强;
Reserver:对有状态的 plugin 可以对资源做内存记账;
Permit:wait、deny、approve,可以作为 gang 的插入点。这个可以对每个 pod 做等待,等所有 Pod 都调度成功、都达到可用状态时再去做通行,假如一个 pod 失败了,这里可以 deny 掉;
PreBind:在真正 bind node 之前,执行一些操作,例如:云盘挂载盘到 Node 上;
Bind:一个 Pod 只会被一个 BindPlugin 处理;
PostBind:bind 成功之后执行的逻辑,比如可以用于 logs/metircs;
Unreserve:在 Permit 到 Bind 这几个阶段只要报错就回退。比如说在前面的阶段 Permit 失败、PreBind 失败, 都会去做资源回退。
2.并发模型
并发模型意思是主调度流程是在 Pre Filter 到 Reserve,如上图浅蓝色部分所示。从 Queue 拿到一个 Pod 调度完到 Reserve 就结束了,接着会把这个 Pod 异步交给 Wait Thread,Wait Thread 如果等待成功了,就会交给 Bind Thread,就是这样一个线程模型。<
 自定义 Plugin
如何编写注册自定义 Plugin?
Kubernetes必备知识: 扩展调度器

这里是一个官方的例子,在 Bind 阶段,要将 Pod 绑定到某个 Node 上,对 Kube-apiserver 做 Bind。这里可以看到主要有两个接口,bind 的接口是声明调度器的名称,以及 bind 的逻辑是什么。最后还要实现一个构造方法,告诉它的构造方法是怎样的逻辑。

启动自定义 Plugin 的调度器:
--vendor
--fork
在启动的时候可以通过两种方式去注册。
第一种方式是通过自己编写一个脚本,通过 vendor 把调度器的代码 vendor 进来。在启动 scheduler.NewSchedulerCommand 的时候把 defaultbinder 注册进去,这样就可以启动一个调度器;
第二种方式是可以 fork kube-scheduler 的源代码,然后把调度器的 defaultbinder 通过 register 插件注册进去。注册完这个插件,去 build 一个脚本、build 一个镜像,然后启动的时候,在配置文件的 plugins.bind.enable 启动起来。

|资料来源|

名词定义:https://www.cnblogs.com/liabio/p/11723810.html

上一篇:CentOS 创建SVN 服务器,并且自动同步到WEB 目录


下一篇:网络安全等级保护2.0制度的变化和对公有云用户的要求