您现在的位置是:首页 >技术交流 >【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点网站首页技术交流

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

oceanweave 2023-05-13 04:00:02
简介检查节点是否拥有 Pod 请求的所有资源。:检查 Pod 指定的节点名称与当前节点是否匹配。:调度 Pod 时,选择资源使用更为均衡的节点。:检查挂载到节点上的卷是否满足卷提供程序的限制。:检查节点是否有请求的卷,或是否可以绑定请求的。:检查 Pod 请求的端口在节点上是否可用。:检查节点是否满足 AWS EBS 卷限制。:检查该节点是否满足 GCP-PD 卷限制。:检查该节点是否满足 Azure 卷限制。:检查该节点是否满足 CSI 卷限制。:检查请求的卷是否在任何区域都满足。

参考

实践

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,它实现了 preScorescorepreFilterfilter 扩展点。 要为其所有可用的扩展点启用 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:实现了污点和容忍

    实现的扩展点: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
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。