
# 配置调度策略
对于使用CCE集群和CCI的使用场景，用户可以按需将工作负载调度到CCE集群节点或者对接CCI的虚拟节点，本文详细介绍如何将CCE集群的工作负载调度到CCI 2.0上。
bursting插件当前提供了以下方式管理CCE集群的pod，使其能够调度到CCI 2.0：
- [方式一：通过配置labels控制pod调度到CCI]
- [方法二：通过配置ScheduleProfile控制pod调度到CCI]
#### 约束与限制
- 当前只有负载的原生标签能够被ScheduleProfile匹配，使负载能够被ScheduleProfile管理，将CCE集群的Pod调度到CCI 2.0。例如通过[ExtensionProfile](https://support.huaweicloud.com/usermanual-cci2/cci_01_0030.html)加到负载上的标签不能够被ScheduleProfile匹配，因此不会被ScheduleProfile管理调度功能。
- 对于存量未调度的Pod，仅允许使用auto或localprefer策略的ScheduleProfile，禁止使用enforce策略。enforce策略要求为Pod添加nodeSelector，但Pod创建后无法动态修改此字段。
- 通过配置labels控制pod调度到CCI 2.0的方式，需要在创建工作负载前添加label，若对已创建的工作负载进行追加label操作，存量工作负载对应的pod不会更新，可选择该工作负载，单击"更多 -\> 重新部署"实现更新。 ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002253557165.png "点击放大")
  
  
- **关于LocalPrefer（本地优先调度）策略在滚动更新时的调度偏差** ：当您在ScheduleProfile中配置了localPrefer策略并设置了本地最大实例数（local: maxNum）时，在Deployment进行滚动更新的过程中，受限于调度机制，存在极小概率出现实际本地Pod数量超出local: maxNum限制实例的情况。
  **恢复方法：** 若发生上述实例数偏差，您可以通过以下任一方式恢复正常状态：
  - **手动删除**：手动删除本地超额调度的Pod实例，触发重新调度。
  
  - **重触发更新**：重新触发一次滚动更新流程。
    
 
#### 前提条件
- 插件版本：已安装CCE突发弹性引擎（对接 CCI）插件，如果使用配置ScheduleProfile控制pod调度到CCI的方式请安装CCE突发弹性引擎（对接 CCI）插件版本为1.3.19及以上版本。
- 集群类型：如果使用配置ScheduleProfile控制pod调度到CCI方式仅支持VPC网络模式的CCE Standard集群和CCE Turbo集群。
 
#### 调度策略
CCE集群工作负载弹性调度到CCI 2.0策略有以下几种：
| 调度策略                  | 策略图解                                                                                         | 适用场景                                  |
|:---|:---|:---|
| 强制调度策略（enforce）       | ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002240368885.png "点击放大") | CCE工作负载强制弹性到CCI 2.0。                  |
| 自动调度策略（auto）          | ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002205448704.png "点击放大") | 根据用户集群调度器实际打分决定是否弹性到CCI 2.0。          |
| 本地优先调度策略（localPrefer） | ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002240209057.png "点击放大") | 工作负载优先调度到CCE集群，集群资源不足时工作负载弹性到CCI 2.0。 |
| 不开启（off）              | ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002205288932.png "点击放大") | 工作负载不会弹性到CCI 2.0。                     |
   
#### 特殊场景使用说明
表1特殊场景使用说明 
| 特殊使用场景                                  | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|
| pod同时使用label和ScheduleProfile控制调度CCI 2.0 | 使用label控制调度CCI 2.0的方式优先级高于使用profile控制调度CCI 2.0的方式。 例如label中策略为off，ScheduleProfile的策略为enforce，最终pod不会调度到CCI 2.0。 ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002467559033.png "点击放大")                                                                                                                                                                                     |
| pod同时被多个profile关联                       | pod有且仅有一个关联profile。当pod被多个profile关联，根据profile匹配pod的label的数量，选出最大关联profile，存在多个时，选择字典序小的profile关联。 pod最终被profileA关联 ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002434200358.png "点击放大")                                                                                                                                                                                    |
| 滚动升级导致Pod调度到CCI                         | **现象**：已创建profile且配置本地最大实例数（local: maxNum），但在Deployment滚动升级期间，部分Pod意外调度到了CCI。 **原因** ：Deployment滚动升级时，系统会根据maxSurge（最大激增数）策略创建新Pod，导致短时间内总实例数达到峰值（replicas + maxSurge）。如果此时总数超过了Profile中配置的本地最大实例数（local: maxNum），超出部分的Pod将会被调度到CCI上。如想避免滚动升级时Pod被调度到CCI，请进行相关设置，具体参见[滚动升级时临时允许本地Pod超过设定最大值](https://support.huaweicloud.com/usermanual-cci2/cci_01_0529.html)。 **注意**：如需严格控制，请合理规划maxSurge值或本地资源限额。 |
   
 #### 方法一：通过配置labels控制pod调度到CCI
您可以通过控制台或YAML配置labels控制pod调度到CCI。
- [通过控制台配置labels]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称，进入概览页面。
  
  3. 选择"工作负载"，单击"创建工作负载"。
  
  4. 在基本信息中"弹性至CCI"选择"不开启"以外的任意策略。 
     - 本地优先调度：Pod优先调度至CCE节点，当CCE节点资源不足时将Pod弹性至CCI。
     
     - 强制调度：所有Pod均会弹性至CCI。
     
     
     
     
  
  5. 勾选相关的CCI资源池。 
     - CCI 2.0资源池(bursting-node)：新一代Serverless容器资源池。
     
     - CCI 1.0资源池(virtual-kubelet)：存量Serverless容器资源池，即将日落。
       ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
       在CCE集群控制台（console）创建工作负载时，CCI弹性承载支持勾选"CCI 2.0资源池(bursting-node)"或者"CCI 1.0资源池(virtual-kubelet)"，如果使用CCI 1.0请勾选"virtual-kubelet"，如果使用CCI 2.0请勾选"bursting-node"。
       
     
     
     
     
  
  6. CCE工作负载具体操作步骤详情请参见[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)，完成后单击"确定"即可。
   
- [通过YAML文件配置]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称，进入概览页面。
  
  3. 选择"工作负载"，单击"YAML创建"。
  
  4. 在工作负载的yaml文件中添加bursting.cci.io/burst-to-cci标签。 
     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: test
       namespace: default
       labels:
         bursting.cci.io/burst-to-cci: 'auto'    # 弹性到CCI
     spec:
       replicas: 2
       selector:
         matchLabels:
           app: test
       template:
         metadata:
           labels:
             app: test
         spec:
           containers:
             - image: 'nginx:perl'
               name: container-0
               resources:
                 requests:
                   cpu: 250m
                   memory: 512Mi
                 limits:
                   cpu: 250m
                   memory: 512Mi
               volumeMounts: []
           imagePullSecrets:
             - name: default-secret
     ```
     表2关键参数说明 
     | 参数                           | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     |:---|:---|:---|
     | bursting.cci.io/burst-to-cci | String | 表示CCE集群工作负载弹性调度到CCI策略，取值如下： - enforce，CCE工作负载强制弹性到CCI 2.0。  - auto，根据用户集群调度器实际打分决定是否弹性到CCI 2.0。  - localPrefer，工作负载优先调度到CCE集群，集群资源不足时工作负载弹性到CCI 2.0。  - off，工作负载不会弹性到CCI 2.0。   |
        
     
     
  
  
  
  5. 完成后单击"确定"。
   
 #### 方法二：通过配置ScheduleProfile控制pod调度到CCI
您可以通过控制台或YAML配置ScheduleProfile控制pod调度到CCI。
- [通过控制台配置]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称，进入概览页面。
  
  3. 选择"策略 \> CCI弹性承载策略"。
  
  4. 单击"创建CCI弹性承载策略"，并填写相关信息。
     
     表3创建CCI弹性承载策略 
     | 参数       | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                             |
     |:---|:---|
     | 策略名称     | 输入策略名称。                                                                                                                                                                                                                                                                                                                                                                                                                                          |
     | 命名空间     | 选择弹性策略生效的命名空间。您可选择命名空间或创建命名空间，创建命名空间操作步骤详情请参见[创建命名空间](https://support.huaweicloud.com/usermanual-cce/cce_10_0278.html)。                                                                                                                                                                                                                                                                                                                          |
     | 关联负载     | 填写键值或引用负载标签。                                                                                                                                                                                                                                                                                                                                                                                                                                     |
     | 调度策略     | 选择调度策略。 - 本地优先调度：Pod优先调度至CCE节点，当CCE节点资源不足时将Pod弹性至CCI。  - 强制调度：所有Pod均会弹性至CCI。   |
     | 分配策略     | - 本地：设置本地CCE集群。  - CCI：设置CCI上运行的"最大实例数"。                                                                                             |
     | 最大实例数    | 设置"本地"或"CCI"运行的最大实例数。                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 本地缩容优先级  | 取值范围\[-100, 100\]，数值越大越先缩容。                                                                                                                                                                                                                                                                                                                                                                                                                      |
     | CCI缩容优先级 | 取值范围\[-100, 100\]，数值越大越先缩容。                                                                                                                                                                                                                                                                                                                                                                                                                      |
     | CCI资源池   | - CCI 2.0资源池(bursting-node)：新一代Serverless容器资源池。  - CCI 1.0资源池(virtual-kubelet)：存量Serverless容器资源池，即将日落。                               |
        
     
     
  
  5. 单击"确定"。
  
  
  
  6. 选择"工作负载"，单击并创建工作负载，其中"高级配置 \> 标签与注解"中添加Pod标签，其中键值与[4]创建关联负载中的键值需保持一致，其他操作步骤请参考[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)。
  
  7. 完成后单击"创建工作负载"即可。
   
- [通过YAML配置]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称，进入概览页面。
  
  3. 选择"策略 \> CCI弹性承载策略"。
  
  4. 单击"YAML创建"，创建ScheduleProfile对象。 
     示例一：限制调度到CCE集群最大实例数，配置最大实例数（local: maxNum）和scaleDownPriority的ScheduleProfile模板如下：
     ```
     apiVersion: scheduling.cci.io/v2
     kind: ScheduleProfile
     metadata:
       name: test-local-profile
       namespace: default
     spec:
       objectLabels:
         matchLabels:
           app: nginx
       strategy: localPrefer
       virtualNodes:
         - type: bursting-node
       location:
         local: 
           maxNum: 20 # 当前暂不支持local/cci同时配置maxNum
           scaleDownPriority: 2
         cci: 
           scaleDownPriority: 10
     ```
     示例二：限制CCI集群最大实例数，配置cci: maxNum和scaleDownPriority的ScheduleProfile的模板如下：
     ```
     apiVersion: scheduling.cci.io/v2
     kind: ScheduleProfile
     metadata:
       name: test-cci-profile
       namespace: default
     spec:
       objectLabels:
         matchLabels:
           app: nginx
       strategy: localPrefer
       virtualNodes:
         - type: bursting-node
       location:
         local: {}
         cci:
           maxNum: 20 # 当前暂不支持local/cci同时配置maxNum
           scaleDownPriority: 10
     ```
     表4关键参数说明 
     | 参数                | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                        |
     |:---|:---|:---|
     | strategy          | String | 表示CCE集群工作负载弹性调度到CCI 2.0策略，取值如下： - enforce，CCE工作负载强制弹性到CCI 2.0。  - auto，根据用户集群调度器实际打分决定是否弹性到CCI 2.0。  - localPrefer，工作负载优先调度到CCE集群，集群资源不足时工作负载弹性到CCI 2.0。   |
     | maxNum            | int    | 表示pod最大数量配置。 取值范围\[0\~int32\]。                                                                                                                                                                                                                                                                                                                |
     | scaleDownPriority | int    | 表示缩容优先级配置，数值越大所关联的pod越先缩容。 取值范围\[-100, 100\]。 该能力基于Kubernetes的Pod Deletion Cost机制实现，属于尽力而为（Best-Effort），尽可能优先缩容优先级较高（即数值较大）的Pod，但受限于集群状态及调度机制，不保证绝对的缩容顺序。                                                                                                                                                       |
        
     ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
     - location配置local字段（CCE侧）和cci字段（CCI侧）控制pod数量和缩容优先级。
     
     - local字段和cci字段不可以同时设置maxNum。
     
     - 缩容优先级为非必填项参数，如果不配置缩容优先级，默认值将为空。
      
     
     
  
  
  
  5. 单击"确定"。
  
  6. 创建无状态负载，使用selector方式选择含有"app：nginx"的pod，关联上文创建的ScheduleProfile。 
     ```
     kind: Deployment
     apiVersion: apps/v1
     metadata:
       name: nginx
     spec:
       replicas: 10
       selector:
         matchLabels:
           app: nginx
       template:
         metadata:
           labels:
             app: nginx
         spec:
           containers:
             - name: container-1
               image: nginx:latest
               imagePullPolicy: IfNotPresent
               resources:
                 requests:
                   cpu: 250m
                   memory: 512Mi
                 limits:
                   cpu: 250m
                   memory: 512Mi
           imagePullSecrets:
             - name: default-secret
     ```
     
     
  
  7. 单击"确定"。
   
