> 文章列表 > 【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点

【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点

【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点

参考

  • 【K8S之调度器流程和扩展】如何给 scheduler 添加扩展插件、关闭默认插件、创建多个 scheduler?

  • kubernetes自定义调度

  • kube-scheduler 配置文件及插件

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

  • 调度器配置 KubeSchedulerConfiguration k8s 官网

  • 配置多个调度器 k8s 官网

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

实践

1. 编写 KubeSchedulerConfiguration —— 控制插件的开启和关闭

# vi /etc/kubernetes/sched-cc.yaml
# 遇事不决 看官网 https://kubernetes.io/zh-cn/docs/reference/scheduling/config/   

1.1 基础配置

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
# 这部分就是配置与 k8s 连接的 kubeconfig,看自己路径配置
# 若不清楚的话,可以先不配置,看看之后是否生效
clientConnection:kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig# kubeconfig: /etc/kubernetes/scheduler.conf# kubeconfig: /etc/.kubeconfig
profiles:# 调度器名称# k8s 默认调度器名称为 default-scheduler# 默认 Pod 的调度是调用默认调度器;- schedulerName: default-scheduler plugins:...# 若具有多个调度器,想要配置自己的调度器,可以如下定义# 同时若 Pod 调度想利用自己的调度器,需要在 Pod 的 .spec.schedulerName 字段指定相应的调度器名称- schedulerName: your-own-scheduler-nameplugins:...

1.2 手动配置各个扩展点

考虑一个插件,MyPlugin,它实现了 preScorescorepreFilterfilter 扩展点。 要为其所有可用的扩展点启用 MyPlugin,配置文件配置如下所示

# 这相当于为所有扩展点手动启用 MyPlugin
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: non-multipoint-schedulerplugins:preScore:enabled:- name: MyPluginscore:enabled:- name: MyPluginpreFilter:enabled:- name: MyPluginfilter:enabled:- name: MyPlugin

1.3 自动配置多个扩展点 multiPoint

kubescheduler.config.k8s.io/v1beta3 开始,配置文件配置中有一个附加字段 multiPoint,它允许跨多个扩展点轻松启用或禁用插件。 multiPoint 配置的目的是简化用户和管理员在使用自定义配置文件时所需的配置。

  • 在这里使用 multiPoint 的一个好处是,如果 MyPlugin 将来实现另一个扩展点,multiPoint 配置将自动为新扩展启用它。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: multipoint-schedulerplugins:# 会将 MyPlugin 所有开发的扩展点,都开启;若有后续有新增,也会进行开启multiPoint:enabled:- name: MyPlugin
----
# 等同于
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: non-multipoint-schedulerplugins:preScore:enabled:- name: MyPluginscore:enabled:- name: MyPluginpreFilter:enabled:- name: MyPluginfilter:enabled:- name: MyPlugin

1.4 某个调度点禁用某个插件或默认插件

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: non-multipoint-schedulerplugins:multiPoint:enabled:- name: 'MyPlugin'preScore:# 此处 preScore 扩展点是禁用所有插件disabled:- name: '*'score:# 此处 score 扩展点,禁用了 MyPlugin 调度插件disabled:- name: 'MyPlugin'

1.5 开启部分默认插件

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: defaulter-schedulerplugins:preScore:enabled:- name: 'MyPlugin'- name: 'DefaultPlugin1'- name: 'DefaultPlugin8'# 此处 preScore 扩展点是禁用所有插件disabled:- name: '*'

1.6 为插件配置打分权重 —— weight

# 考虑两个 Score 插件 DefaultScore1 和 DefaultScore2,默认每个插件的权重为 1,此处提升了 DefaultScore2 得分权重
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: multipoint-schedulerplugins:score:enabled:- name: 'DefaultScore2'weight: 5
----
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:- schedulerName: multipoint-schedulerplugins:multiPoint:enabled:- name: 'CustomQueueSort'- name: 'CustomPlugin1'weight: 3  # 权重仅用于 score 得分计算- name: 'CustomPlugin2'disabled:- name: 'DefaultQueueSort'filter:disabled:- name: 'DefaultPlugin1'score:enabled:- name: 'DefaultPlugin2'
# 上面等同于下面
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:- schedulerName: multipoint-schedulerplugins:# 禁用默认的 QueueSort 插件queueSort:enabled:- name: 'CustomQueueSort'disabled:- name: 'DefaultQueueSort'# 启用自定义的 Filter 插件filter:enabled:- name: 'CustomPlugin1'- name: 'CustomPlugin2'- name: 'DefaultPlugin2'disabled:- name: 'DefaultPlugin1'# 启用并重新排序自定义的打分插件 赋予不同的权重score:enabled:- name: 'DefaultPlugin2'weight: 1- name: 'DefaultPlugin1'weight: 3

2. 修改 kube-scheduler,使上面配置生效

# vi /etc/kubernetes/manifests/kube-scheduler.yamlapiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:component: kube-schedulertier: control-planename: kube-schedulernamespace: kube-system
spec:containers:- command:# 修改这里kube-scheduler的启动参数- kube-scheduler- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf- --bind-address=127.0.0.1# 改动地方1 —— KubeSchedulerConfiguration文件在容器中的路径- --config=/etc/kubernetes/sched-cc.yaml- -v=9# 改动地方2 —— 开发自定义逻辑后,手动构建镜像的镜像tag;若不涉及自定义调度插件,只是更改默认调度插件的顺序,此处可忽略image: localhost:5000/scheduler-plugins/kube-scheduler:latestimagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 8httpGet:host: 127.0.0.1path: /healthzport: 10259scheme: HTTPSinitialDelaySeconds: 10periodSeconds: 10timeoutSeconds: 15name: kube-schedulerresources:requests:cpu: 100mstartupProbe:failureThreshold: 24httpGet:host: 127.0.0.1path: /healthzport: 10259scheme: HTTPSinitialDelaySeconds: 10periodSeconds: 10timeoutSeconds: 15volumeMounts:- mountPath: /etc/kubernetesname: kubeconfighostNetwork: truepriorityClassName: system-node-criticalsecurityContext:seccompProfile:type: RuntimeDefaultvolumes:# 改动地方3 —— 挂载自定义KubeSchedulerConfiguration文件- hostPath:path: /etc/kubernetes/type: Directoryname: kubeconfig
status: {}

附录-默认启用的调度插件及扩展点

下面默认启用的插件实现了一个或多个扩展点:

  • ImageLocality:选择已经存在 Pod 运行所需容器镜像的节点

    实现的扩展点:score

  • TaintToleration:实现了污点和容忍。

    实现的扩展点:filterpreScorescore

  • NodeName:检查 Pod 指定的节点名称与当前节点是否匹配。

    实现的扩展点:filter

  • NodePorts:检查 Pod 请求的端口在节点上是否可用。

    实现的扩展点:preFilterfilter

  • NodeAffinity:实现了节点选择器 和节点亲和性。

    实现的扩展点:filterscore

  • PodTopologySpread:实现了 Pod 拓扑分布。

    实现的扩展点:preFilterfilterpreScorescore

  • NodeUnschedulable:过滤 .spec.unschedulable 值为 true 的节点。

    实现的扩展点:filter

  • NodeResourcesFit:检查节点是否拥有 Pod 请求的所有资源。 得分可以使用以下三种策略之一:LeastAllocated(默认)、MostAllocatedRequestedToCapacityRatio

    实现的扩展点:preFilterfilterscore

  • NodeResourcesBalancedAllocation:调度 Pod 时,选择资源使用更为均衡的节点。

    实现的扩展点:score

  • VolumeBinding:检查节点是否有请求的卷,或是否可以绑定请求的卷。 实现的扩展点:preFilterfilterreservepreBindscore

    说明:

    VolumeCapacityPriority 特性被启用时,score 扩展点也被启用。 它优先考虑可以满足所需卷大小的最小 PV。

  • VolumeRestrictions:检查挂载到节点上的卷是否满足卷提供程序的限制。

    实现的扩展点:filter

  • VolumeZone:检查请求的卷是否在任何区域都满足。

    实现的扩展点:filter

  • NodeVolumeLimits:检查该节点是否满足 CSI 卷限制。

    实现的扩展点:filter

  • EBSLimits:检查节点是否满足 AWS EBS 卷限制。

    实现的扩展点:filter

  • GCEPDLimits:检查该节点是否满足 GCP-PD 卷限制。

    实现的扩展点:filter

  • AzureDiskLimits:检查该节点是否满足 Azure 卷限制。

    实现的扩展点:filter

  • InterPodAffinity:实现 Pod 间亲和性与反亲和性。

    实现的扩展点:preFilterfilterpreScorescore

  • PrioritySort:提供默认的基于优先级的排序。

    实现的扩展点:queueSort

  • DefaultBinder:提供默认的绑定机制。

    实现的扩展点:bind

  • DefaultPreemption:提供默认的抢占机制。

    实现的扩展点:postFilter

你也可以通过组件配置 API 启用以下插件(默认不启用):

  • CinderLimits:检查是否可以满足节点的 OpenStack Cinder 卷限制。 实现的扩展点:filter