更新时间:2024-09-29 GMT+08:00

重调度(Descheduler)

集群中的调度是将pending状态的Pod分配到节点运行的过程,在CCE集群之中,Pod的调度依赖于集群中的调度器(kube-scheduler或者Volcano调度器)。调度器是通过一系列算法计算出Pod运行的最佳节点,但是Kubernetes集群环境是存在动态变化的,例如某一个节点需要维护,这个节点上的所有Pod会被驱逐到其他节点,但是当维护完成后,之前被驱逐的Pod并不会自动回到该节点上来,因为Pod一旦被绑定了节点是不会触发重新调度的。由于这些变化,集群在一段时间之后就可能会出现不均衡的状态。

为了解决上述问题,Volcano调度器可以根据设置的策略,驱逐不符合配置策略的Pod,让其重新进行调度,达到均衡集群负载、减少资源碎片化的目的。

重调度功能介绍

负载感知重调度(LoadAware)

在K8s集群治理过程中,常常会因CPU、内存等高使用率状况而形成热点,既影响了当前节点上Pod的稳定运行,也会导致节点发生故障的几率的激增。为了应对集群节负载不均衡等问题,动态平衡各个节点之间的资源使用率,需要基于节点的相关监控指标,构建集群资源视图,在集群治理阶段,通过实时监控,在观测到节点资源率较高、节点故障、Pod 数量较多等情况时,可以自动干预,迁移资源使用率高的节点上的一些Pod到利用率低的节点上。

图1 LoadAware策略示意图

使用该插件时,highThresholds需要大于lowThresholds,否则重调度器无法启用。

  • 正常节点:资源利用率大于等于30%且小于等于80%的节点。此节点的负载水位区间是期望达到的合理区间范围。
  • 热点节点:资源利用率高于80%的节点。热点节点将驱逐一部分Pod,降低负载水位,使其不超过80%。重调度器会将热点节点上面的Pod调度到空闲节点上面。
  • 空闲节点:资源利用率低于30%的节点。

CPU和内存资源碎片率整理策略(HighNodeUtilization)

从分配率低的节点上驱逐Pod。这个策略必须与Volcano调度器的binpack策略或者kube-scheduler调度器的MostAllocated策略一起使用。阈值可以分为CPU和内存两种资源角度进行配置。

前提条件

约束与限制

  • 重调度之后的Pod,需要调度器进行调度,重调度器并未进行任何对于Pod和节点的标记行为,所以被驱逐的Pod调度到节点的行为完全被调度器控制,存在驱逐之后,被驱逐的Pod调度到原来节点的可能性。
  • 重调度功能暂不支持Pod间存在反亲和性的场景。如果使用重调度功能驱逐某个Pod后,由于该Pod与其他已运行的Pod存在反亲和性,调度器仍可能将其调度回驱逐前的节点上。
  • 配置负载感知重调度(LoadAware)时,Volcano调度器需要同时开启负载感知调度;配置CPU和内存资源碎片率整理策略(HighNodeUtilization)时,Volcano调度器需要同时开启binpack调度策略。

配置负载感知重调度策略

配置负载感知重调度(LoadAware)时,Volcano调度器需要同时开启负载感知调度,示例步骤如下。

  1. 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“配置中心”,通过“调度配置”页面启用负载感知调度。
  2. 在“调度配置”页面,选择Volcano调度器找到对应的“专家模式”,单击“开始使用”。

  3. 配置负载感知重调度策略。使用Volcano 1.11.21及更新版本,JSON格式的配置示例如下:

    {
      "colocation_enable": "",
      "default_scheduler_conf": {
        "actions": "allocate, backfill, preempt",
        "tiers": [
          {
            "plugins": [
              {
                "name": "priority"
              },
              {
                "enablePreemptable": false,
                "name": "gang"
              },
              {
                "name": "conformance"
              }
            ]
          },
          {
            "plugins": [
              {
                "enablePreemptable": false,
                "name": "drf"
              },
              {
                "name": "predicates"
              },
              {
                "name": "nodeorder"
              },
              {
                "name": "usage",
                "enablePredicate": true,
                "arguments": {
                  "usage.weight": 5,
                  "cpu.weight": 1,
                  "memory.weight": 1,
                  "thresholds": {
                    "cpu": 80,
                    "mem": 80
                  }
                }
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "cce-gpu-topology-predicate"
              },
              {
                "name": "cce-gpu-topology-priority"
              },
              {
                "name": "cce-gpu"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "nodelocalvolume"
              },
              {
                "name": "nodeemptydirvolume"
              },
              {
                "name": "nodeCSIscheduling"
              },
              {
                "name": "networkresource"
              }
            ]
          }
        ]
      },
      "deschedulerPolicy": {
        "profiles": [
          {
            "name": "ProfileName",
            "pluginConfig": [
              {
                "args": {
                  "ignorePvcPods": true,
                  "nodeFit": true,
                  "priorityThreshold": {
                    "value": 100
                  }
                },
                "name": "DefaultEvictor"
              },
              {
                "args": {
                  "evictableNamespaces": {
                    "exclude": ["kube-system"]
                  },
                  "metrics": {
                    "type": "prometheus_adaptor"
                  },
                  "targetThresholds": {
                    "cpu": 80,
                    "memory": 85
                  },
                  "thresholds": {
                    "cpu": 30,
                    "memory": 30
                  }
                },
                "name": "LoadAware"
              }
            ],
            "plugins": {
              "balance": {
                "enabled": ["LoadAware"]
              }
            }
          }
        ]
      },
      "descheduler_enable": "true",
      "deschedulingInterval": "10m"
    }
    表1 集群重调度策略关键参数

    参数

    说明

    descheduler_enable

    集群重调度策略开关。

    • true:启用集群重调度策略。
    • false:不启用集群重调度策略。

    deschedulingInterval

    重调度的周期。

    deschedulerPolicy

    集群重调度策略,详情请参见表2

    表2 deschedulerPolicy配置参数

    参数

    说明

    profiles.[].plugins.balance.enable.[]

    指定集群重调度策略类型。

    LoadAware:表示使用负载感知重调度策略。

    profiles.[].pluginConfig.[].name

    使用负载感知重调度策略时,会使用以下配置:

    • DefaultEvictor:默认驱逐策略。
    • LoadAware:负载感知重调度策略。

    profiles.[].pluginConfig.[].args

    集群重调度策略的具体配置。

    • 对于DefaultEvictor配置,配置参数如下:
      • ignorePvcPods:是否忽略挂载PVC的Pod,true表示忽略,false表示不忽略。该忽略动作未根据PVC类型(LocalPV/SFS/EVS等)进行区分。
      • nodeFit:是否重调度时是否考虑节点上存在的调度配置,例如节点亲和性、污点等。true表示考虑,false表示不考虑。
      • priorityThreshold:优先级设置。当Pod的优先级大于或者等于该值时,不会被驱逐。示例如下:
        {
          "value": 100
        }
    • 对于LoadAware配置,配置参数如下:
      • evictableNamespaces:驱逐策略的适用命名空间,默认范围设置为除kube-system命名空间。示例如下:
        {
          "exclude": ["kube-system"]
        }
      • metrics:监控数据采集方式,当前支持通过Custom Metrics API(prometheus_adaptor聚合数据)和Prometheus 直接查询。
        Volcano 1.11.17及之后的版本推荐使用Custom Metrics API的方式获取监控数据,示例如下:
        {
          "type": "prometheus_adaptor"
        }
        Volcano 1.11.5至1.11.16版本推荐使用Prometheus 直接查询的方式获取监控数据,需填写prometheus server的地址信息,示例如下:
        {
          "address": "http://10.247.119.103:9090",
          "type": "prometheus"
        }
      • targetThresholds:节点驱逐Pod的阈值,当节点的真实利用率高于此阈值时,上面的Pod会被驱逐。示例如下:
        {
          "cpu": 60,
          "memory": 65
        }
      • thresholds:节点承载Pod的阈值,当节点的真实利用率低于此阈值时,表示该节点可以承载被驱逐的Pod。示例如下:
        {
          "cpu": 30,
          "memory": 30
        }

  4. 完成以上配置后,单击“确定”。

配置资源碎片整理策略

配置CPU和内存资源碎片率整理策略(HighNodeUtilization)时,Volcano调度器需要同时开启binpack调度策略,示例步骤如下。

  1. 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“配置中心”,通过“调度配置”页面启用装箱策略(binpack)。详情请参见装箱调度(Binpack)
  2. 在“调度配置”页面,选择Volcano调度器找到对应的“专家模式”,单击“开始使用”。

  3. 配置资源碎片整理策略,JSON格式的配置示例如下。

    {
      "colocation_enable": "",
      "default_scheduler_conf": {
        "actions": "allocate, backfill, preempt",
        "tiers": [
          {
            "plugins": [
              {
                "name": "priority"
              },
              {
                "enablePreemptable": false,
                "name": "gang"
              },
              {
                "name": "conformance"
              },
              {
                "arguments": {
                  "binpack.weight": 5
                },
                "name": "binpack"
              }
            ]
          },
          {
            "plugins": [
              {
                "enablePreemptable": false,
                "name": "drf"
              },
              {
                "name": "predicates"
              },
              {
                "name": "nodeorder"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "cce-gpu-topology-predicate"
              },
              {
                "name": "cce-gpu-topology-priority"
              },
              {
                "name": "cce-gpu"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "nodelocalvolume"
              },
              {
                "name": "nodeemptydirvolume"
              },
              {
                "name": "nodeCSIscheduling"
              },
              {
                "name": "networkresource"
              }
            ]
          }
        ]
      },
      "deschedulerPolicy": {
        "profiles": [
          {
            "name": "ProfileName",
            "pluginConfig": [
              {
                "args": {
                  "ignorePvcPods": true,
                  "nodeFit": true,
                  "priorityThreshold": {
                    "value": 100
                  }
                },
                "name": "DefaultEvictor"
              },
              {
                "args": {
                  "evictableNamespaces": {
                    "exclude": ["kube-system"]
                  },
                  "thresholds": {
                    "cpu": 25,
                    "memory": 25
                  }
                },
                "name": "HighNodeUtilization"
              }
            ],
            "plugins": {
              "balance": {
                "enabled": ["HighNodeUtilization"]
              }
            }
          }
        ]
      },
      "descheduler_enable": "true",
      "deschedulingInterval": "10m"
    }
    表3 集群重调度策略关键参数

    参数

    说明

    descheduler_enable

    集群重调度策略开关。

    • true:启用集群重调度策略。
    • false:不启用集群重调度策略。

    deschedulingInterval

    重调度的周期。

    deschedulerPolicy

    集群重调度策略,详情请参见表4

    表4 deschedulerPolicy配置参数

    参数

    说明

    profiles.[].plugins.balance.enable.[]

    指定集群重调度策略类型。

    HighNodeUtilization:表示使用资源碎片整理策略。

    profiles.[].pluginConfig.[].name

    使用负载感知重调度策略时,会使用以下配置:

    • DefaultEvictor:默认驱逐策略。
    • HighNodeUtilization:资源碎片整理策略。

    profiles.[].pluginConfig.[].args

    集群重调度策略的具体配置。

    • 对于DefaultEvictor配置,配置参数如下:
      • ignorePvcPods:是否忽略挂载PVC的Pod,true表示忽略,false表示不忽略。该忽略动作未根据PVC类型(LocalPV/SFS/EVS等)进行区分。
      • nodeFit:是否重调度时是否考虑节点上存在的调度配置,例如节点亲和性、污点等。true表示考虑,false表示不考虑。
      • priorityThreshold:优先级设置。当Pod的优先级大于或者等于该值时,不会被驱逐。示例如下:
        {
          "value": 100
        }
    • 对于HighNodeUtilization配置,配置参数如下:
      • evictableNamespaces:驱逐策略的适用命名空间,默认范围设置为除kube-system命名空间。示例如下:
        {
          "exclude": ["kube-system"]
        }
      • thresholds:节点驱逐Pod的阈值,当节点的真实利用率低于此阈值时,该节点上的Pod会被驱逐。示例如下:
        {
          "cpu": 25,
          "memory": 25
        }

  4. 完成以上配置后,单击“确定”。

使用案例

资源碎片整理策略(HighNodeUtilization)使用案例

  1. 查看集群之中的节点,发现存在部分分配率过低的节点。

  2. 编辑Volcano参数,开启重调度器,并设置CPU和内存的阈值为25。即表示节点的分配率小于25%时,该节点上的Pod会被驱逐。

  3. 设置该策略后,将192.168.44.152节点上的Pod迁移到节点192.168.54.65,达到碎片整理的目的。

常见问题

当输入参数错误时,会有报警事件,例如:输入的配置不符合阈值范围、输入的配置格式不正确。如下图所示,可以按照事件提示进行修改。