
# 节点池亲和性调度
在替换节点池、节点滚动升级等场景中，需要使用新节点池替换旧节点池。在这些场景下，为做到业务不感知，可以在业务触发变更时，将业务的Pod软亲和调度到新的节点池上。这种软亲和调度会尽量将新创建的Pod或者重调度的Pod调度到新的节点池，如果新节点池资源不足，或者新节点池无法调度，也要能将Pod调度到旧节点池上。节点池替换、节点滚动升级等场景中，业务不需要也不应该感知，所以不会在业务负载中声明节点亲和配置，而需要在集群调度层面，使用软亲和方式，在业务变更时将Pod尽量调度到新的节点池上。
Volcano的目标是在业务负载未配置节点软亲和时，在调度层将业务的Pod软调度到指定节点上。
#### 调度优先级介绍
节点池软亲和调度，是通过节点池上的标签（Label）进行软亲和，具体是通过给每一个节点进行打分的机制来排序筛选最优节点。
原则：尽可能把Pod调度到带有相关标签的节点上。
打分公式如下：
score = weight \* MaxNodeScore \* haveLabel
参数说明：
- weight：节点池软亲和plugin的权重。
- MaxNodeScore：节点最大得分，值为100。
- haveLabel：节点上是否存在插件中配置的label，如果有，值为1，如果节点上没有，值为0。
 
#### 前提条件
- 已创建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)。
 
#### 配置Volcano节点池软亲和调度策略
1. 在节点池上配置用于亲和调度的标签。 
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
   
   2. 在左侧选择"节点管理"，在右侧选择"节点池"页签。
   
   3. 单击节点池名称后的"更新"，在弹出的"更新节点池"页面中配置参数，在"K8s标签"中配置对应的标签。 示例如下：
      ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001920896949.png "点击放大")
      
   
   
   
   
2. 单击左侧导航栏的"配置中心"，切换至"调度配置"页面，选择Volcano调度器找到对应的"专家模式"，单击"开始使用"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002519785283.png "点击放大")
   
   
   
   
   
3. 设置Volcano调度器配置参数，JSON格式的配置示例如下。 
   ```
   ...
       "default_scheduler_conf": {
           "actions": "allocate, backfill, preempt",
           "tiers": [
               {
                   "plugins": [
                       {
                           "name": "priority"
                       },
                       {
                           "name": "gang"
                       },
                       {
                           "name": "conformance"
                       }
                   ]
               },
               {
                   "plugins": [
                       {
                           "name": "drf"
                       },
                       {
                           "name": "predicates"
                       },
                       {
                           "name": "nodeorder"
                       }
                   ]
               },
               {
                   "plugins": [
                       {
                           "name": "cce-gpu-topology-predicate"
                       },
                       {
                           "name": "cce-gpu-topology-priority"
                       },
                       {
                           "name": "cce-gpu"
                       },
                       {
                           // 开启节点池亲和性调度
                           "name": "nodepoolaffinity", 
                           // 节点池亲和性调度权重及标签设置
                           "arguments": { 
                               "nodepoolaffinity.weight": 10000,
                               "nodepoolaffinity.label": "nodepool=nodepool1"
                           }
                       }
                   ]
               },
               {
                   "plugins": [
                       {
                           "name": "nodelocalvolume"
                       },
                       {
                           "name": "nodeemptydirvolume"
                       },
                       {
                           "name": "nodeCSIscheduling"
                       },
                       {
                           "name": "networkresource"
                       }
                   ]
               }
           ]
       },
   ...
   ```
   
   
4. 完成以上配置后，单击"确定"。
 
