k8s实践(15)--调度器扩展

kube-scheduler 配置文件及插件

https://kubernetes.io/docs/reference/config-api/kube-scheduler-config.v1/

调度器配置 KubeSchedulerConfiguration k8s 官网

配置多个调度器 k8s 官网

k8s调度器多配置文件 k8s 官网
 

前言:Scheduler 处于什么位置


k8s实践(14)--scheduler调度器和pod调度策略  已经介绍调度相关:

        默认情况下,kube-scheduler 提供的默认调度器能够满足我们绝大多数的要求,但是在实际的线上项目中,可能我们自己会比 kubernetes 更加了解我们自己的应用,比如希望需要对K8S的调度器进行扩展调度GPU卡相关。本文总结我们项目使用的gpu卡调度器相关内容进行总结。

       kubernetes 的调度器采用插件化的形式实现,可以方便用户进行定制或者二次开发,我们可以自定义一个调度器并以插件形式和 kubernetes 进行集成。

        kubernetes 调度器的源码位于 kubernetes/pkg/scheduler 中,大体的代码目录结构如下所示:(不同的版本目录结构可能不太一样)

kubernetes/pkg/scheduler
-- scheduler.go         //调度相关的具体实现
|-- algorithm
|   |-- predicates      //节点筛选策略
|   |-- priorities      //节点打分策略
|-- algorithmprovider
|   |-- defaults         //定义默认的调度器

https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler

其中 Scheduler 创建和运行的核心程序,对应的代码在 pkg/scheduler/scheduler.go

如果要查看kube-scheduler 的入口程序(调度器的main文件所在位置),对应的代码在 cmd/kube-scheduler/scheduler.go

二、调度器配置和自定义调度器方法


kube-scheduler如何配置调度框架调度插件中提到的插件(比如使能或禁止哪些插件?)?如何配置调度队列的排序函数以及退避时间?先详细解析kube-scheduler的配置,在kube-scheduler中,配置也是一种API对象(其实在Kubernetes中都是这种设计,万物皆可API化),它被定义在k8s.io/kubernetes/pkg/scheduler/apis/config包中。

官方文档:调度器配置 | Kubernetes

你可以通过编写配置文件,并将其路径传给 kube-scheduler 的命令行参数,定制 kube-scheduler 的行为。

你可以通过运行 kube-scheduler --config <filename> 来设置调度模板, 使用 KubeSchedulerConfiguration v1 结构体。文件格式为配置API格式,此配置API不会通过RESTful对外暴露,只能通过指定文件的形式创建。

调度模板(Profile)允许你配置 kube-scheduler 中的不同调度阶段。每个阶段都暴露于某个扩展点中。插件通过实现一个或多个扩展点来提供调度行为。

1、KubeSchedulerConfiguration结构体api

最简单的配置如下:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig

 既然KubeSchedulerConfiguration定义为API对象,按照Kubernetes的API对象可以通过Rest接口、文件、ConfigMap等方式访问。kube-scheduler通过命令行--config参数来配置 KubeSchedulerConfiguration文件。执行kube-scheduler -h就知道.

虽然可以通过文件配置KubeSchedulerConfiguration,但是依然可以通过--address、--port、--use-legacy-policy-config等覆盖配置中的字段。具体字段:

kube-scheduler 配置 (v1) | Kubernetes

详细介绍KubeSchedulerConfiguration结构体

type KubeSchedulerConfiguration struct {
    // K8S所有的API必须有的类型元信息,不用多余解释了。
	metav1.TypeMeta

    // 调度Pod的算法的最大并行度,必须大于0,默认为16(在后续章节中会介绍如何设置默认配置)。
	// 还记得调度框架文章中提到的parallelize.Until(),比如kube-scheduler采用多协程并发计算分数,最大并行度就是这个参数指定的。
	Parallelism int32

	// 调度算法源,包括调度调度算法提供者(Provider)和调度策略两种,后者又分为文件和ConfigMap两种源,笔者在调度插件的文章中简单介绍过。
	// 但是AlgorithmSource的方式已经不推荐使用了,取而代之的是KubeSchedulerProfile,下面会看到,所以本文不会对算法源做过多介绍。
	AlgorithmSource SchedulerAlgorithmSource

	// LeaderElection选举相关的配置,采用多个kube-scheduler选举leader的方式实现高可用。
	// 本文不解析该配置,因为这属于基础组件的配置,从包名子componentbaseconfig也可以看出来,它不专属于kube-scheduler.
	// 笔者会单独写一篇文章解析Kubernetes的Leader选举,并介绍如何把Kubernetes的Leader选举用在自己的项目中。
	LeaderElection componentbaseconfig.LeaderElectionConfiguration

	// ClientConnection指定了kubeconfig文件和与apiserver通信时要使用的客户端连接设置。
	// ClientConnection同样是基础组件配置之一(毕竟需要连接apiserver的组件太多了),本文不做解析。
	ClientConnection componentbaseconfig.ClientConnectionConfiguration
	// HealthzBindAddress是检查kube-scheduler健康状态使用的IP地址和端口,默认为0.0.0.0:10251
	// MetricsBindAddress是获取kube-scheduler监控指标的IP地址和端口,默认为0.0.0.0:10251。
	// 这两个地址都是kube-scheduler对外提供http接口服务的地址,可以检测服务健康度以及获取各种监控指标。
	HealthzBindAddress string
	MetricsBindAddress string

	// 调试相关的配置,属于基础组件配置,本文不做解析。
	componentbaseconfig.DebuggingConfiguration

	// 如果集群特别大,每次调度一个Pod都需要遍历所有的Node计算量是不是非常大?PercentageOfNodesToScore就是用来减少计算量的。
	// 只要超过PercentageOfNodesToScore指定百分比的Node可行,那么调度器就在这些Node中寻找最优节点,而不会再遍历其他Node。
	// 例如:如果集群大小为500个节点,并且此配置的值为30,则调度器一旦找到150个可行Node就会停止查找。
	// 所以说,kube-scheduler并不是为每个Pod计算全局最优的Node,而是局部最优。
	PercentageOfNodesToScore int32

	// 用于配置调度队列的初始退避时间和最大退避时间,单位是秒。
	// 详情参看https://github.com/jindezgm/k8s-src-analysis/tree/master/kube-scheduler/SchedulingQueue.md
	PodInitialBackoffSeconds int64
	PodMaxBackoffSeconds int64

    // Profiles是kube-scheduler支持的调度配置,每个KubeSchedulerProfile对应一个独立的调度器,并有一个唯一的名字。
    // Pod可以指定调度器名字选择调度器,如果未指定任何调度程序名字,则将使用“default-scheduler”配置进行调度。
	// 后文专门有一个章节介绍KubeSchedulerProfile,因为KubeSchedulerProfile是本文的重点内容。
	Profiles []KubeSchedulerProfile

	// 调度扩展程序的配置列表,每个Extender都包含如何与调度扩展程序进行通信的配置,这些调度扩展程序由所有KubeSchedulerProfile共享。
	// 因为Extender是本质就是在kube-scheduler外部扩展调度插件,所以在所有KubeSchedulerProfile共享是必须的。
	Extenders []Extender
}

下面是KubeSchedulerConfiguration文件的简单示例:

apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration
# Leader选举配置
leaderElection:
  # 使能Leader选举
  leaderElect: true
# apiserver客户端连接配置
clientConnection:
  # 指定了kubeconfig文件路径
  kubeconfig: /etc/kubernetes/scheduler.conf
profiles:
  # 调度器[0]配置,名字是'default-scheduler'
- schedulerName: default-scheduler
  # 插件配置
  plugins:
    # 禁用QueueSort扩展点所有默认插件,使能Test
    queueSort:
      enabled:
      - name: Test
      disabled:
      - name: "*"
	# PreFilter扩展点使能Test
    preFilter:
      enabled:
      - name: Test
	# Permit扩展点使能Test
    permit:
      enabled:
      - name: Test
	# Reserve扩展点使能Test
    reserve:
      enabled:
      - name: Test
	# PostBind扩展点使能Test
    postBind:
      enabled:
      - name: Test
  # 插件参数配置
  pluginConfig:
  # Test插件的参数
  - name: Test
    args:
      abcd: efg

1、KubeSchedulerProfile表示一个调度器

2、Plugins用来指定调度器的多个扩展点,调度器执行过程中按照顺序执行扩展点上的插件。

3、Plugin用来表示每个插件的信息,名字和权重,其中权重仅作用在score扩展点上

刨除一些相对不重要的配置参数,笔者总结kube-scheduler的配置主要包括:

  1. 调度框架调度插件相关的配置由Profiles(KubeSchedulerProfile)实现;
  2. 调度扩展程序相关的配置由Extenders实现;
  3. 调度队列的退避时间配置由PodInitialBackoffSeconds和PodMaxBackoffSeconds实现;
  4. 调度算法(插件)最大并行度由Parallelism实现;

1、若config中没有指定default-scheduler调度器配置,那创建pod时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hguisu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值