
# 为负载均衡类型的Service配置StatefulSet后端Pod的权重
在使用弹性负载均衡（ELB）与集群中的Service对接时，通常情况下所有后端Pod会均匀分配流量。但在某些特定场景下，例如需要对性能更强的Pod分配更多流量，或对新部署的Pod进行灰度发布时，这种均匀分配的方式无法满足需求。
您可以通过在Service的metadata.annotations中添加自定义注解kubernetes.io/elb.custom-backend-weights，为特定Pod设置自定义权重（仅支持StatefulSet类型工作负载）。
#### 前提条件
- 已创建CCE Turbo集群，其他类型的集群不支持该功能。
- 集群版本满足以下要求：
  - v1.29集群：v1.29.15-r60及以上版本
  
  - v1.30集群：v1.30.14-r60及以上版本
  
  - v1.31集群：v1.31.14-r20及以上版本
  
  - v1.32集群：v1.32.9-r20及以上版本
  
  - v1.33集群：v1.33.7-r20及以上版本
  
  - v1.34集群：v1.34.3-r10及以上版本
  
  - v1.35集群：v1.35.1-r0及以上版本
  
  - 其他更高版本的集群
   
 
#### 约束与限制
- 仅独享型负载均衡实例支持此功能。
- 此功能不能与[动态调整后端云服务器权重](https://support.huaweicloud.com/usermanual-cce/cce_10_0385.html#cce_10_0385__section3712956145815)功能（kubernetes.io/elb.adaptive-weight注解）同时配置。
- 如果开启[跨集群访问](https://support.huaweicloud.com/usermanual-cce/cce_10_0385.html#cce_10_0385__section128901854205815)功能时同时使用此功能，则不能配置kubernetes.io/elb.multicluster-loadbalancer-weight注解。
- 使用此功能时Service仅支持配置单端口监听器，不支持配置区间端口监听器。
 
#### 通过kubectl命令行配置
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**service-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi service-test.yaml
   ```
   以关联已有ELB为例，YAML配置文件如下：
   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: test
     labels:
       app: test-state
       version: v1
     namespace: default
     annotations:
       kubernetes.io/elb.class: performance   # ELB实例类型，此功能只支持独享型（performance）
       kubernetes.io/elb.id: <your_elb_id>   # ELB ID，替换为实际值
       #  配置StatefulSet后端Pod的权重
       kubernetes.io/elb.custom-backend-weights: |
         {
           "defaultWeight": 12,
           "groups": [
             {
               "listener": {
                 "protocol": "TCP",
                 "port": 978
               },
               "statefulSets": [
                 {
                   "name": "test-state",
                   "weights": [
                     {
                       "weight": 18,
                       "podIndexes": [1]
                     }
                   ]
                 }
               ]
             }
           ]
         }
   spec:
     selector:  # Service需关联StatefulSet类型的工作负载
       app: test-state
       version: v1
     externalTrafficPolicy: Cluster
     ports:
       - name: cce-service-0
         targetPort: 80
         nodePort: 0
         port: 978
         protocol: TCP
     type: LoadBalancer
     loadBalancerIP: 192.168.0.6
   ```
   表1kubernetes.io/elb.custom-backend-weights字段数据结构说明 
   | 参数            | 是否必填 | 参数类型                                                            | 描述                                                                    |
   |:---|:---|:---|:---|
   | defaultWeight | 是    | Integer                                                         | 默认后端权重。未被显式指定权重的Pod将使用此值。 取值范围：1\~100 |
   | groups        | 否    | Array of [WeightGroup] Object | 权重规则分组列表，每组对应一个监听器所对接的后端服务器。                                          |
      
    表2WeightGroup数据结构说明 
   | 参数           | 是否必填 | 参数类型                                                            | 描述                   |
   |:---|:---|:---|:---|
   | listener     | 是    | [Listener] Object              | 匹配目标监听器。             |
   | statefulSets | 是    | Array of [StatefulSet] Object | 要配置权重的StatefulSet列表。 |
      
    表3Listener数据结构说明 
   | 参数       | 是否必填 | 参数类型    | 描述                             |
   |:---|:---|:---|:---|
   | protocol | 是    | String  | 监听器协议，需要与该Service对接的监听器协议保持一致。 |
   | port     | 是    | Integer | 监听器端口，需要与该Service对接的监听器端口保持一致。 |
      
    表4StatefulSet数据结构说明 
   | 参数      | 是否必填 | 参数类型                                                       | 描述                                                                                                                                      |
   |:---|:---|:---|:---|
   | name    | 是    | String                                                     | StatefulSet名称，需要与该Service实际关联的StatefulSet名称一致。 如果该Service关联的工作负载中无一匹配该名称，或匹配的工作负载类型为非StatefulSet，则权重配置不生效。 |
   | weights | 是    | Array of [Weight] Object | 该StatefulSet下的Pod权重配置。                                                                                                                  |
      
    表5Weight数据结构说明 
   | 参数         | 是否必填 | 参数类型             | 描述                                                     |
   |:---|:---|:---|:---|
   | weight     | 是    | String           | 分配给指定Pod的流量权重。 取值范围：1\~100 |
   | podIndexes | 是    | Array of Integer | 使用该权重的Pod索引列表（例如示例中的*\[1\]*表示Pod test-state-1）。        |
      
   
   
3. 创建Service。 
   ```
   kubectl create -f service-test.yaml
   ```
   回显如下，表示Service已创建。
   ```
   service/service-test created
   ```
   
   
 
#### 验证权重设置成功
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"服务"，找到新建Service所在行，单击负载均衡名称跳转至ELB控制台查看。
3. 切换至"监听器"页签，查看监听器的后端服务器已添加辅助弹性网卡，并确认权重是否符合预期。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002562089365.png "点击放大")
   
   
   
 
#### 相关文档
当您开启跨集群后端*kubernetes.io/elb.multicluster: 'true'* 时，如果需要为StatefulSet后端Pod配置权重，请将其中的*kubernetes.io/elb.multicluster-loadbalancer-weight* 配置换成*kubernetes.io/elb.custom-backend-weights* 配置，其余配置不变。跨集群后端使用场景及配置请参考[为负载均衡类型的Service配置跨集群的后端](https://support.huaweicloud.com/usermanual-cce/cce_10_0682.html) 。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
*kubernetes.io/elb.custom-backend-weights* 中配置的StatefulSet只对该Service对接的后端服务器生效。所以跨集群使用时，您需要为每个集群的Service添加*kubernetes.io/elb.multicluster* 和*kubernetes.io/elb.custom-backend-weights*配置。
