# 重调度（Descheduler）
集群中的调度是将pending状态的Pod分配到节点运行的过程，在CCE集群之中，Pod的调度依赖于集群中的调度器（kube-scheduler或者Volcano调度器）。调度器是通过一系列算法计算出Pod运行的最佳节点，但是Kubernetes集群环境是存在动态变化的，例如某一个节点需要维护，这个节点上的所有Pod会被驱逐到其他节点，但是当维护完成后，之前被驱逐的Pod并不会自动回到该节点上来，因为Pod一旦被绑定了节点是不会触发重新调度的。由于这些变化，集群在一段时间之后就可能会出现不均衡的状态。
为了解决上述问题，Volcano调度器可以根据设置的策略，驱逐不符合配置策略的Pod，让其重新进行调度，达到均衡集群负载、减少资源碎片化的目的。
#### 重调度功能介绍
**负载感知重调度（LoadAware）**
在K8s集群治理过程中，常常会因CPU、内存等高使用率状况而形成热点，既影响了当前节点上Pod的稳定运行，也会导致节点发生故障的几率的激增。为了应对集群节点负载不均衡等问题，动态平衡各个节点之间的资源使用率，需要基于节点的相关监控指标，构建集群资源视图，在集群治理阶段，通过实时监控，在观测到节点资源率较高、节点故障、Pod数量较多等情况时，可以自动干预，迁移资源使用率高的节点上的一些Pod到利用率低的节点上。
图1LoadAware策略示意图   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001665838968.png "点击放大")
使用该插件时，highThresholds需要大于lowThresholds，否则重调度器无法启用。
- 正常节点：资源利用率大于等于30%且小于等于80%的节点。此节点的负载水位区间是期望达到的合理区间范围。
- 热点节点：资源利用率高于80%的节点。热点节点将驱逐一部分Pod，降低负载水位，使其不超过80%。重调度器会将热点节点上面的Pod调度到空闲节点上面。
- 空闲节点：资源利用率低于30%的节点。
**CPU和内存资源碎片率整理策略（HighNodeUtilization）**
从分配率低的节点上驱逐Pod。这个策略必须与Volcano调度器的binpack策略或者kube-scheduler调度器的MostAllocated策略一起使用。阈值可以分为CPU和内存两种资源角度进行配置。
#### 前提条件
- 已创建v1.19.16及以上版本的集群，具体操作请参见[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)。
- 集群中已安装1.11.5及以上版本的Volcano插件，具体操作请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
 
#### 约束与限制
- 重调度之后的Pod，需要调度器进行调度，重调度器并未进行任何对于Pod和节点的标记行为，所以被驱逐的Pod调度到节点的行为完全被调度器控制，存在驱逐之后，被驱逐的Pod调度到原来节点的可能性。
- 重调度功能暂不支持Pod间存在反亲和性的场景。如果使用重调度功能驱逐某个Pod后，由于该Pod与其他已运行的Pod存在反亲和性，调度器仍可能将其调度回驱逐前的节点上。
- 配置负载感知重调度（LoadAware）时，Volcano调度器需要同时开启负载感知调度；配置CPU和内存资源碎片率整理策略（HighNodeUtilization）时，Volcano调度器需要同时开启binpack调度策略。
 
#### 配置负载感知重调度策略
配置负载感知重调度（LoadAware）时，Volcano调度器需要同时开启负载感知调度，示例步骤如下。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**Volcano调度器**，单击"编辑"，在"扩展功能"中开启"重调度"的开关，单击"确定"完成插件配置更新。
3. 单击左侧导航栏的"配置中心"，通过"调度配置"页面启用负载感知调度。详情请参见[负载感知调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0789.html)。
4. 在"调度配置"页面，选择Volcano调度器找到对应的"专家模式"，单击"开始使用"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002487544994.png "点击放大")
   
   
   
   
   
5. 配置负载感知重调度策略。使用Volcano 1.11.21及更新版本，JSON格式的重要参数配置示例如下，其他参数请参见控制台"开始使用"中的JSON示例。 
   ```
   {
   ...
   "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集群重调度策略关键参数 
   | 参数                   | 说明                                                       |
   |:---|:---|
   | deschedulingInterval | 重调度的周期。                                                |
   | deschedulerPolicy   | 集群重调度策略，详情请参见[表2]。 |
      
    表2deschedulerPolicy配置参数 
   | 参数                                        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   |:---|:---|
   | 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 } ```      |
      
   
   
6. 完成以上配置后，单击"确定"。
 
#### 配置资源碎片整理策略
配置CPU和内存资源碎片率整理策略（HighNodeUtilization）时，Volcano调度器需要同时开启binpack调度策略，示例步骤如下。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**Volcano调度器**，单击"编辑"，在"扩展功能"中开启"重调度"的开关，单击"确定"完成插件配置更新。
3. 单击左侧导航栏的"配置中心"，通过"调度配置"页面启用装箱策略(binpack)。详情请参见[装箱调度（Binpack）](https://support.huaweicloud.com/usermanual-cce/cce_10_0773.html)。
4. 在"调度配置"页面，选择Volcano调度器找到对应的"专家模式"，单击"开始使用"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002519864913.png "点击放大")
   
   
   
   
   
5. 配置资源碎片整理策略，JSON格式的重要参数配置示例如下，其他参数请参见控制台"开始使用"中的JSON示例。 
   ```
   {
   ... 
     "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集群重调度策略关键参数 
   | 参数                  | 说明                                                     |
   |:---|:---|
   | deschedulingInterval | 重调度的周期。                                                |
   | deschedulerPolicy   | 集群重调度策略，详情请参见[表4]。 |
      
    表4deschedulerPolicy配置参数 
   | 参数                                          | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|
   | 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 } ```      |
      
   
   
6. 完成以上配置后，单击"确定"。
 
#### 使用案例
**资源碎片整理策略（HighNodeUtilization）使用案例**
1. 单击集群控制台左侧导航栏的"节点管理"，查看集群之中的节点，发现存在部分分配率过低的节点。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001667003370.png "点击放大")
   
2. 单击左侧导航栏的"配置中心"，在"调度配置"页面，选择Volcano调度器找到对应的"专家模式"，单击"开始使用"。
3. 编辑Volcano参数，设置CPU和内存的阈值为25。即表示节点的分配率小于25%时，该节点上的Pod会被驱逐。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002224346377.png "点击放大")
   
4. 设置该策略后，将192.168.44.152节点上的Pod迁移到节点192.168.54.65，达到碎片整理的目的。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001666844134.png "点击放大")
   
 
#### 常见问题
当输入参数错误时，会有报警事件，例如：输入的配置不符合阈值范围、输入的配置格式不正确。如下图所示，可以按照事件提示进行修改。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001714923829.png "点击放大")
