写点什么

聊聊 kube-scheduler 如何完成调度和调整调度权重

  • 2023-12-18
    广东
  • 本文字数:2528 字

    阅读完需:约 8 分钟

聊聊kube-scheduler如何完成调度和调整调度权重

本文分享自华为云社区《kube-scheduler如何完成调度和调整调度权重》,作者: 可以交个朋友。

一、概述


Kube-scheduler 作为 k8s 集群的默认调度器,它监听(watch 机制)kube-apiserver,查询还未调度的 pod,根据调度策略将 pod 调度至集群内最适合的 Node

二、调度流程


首先我们通过 API 或者 kubectl 工具创建 pod,kube-apiserver 收到请求信息存储到 etcd 中,调度器通过 watch 机制监听 apiserver 查看到还未被调度的 pod 列表,循环遍历的为每个 pod 尝试分配 node,这个分配过程如下:


  • kube-scheduler 内 Informer 组件 list-watch apiserver,使用 spec.nodeName=""筛选出还未调度的 Pod

  • 预选(predicate):调度器通过 Predicate 算法过滤掉不满足条件的节点

  • 优选(priorlty):对于通过预选的节点,通过打分机制,筛选出得分最高的 node

  • 当调度器为 Pod 选择了一个合适的节点后,将 Pod 和节点进行绑定(将节点名称赋值给 pod 的 spec.nodeName 字段)



注意:Pod.spec.nodeName 用于强制约束将 Pod 调度到指定的 Node 上,通过指定 nodeName 可直接绕过调度器,并不会做任何的资源过滤和检查

三、kuble-scheduler 调度原理


Kube-scheduler 的调度框架,在 Kubernetes 里面叫作 Scheduler Framework。Pod 在调度过程中,都需要依次经过以下的各个阶段,每个阶段自带调度算法,调度算法由插件提供,也可以在指定阶段开发自己的插件。每个插件可以在指定阶段实现具体的调度算法,比如 NodeAffinity 插件在 Filter 阶段过滤掉与 Pod 不亲和的节点。


  • PreFilter: 预处理 Pod 的相关信息,或者检查集群或 Pod 必须满足的某些条件。如果 PreFilter 插件返回错误,则调度周期将终止。

  • Filter: 过滤出不能运行该 Pod 的节点。对于每个节点,调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行,则节点直接排除,不会为该节点调用剩下的过滤插件。

  • PostFilter: 在 Filter 阶段后调用,但仅在该 Pod 没有可行的节点时调用。 典型的后筛选实现是抢占,试图通过抢占其他 Pod 的资源使该 Pod 可以调度。

  • PreScore: 运行评分任务以生成可评分插件的共享状态,如果 PreScore 插件返回错误,则调度周期将终止

  • Score: 通过调用每个评分插件对可调度节点评分

  • NormalizeScore: 规范每个插件的打分在[0,100]之间

  • Reserve: 在绑定周期之前选择保留的节点

  • Permit: 批准或拒绝 pod 调度周期的结果

  • PreBind: 用于执行 Pod 绑定前所需的任何工作。例如,一个预绑定插件可能需要提供网络卷并且在允许 Pod 运行在该节点之前 将其挂载到目标节点上。

  • Bind: 用于将 Pod 绑定到节点上。直到所有的 PreBind 插件都完成,Bind 插件才会被调用。

  • PostBind: 这是个信息性的扩展点。绑定后插件在 Pod 成功绑定后被调用。这是绑定周期的结尾,可用于清理相关的资源


调度器预选阶段对应 filter,主要用于过滤不满足 Pod 调度条件的节点;优选阶段对应 score,主要用于为每个节点打分,节点分数=插件打分*插件权重;然后排序选出分数最高的节点


3.1 kubernetes 1.23 版本调度器 filter 阶段和 score 阶段源码分析


3.2 修改调度器插件默认权重示例

3.2.1 环境准备


环境:集群中有两个节点:k8s-0001 和 k8s-0002;已有工作负载 nginx,调度至节点 k8s-0002,工作负载 test,yaml 文件如下:


apiVersion: apps/v1kind: Deploymentmetadata:  name: testspec:  selector:    matchLabels:      app: test  template:    metadata:      labels:        app: test    spec:      containers:        - name: container-1          image: nginx:latest      dnsPolicy: ClusterFirst      affinity:        nodeAffinity:     #利用节点亲和使其调度至k8s-0001          preferredDuringSchedulingIgnoredDuringExecution:            - weight: 1              preference:                matchExpressions:                  - key: kubernetes.io/hostname                    operator: In                    values:                      - k8s-0001        podAffinity:      #利用负载亲和使其调度至k8s-0002          preferredDuringSchedulingIgnoredDuringExecution:            - weight: 1              podAffinityTerm:                labelSelector:                  matchExpressions:                    - key: app                      operator: In                      values:                        - nginx                namespaces:                  - default                topologyKey: kubernetes.io/hostname
复制代码

3.2.2 调整 InterPodAffinity 权重,使工作负载 test 调度至节点 k8s-0002


apiVersion: v1kind: ConfigMapmetadata:  name: scheduler-config  namespace: kube-systemdata:  scheduler-config.yaml: |    apiVersion: kubescheduler.config.k8s.io/v1beta3  #1.23以上版本集群可用v1beta3    kind: KubeSchedulerConfiguration    profiles:    - schedulerName: default-scheduler       plugins:        score:          disabled:          - name: InterPodAffinity          - name: NodeAffinity          enabled:          - name: InterPodAffinity  #提高负载亲和权重            weight: 100          - name: NodeAffinity            weight: 1
复制代码


查看 kube-scheduler 调度日志,k8s-002 score 得分为打分 100 * 权重 100 共得 10000 分,调度到 k8s-002 节点上


3.2.3 调整 NodeAffinity 权重,使工作负载 test 调度至节点 k8s-0001


apiVersion: v1kind: ConfigMapmetadata:  name: scheduler-config  namespace: kube-systemdata:  scheduler-config.yaml: |    apiVersion: kubescheduler.config.k8s.io/v1beta3    kind: KubeSchedulerConfiguration    profiles:    - schedulerName: default-scheduler       plugins:        score:          disabled:          - name: InterPodAffinity          - name: NodeAffinity          enabled:          - name: InterPodAffinity            weight: 1          - name: NodeAffinity      #提高节点亲和权重            weight: 100
复制代码



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 7
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
聊聊kube-scheduler如何完成调度和调整调度权重_云原生_华为云开发者联盟_InfoQ写作社区