您现在的位置是:首页 >技术交流 >【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点网站首页技术交流
【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点
参考
-
https://kubernetes.io/docs/reference/config-api/kube-scheduler-config.v1/
-
配置多个调度器 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-name
plugins:
...
1.2 手动配置各个扩展点
考虑一个插件,
MyPlugin
,它实现了preScore
、score
、preFilter
和filter
扩展点。 要为其所有可用的扩展点启用MyPlugin
,配置文件配置如下所示
# 这相当于为所有扩展点手动启用 MyPlugin
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
preScore:
enabled:
- name: MyPlugin
score:
enabled:
- name: MyPlugin
preFilter:
enabled:
- name: MyPlugin
filter:
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-scheduler
plugins:
# 会将 MyPlugin 所有开发的扩展点,都开启;若有后续有新增,也会进行开启
multiPoint:
enabled:
- name: MyPlugin
----
# 等同于
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
preScore:
enabled:
- name: MyPlugin
score:
enabled:
- name: MyPlugin
preFilter:
enabled:
- name: MyPlugin
filter:
enabled:
- name: MyPlugin
1.4 某个调度点禁用某个插件或默认插件
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
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-scheduler
plugins:
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-scheduler
plugins:
score:
enabled:
- name: 'DefaultScore2'
weight: 5
----
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
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-scheduler
plugins:
# 禁用默认的 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.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
component: kube-scheduler
tier: control-plane
name: kube-scheduler
namespace: 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:latest
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /healthz
port: 10259
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: kube-scheduler
resources:
requests:
cpu: 100m
startupProbe:
failureThreshold: 24
httpGet:
host: 127.0.0.1
path: /healthz
port: 10259
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
volumeMounts:
- mountPath: /etc/kubernetes
name: kubeconfig
hostNetwork: true
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
# 改动地方3 —— 挂载自定义KubeSchedulerConfiguration文件
- hostPath:
path: /etc/kubernetes/
type: Directory
name: kubeconfig
status: {}
附录-默认启用的调度插件及扩展点
下面默认启用的插件实现了一个或多个扩展点:
-
ImageLocality
:选择已经存在 Pod 运行所需容器镜像的节点。实现的扩展点:
score
。 -
TaintToleration
:实现了污点和容忍。实现的扩展点:
filter
、preScore
、score
。 -
NodeName
:检查 Pod 指定的节点名称与当前节点是否匹配。实现的扩展点:
filter
。 -
NodePorts
:检查 Pod 请求的端口在节点上是否可用。实现的扩展点:
preFilter
、filter
。 -
实现的扩展点:
filter
、score
。 -
PodTopologySpread
:实现了 Pod 拓扑分布。实现的扩展点:
preFilter
、filter
、preScore
、score
。 -
NodeUnschedulable
:过滤.spec.unschedulable
值为 true 的节点。实现的扩展点:
filter
。 -
NodeResourcesFit
:检查节点是否拥有 Pod 请求的所有资源。 得分可以使用以下三种策略之一:LeastAllocated
(默认)、MostAllocated
和RequestedToCapacityRatio
。实现的扩展点:
preFilter
、filter
、score
。 -
NodeResourcesBalancedAllocation
:调度 Pod 时,选择资源使用更为均衡的节点。实现的扩展点:
score
。 -
VolumeBinding
:检查节点是否有请求的卷,或是否可以绑定请求的卷。 实现的扩展点:preFilter
、filter
、reserve
、preBind
和score
。说明:
当
VolumeCapacityPriority
特性被启用时,score
扩展点也被启用。 它优先考虑可以满足所需卷大小的最小 PV。 -
VolumeRestrictions
:检查挂载到节点上的卷是否满足卷提供程序的限制。实现的扩展点:
filter
。 -
VolumeZone
:检查请求的卷是否在任何区域都满足。实现的扩展点:
filter
。 -
NodeVolumeLimits
:检查该节点是否满足 CSI 卷限制。实现的扩展点:
filter
。 -
EBSLimits
:检查节点是否满足 AWS EBS 卷限制。实现的扩展点:
filter
。 -
GCEPDLimits
:检查该节点是否满足 GCP-PD 卷限制。实现的扩展点:
filter
。 -
AzureDiskLimits
:检查该节点是否满足 Azure 卷限制。实现的扩展点:
filter
。 -
InterPodAffinity
:实现 Pod 间亲和性与反亲和性。实现的扩展点:
preFilter
、filter
、preScore
、score
。 -
PrioritySort
:提供默认的基于优先级的排序。实现的扩展点:
queueSort
。 -
DefaultBinder
:提供默认的绑定机制。实现的扩展点:
bind
。 -
DefaultPreemption
:提供默认的抢占机制。实现的扩展点:
postFilter
。
你也可以通过组件配置 API 启用以下插件(默认不启用):
CinderLimits
:检查是否可以满足节点的 OpenStack Cinder 卷限制。 实现的扩展点:filter
。