介绍

Kubernetes 调度器的主要作用就是为新创建的 pod ,寻找一个最合适的节点。大概需要经过两个过程:

  1. 列出所有可以调度的节点。根据不同的断言(Predicates)实现了过滤接口,过滤出能够调度的节点。
  2. 在能够调度的节点中选出最合适的节点。根据不同的优先级(Priorities)实现了打分接口,选出分数最高的节点。

这些打分接口都配有相关的比重,表示在总分数中的占比。默认值可以在源码 kubernetes-release\pkg\scheduler\algorithmprovider\defaults\register_priorities.go 中获取。有时候我们想要调节某个打分接口的比重,来修改调度器调度策略,从而控制 pod 调度。

修改配置

可以通过执行 kube-scheduler --policy-config-file <filename>kube-scheduler --policy-configmap <ConfigMap> 设置并使用调度策略。下面通过指定配置文件的方式来设置修改某个打分接口的比重。

修改 kube-scheduler.yaml 文件,主要在 command 中添加 - --policy-config-file=/etc/kubernetes/policy.cfg指定配置文件。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
    aaa: bbb
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
    - --policy-config-file=/etc/kubernetes/policy.cfg
    image: registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.12
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    volumeMounts:
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
    - mountPath: /etc/kubernetes/policy.cfg
      name: kube-policy-config
      readOnly: true
  hostNetwork: true
  priorityClassName: system-cluster-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig
  - hostPath:
      path: /etc/kubernetes/policy.cfg
      type: FileOrCreate
    name: kube-policy-config
status: {}

policy.cfg 配置文件内容:

{"kind":"Policy","apiVersion":"v1","priorities":[{"name":"NodeAffinityPriority","weight":100}]}

主要是一个 json 格式的字符串,内容简单明了。当修改完 kube-scheduler.yaml 文件后,pod 会自动重启更新。

参考

  1. https://kubernetes.io/zh/docs/reference/scheduling/policies/#priorities
  2. https://docs.okd.io/latest/nodes/scheduling/nodes-scheduler-default.html
Logo

开源、云原生的融合云平台

更多推荐