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

参考

实践

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值