
# 为负载均衡类型的Service配置跨集群的后端
LoadBalancer Service支持为ELB监听器配置跨集群的后端，适用多个场景：
- 配置不同集群内的容器实例作为同一个ELB监听器后端：在不同集群上创建Service绑定同一个ELB实例，同时指定同一个对外端口，各自Service的后端能够被添加到同一个ELB监听器上。通过同一个ELB实例将流量转发到不同集群上的Pod，且支持配置权重。参见[为ELB配置同VPC内不同集群的后端]和[为ELB配置不同VPC间的跨集群后端]。
  图1配置不同集群后端示意图   
  ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002016860493.png "点击放大") 
- 集群的容器实例和ECS虚拟机作为同一个ELB监听器后端：集群创建的Service绑定已有的ELB监听器，将集群的容器实例和ECS虚拟机添加到同一个ELB监听器的后端服务器组，可实现将流量转发到集群容器实例或ECS虚拟机。参见[为ELB监听器配置同VPC内的ECS后端]。
  图2配置ECS和集群后端示意图   
  ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002016775433.png) 
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
同一个集群中可能存在多个后端服务器，ELB流量根据比例分配到某个集群时，同一个集群中的后端服务器权重值将会均分，请参见[图1]。
同个集群的后端服务器权重设置规则如下：
- ELB直通Pod场景（即CCE Turbo集群中使用独享型ELB实例的场景）：ELB后端服务器是Service关联的目标Pod，此时每个目标Pod权重为**集群流量权重/目标Pod总数**并向上取整。
- 非ELB直通Pod场景（CCE Standard集群场景或CCE Turbo集群使用共享型ELB实例的场景）：ELB后端服务器是Service关联的目标Pod所在节点，此时每个节点的权重为 **(集群流量权重/目标Pod总数)\*该节点上的目标Pod数**并向上取整。
 
#### 约束与限制
- 仅支持使用已有ELB实例，不支持随Service新建ELB实例。
- 该功能只支持使用YAML创建，暂不支持在控制台操作。
- 不同集群的Service对接的是一个监听器，后端服务器组，使用的是先创建Service的配置，因此不同集群部署的监听器，后端服务器组配置跟随第一次创建ELB资源的Service，如健康检查等。
- 不同集群的Service对接一个监听器时，所有的Service都需要配置跨集群能力。
 
#### 注意事项
- 删除跨集群Service时，默认只会删除ELB下本集群的后端云服务器，也可以配置级联删除策略回收ELB所有资源。**请注意，配置级联删除策略时，删除Service或删除集群会强制回收监听器及后端服务器组。**
- 通过ELB实现跨集群访问时，**和ELB对接的所有Service均需要开启跨集群能力**，否则可能出现后端服务器组被覆盖清除的问题。
- 跨集群Service创建完成后，系统会自动添加kubernetes.io/elb.listener-port注解、kubernetes.io/elb.listener-port-ranges-auto-generated注解或kubernetes.io/elb.mark注解，这些annotation用于内部状态管理，请勿自行指定该注解，且不建议自行修改或删除，否则会导致ELB下资源回收失败。
 
 #### 为ELB配置同VPC内不同集群的后端
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
假设集群A和集群B位于同一VPC内，且该VPC内已存在一个ELB。配置同VPC内跨集群访问，集群A的Service接收流量权重设置为80，集群B的Service接收流量权重设置为20。步骤如下：
1. 在集群A中创建Service。 
   ```
   apiVersion: v1 
   kind: Service 
   metadata: 
     annotations:
       kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID，替换为实际值
       kubernetes.io/elb.class: performance  # ELB类型
       kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
       kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
       kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略，member-only只会清理ELB的后端云服务器，为缺省值；cascade策略则会强制回收ELB监听器及监听器下的所有资源
     name: nginx 
   spec: 
     ports: 
     - name: service0 
       port: 80   # ELB监听器端口
       protocol: TCP 
       targetPort: 80
     selector: 
       app: nginx 
     type: LoadBalancer
   ```
   表1annotation关键参数说明 
   | 参数                                                     | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                               |
   |:---|:---|:---|:---|
   | kubernetes.io/elb.id                                   | 是    | String | ELB的ID，仅支持使用已有ELB实例。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                                           |
   | kubernetes.io/elb.class                                | 是    | String | ELB类型。取值为union或performance。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                                    |
   | kubernetes.io/elb.multicluster                         | 是    | String | 取值为true，表示开启Service跨集群访问。                                                                                                                                                                                                                                                                                        |
   | kubernetes.io/elb.multicluster-loadbalancer-weight     | 否    | String | 集群Service接收流量的权重，权重可填0-100，数值越大被分发的流量越多。不填写该注解时权重默认为1。 说明： 删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。                                                                                                                         |
   | kubernetes.io/elb.multicluster-resource-recycle-policy | 是    | String | ELB资源的删除策略，默认为member-only。 - member-only：只清理ELB的后端云服务器。  - cascade：强制回收ELB监听器及监听器下的所有资源。如需强制回收，推荐只在首个Service上配置cascade。   |
      
   
   
2. 在集群B中创建Service。 
   ```
   apiVersion: v1 
   kind: Service 
   metadata: 
     annotations:
       kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID，替换为实际值
       kubernetes.io/elb.class: performance  # ELB类型
       kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
       kubernetes.io/elb.multicluster-loadbalancer-weight: '20'  # 集群Service接收流量的权重
       kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略，member-only只会清理ELB的后端云服务器，为缺省值；cascade策略则会强制回收ELB监听器及监听器下的所有资源
     name: nginx 
   spec: 
     ports: 
     - name: service0 
       port: 80   # ELB监听器端口，与集群A中的Service保持一致
       protocol: TCP 
       targetPort: 80
     selector: 
       app: nginx 
     type: LoadBalancer
   ```
   
   
 
 #### 为ELB配置不同VPC间的跨集群后端
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
- 集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
- 仅支持已有的**独享型ELB**实例。
- 需要在ELB操作界面打开"IP类型后端"开关。详情请参见[配置不同VPC的服务器作为后端服务器（IP类型后端）](https://support.huaweicloud.com/usermanual-elb/elb_ug_hd3_0004_03.html)。
- 两个VPC网段不能冲突，需要给两个VPC创建对等连接，配置方法请参见[对等连接](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0046809840.html)。
- 与ELB不同VPC的集群，集群node安全组（云原生2.0网络时为eni安全组）入方向需要放通源地址为ELB所在VPC网段。
- ELB添加跨VPC后端，集群对应的安全组需要放通负载均衡器的后端子网网段、且不支持UDP类型监听器，详情请参见[ELB约束限制](https://support.huaweicloud.com/bestpractice-elb/elb_bp_0301.html#section3)。
 
假设集群A和集群B位于不同的VPC中，且ELB位于其中一个集群所在的VPC中。配置不同VPC间跨集群访问，步骤如下：
1. 在集群A中创建Service。 
   ```
   apiVersion: v1 
   kind: Service 
   metadata: 
     annotations:
       kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID，替换为实际值
       kubernetes.io/elb.class: performance  # ELB类型
       kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
       kubernetes.io/elb.multivpc: 'true'
       kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
       kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略，member-only只会清理ELB的后端云服务器，为缺省值；cascade策略则会强制回收ELB监听器及监听器下的所有资源
     name: nginx 
   spec: 
     ports: 
     - name: service0 
       port: 80   # ELB监听器端口
       protocol: TCP 
       targetPort: 80
     selector: 
       app: nginx 
     type: LoadBalancer
   ```
   表2annotation关键参数说明 
   | 参数                                                     | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|:---|:---|
   | kubernetes.io/elb.id                                   | 是    | String | ELB的ID，仅支持使用已有ELB实例。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                                              |
   | kubernetes.io/elb.class                                | 是    | String | ELB类型。只能使用独享型ELB，即取值必须为performance。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                               |
   | kubernetes.io/elb.multicluster                         | 是    | String | 取值为true，表示开启Service跨集群访问。                                                                                                                                                                                                                                                                                           |
   | kubernetes.io/elb.multivpc                             | 否    | String | 取值为true，表示开启不同VPC间跨集群访问，需要在kubernetes.io/elb.multicluster开关为true的情况下启用。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                           |
   | kubernetes.io/elb.multicluster-loadbalancer-weight     | 否    | String | 集群Service接收流量的权重，权重可填0-100，数值越大被分发的流量越多。不填写该注解时权重默认为1。 说明： 删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。                                                                                                                             |
   | kubernetes.io/elb.multicluster-resource-recycle-policy | 是    | String | ELB资源的删除策略，默认为member-only。 - member-only：只清理ELB的后端云服务器。  - cascade：强制回收ELB监听器及监听器下的所有资源。如需强制回收，推荐只在首个Service上配置cascade。   |
      
   
   
2. 在集群B中创建Service。 
   ```
   apiVersion: v1 
   kind: Service 
   metadata: 
     annotations:
       kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID，替换为实际值
       kubernetes.io/elb.class: performance  # ELB类型
       kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
       kubernetes.io/elb.multivpc: 'true'
       kubernetes.io/elb.multicluster-loadbalancer-weight: '20'  # 集群Service接收流量的权重
       kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略，member-only只会清理ELB的后端云服务器，为缺省值；cascade策略则会强制回收ELB监听器及监听器下的所有资源
     name: nginx 
   spec: 
     ports: 
     - name: service0 
       port: 80   # ELB监听器端口，与集群A中的Service保持一致
       protocol: TCP 
       targetPort: 80
     selector: 
       app: nginx 
     type: LoadBalancer
   ```
   
   
 
 #### 为ELB监听器配置同VPC内的ECS后端
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
集群A和ECS位于同一VPC内，且该VPC内已存在一个ELB。配置同VPC内跨集群的后端，集群A的Service接收流量权重设置为80，并添加2台ECS后端，设置接收流量权重为20。步骤如下：
1. 在ELB服务创建好监听器（如80端口监听器）及后端服务器组，手动添加ECS后端服务器，并将总权重设置为20。操作详情请参见[配置同VPC的服务器作为后端服务器](https://support.huaweicloud.com/usermanual-elb/elb_ug_hd3_0004.html)。
   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001980261046.png "点击放大")
   
   
2. 在集群A中创建Service，对接到已经创建好的80端口监听器，Service权重设置为80。 
   ```
   apiVersion: v1 
   kind: Service 
   metadata: 
     annotations:
       kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID，替换为实际值
       kubernetes.io/elb.class: performance  # ELB类型
       kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
       kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
       kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略，member-only只会清理ELB的后端云服务器，为缺省值；cascade策略则会强制回收ELB监听器及监听器下的所有资源
     name: nginx 
   spec: 
     ports: 
     - name: service0 
       port: 80   # 对接ELB的80监听器端口
       protocol: TCP 
       targetPort: 80
     selector: 
       app: nginx 
     type: LoadBalancer
   ```
   表3annotation关键参数说明 
   | 参数                                                     | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|:---|:---|
   | kubernetes.io/elb.id                                   | 是    | String | ELB的ID，仅支持使用已有ELB实例。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                                             |
   | kubernetes.io/elb.class                                | 是    | String | ELB类型。取值为union或performance。**该参数在创建完成后不可修改**。                                                                                                                                                                                                                                                                      |
   | kubernetes.io/elb.multicluster                         | 是    | String | 取值为true，表示开启Service跨集群访问。                                                                                                                                                                                                                                                                                          |
   | kubernetes.io/elb.multicluster-loadbalancer-weight     | 否    | String | 集群Service接收流量的权重。不填写该注解时权重默认为1。 说明： 删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。                                                                                                                                                  |
   | kubernetes.io/elb.multicluster-resource-recycle-policy | 是    | String | ELB资源的删除策略，默认为member-only。 - member-only：只清理ELB的后端云服务器。  - cascade：强制回收ELB监听器及监听器下的所有资源。如需强制回收，推荐只在首个Service上配置cascade。   |
      
   
   
3. 观察ELB后端服务器组中集群容器实例已经添加，且总权重为80。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001980420782.png "点击放大")
   
   
 
#### 相关文档
当您开启跨集群后端*kubernetes.io/elb.multicluster: 'true'* 时，如果需要为StatefulSet后端Pod配置权重，请将其中的*kubernetes.io/elb.multicluster-loadbalancer-weight* 配置换成*kubernetes.io/elb.custom-backend-weights* 配置，其余配置不变。关于该配置的详细使用方式请参见[为负载均衡类型的Service配置StatefulSet后端Pod的权重](https://support.huaweicloud.com/usermanual-cce/cce_10_1026.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*配置。
