
# 为负载均衡类型的Service配置全端口转发
在使用弹性负载均衡（ELB）与集群中的Service对接时，通常情况下ELB监听器将流量转发到后端Pod的固定端口。当您需要让ELB将流量转发到与监听器端口一致的后端Pod端口时（例如监听器端口80转发到后端端口80、端口81转发到端口81），这种固定端口转发的方式无法满足需求。
CCE支持通过ELB v3独享型实例的Pool级别全端口转发能力。开启后，后端服务器端口与前端监听器端口保持一致。结合区间端口监听器，可实现一个监听器覆盖整个端口区间，区间内每个端口转发到后端Pod的相同端口，无需逐条配置端口映射规则。
#### 功能说明
**全端口转发机制**
全端口转发是后端服务器组级别的属性。开启后，后端服务器端口与前端监听器端口保持一致：
- **未开启（默认）**：所有监听器端口的流量均转发到后端Pod的固定容器端口。例如监听器端口80、81的流量都转发到后端Pod的同一端口。
- **开启后**：后端Pod端口自动与前端监听器端口保持一致。监听器端口80的流量转发到后端Pod端口80，端口81转发到端口81，依此类推。
**与端口区间监听器配合使用**
全端口转发通常与[端口区间监听器](https://support.huaweicloud.com/usermanual-cce/cce_10_0929.html)（kubernetes.io/elb.port-ranges）配合使用，实现一个监听器覆盖整个端口区间，区间内每个端口转发到后端的相同端口。
| 能力     | 对应注解                                                    | 作用                  |
|:---|:---|:---|
| 端口区间监听 | kubernetes.io/elb.port-ranges                           | 一个监听器覆盖多个端口（如80-90） |
| 全端口转发  | kubernetes.io/elb.pools-options（any_port_enabled: true） | 后端端口与监听器端口自动对齐      |
   
两者结合后，监听器端口与后端 Pod 端口按序号一一对应（80对应80、81对应81......90对应90），区间内每个端口的请求自动转发到后端Pod的对应端口，无需逐条配置转发规则。
#### 前提条件
- 已创建CCE Turbo集群，其他类型的集群不支持该功能。
- 集群版本满足以下要求：
  - v1.30集群：v1.30.14-r100及以上版本
  
  - v1.31集群：v1.31.14-r60及以上版本
  
  - v1.32集群：v1.32.13-r30及以上版本
  
  - v1.33集群：v1.33.12-r10及以上版本
  
  - v1.34集群：v1.34.8-r10及以上版本
  
  - v1.35集群：v1.35.5-r10及以上版本
  
  - v1.36集群：v1.36.2-r0及以上版本
  
  - 其他更高版本的集群
   
 
#### 约束与限制
- 仅独享型负载均衡实例支持此功能。
- 仅TCP、UDP、QUIC协议的后端服务器组支持全端口转发。HTTP、HTTPS、TLS协议不支持。
- 开启全端口转发仅在创建Pool时生效，Pool创建后不支持通过更新修改此字段。
- 全端口转发功能依赖ELB能力，使用该功能前请提交工单申请开通ELB相关能力。
 
#### 通过kubectl配置全端口转发
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"service-fullport.yaml"的YAML文件，此处文件名可自定义。 
   ```
   vi service-fullport.yaml
   ```
   以关联已有ELB为例，YAML配置文件如下：
   ```
   apiVersion: v1
      kind: Service
      metadata:
        name: test-fullport
        labels:
          app: test-app
        namespace: default
        annotations:
          kubernetes.io/elb.class: performance    # ELB实例类型，此功能只支持独享型（performance）
          kubernetes.io/elb.id: <your_elb_id>    # ELB ID，替换为实际值
          # 配置端口区间监听器，端口80到90
          kubernetes.io/elb.port-ranges: |
            {"cce-service-0":["80,90"]}
          # 配置Pool全端口转发
          kubernetes.io/elb.pools-options: |
            [{"protocol":"TCP","lb_algorithm":"ROUND_ROBIN","any_port_enabled":true}]
          # 配置健康检查（可选），monitor_port不指定时使用targetPort兜底
          kubernetes.io/elb.health-check-flag: 'on'
          kubernetes.io/elb.health-check-option: |
            {"protocol":"TCP","delay":"5","timeout":"10","max_retries":"3"}
      spec:
        selector:
          app: test-app
        externalTrafficPolicy: Cluster
        ports:
          - name: cce-service-0
            targetPort: 80          # 开启any_port_enabled后，转发端口由监听器端口决定，targetPort用于健康检查兜底
            nodePort: 0
            port: 80                # 端口区间起始端口，需与port-ranges配置一致
            protocol: TCP
        type: LoadBalancer
   ```
   关键参数描述如下：
   - **kubernetes.io/elb.pools-options** ：后端服务器组配置，支持设置后端协议、分配策略类型以及会话保持。注解值格式为JSON字符串数组，具体配置项和说明如下表所示。
     ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
     配置kubernetes.io/elb.pools-options注解后，不支持同时配置老的分配策略（kubernetes.io/elb.lb-algorithm）、会话保持（kubernetes.io/elb.session-affinity-option或kubernetes.io/elb.session-affinity-options）、后端协议（kubernetes.io/elb.security-pool-protocol）注解。
     表1后端服务器组配置参数说明 
     | **参数名**          | **是否必选** | **参数类型** | **参数说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     |:---|:---|:---|:---|
     | protocol         | 是        | String   | 后端协议。指定后端服务器使用的协议类型。 - 约束：前端协议和端口未改变时，无法更新此参数。自定义配置时需与前端监听器协议匹配；全局配置时无此限制。  - 取值范围：TCP、TLS、UDP、HTTP、HTTPS、QUIC                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
     | lb_algorithm     | 是        | String   | 分配策略类型（负载均衡算法）。 - 约束：取值为SOURCE_IP或QUIC_CID 时，后端服务器的weight字段无效；仅protocol为 QUIC时才支持QUIC_CID算法。  - 取值范围： - ROUND_ROBIN：加权轮询算法  - LEAST_CONNECTIONS：加权最少连接算法  - SOURCE_IP：源IP算法  - QUIC_CID：连接ID算法    - 默认值：后端协议为QUIC时只能为QUIC_CID；其他协议默认为ROUND_ROBIN。   |
     | any_port_enabled | 否        | Boolean  | 全端口转发开关。控制后端端口是否与前端监听器端口保持一致。 - 约束：仅TCP、UDP、QUIC协议支持。  - 取值范围： - true：开启，后端端口与监听器端口自动对齐  - false：关闭，请求转发至后端 protocol_port指定端口                                                                                                                                                                                                                                                                                                           |
        
     
   
   - **kubernetes.io/elb.port-ranges**
     表2区间端口监听参数说明 
     | 参数                            | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
     |:---|:---|:---|:---|
     | kubernetes.io/elb.port-ranges | 是    | String | 使用独享型ELB且选择TCP/UDP/TLS协议时，支持创建某个端口范围的监听器，端口范围1\~65535，您最多可为每个监听器添加10个互不重叠的监听端口段。 参数值格式如下，ports_name和port均不允许重复： ``` '{"<ports_name_1>":["<port_1>,<port_2>","<port_3>,<port_4>"], "<ports_name_2>":["<port_5>,<port_6>","<port_7>,<port_8>"]}' ``` 例如以下示例表示，端口配置名称为cce-service-0，其监听端口范围为100\~200和300\~400；端口配置名称为cce-service-1，其监听端口范围为500\~600和700\~800。 ``` '{"cce-service-0":["100,200", "300,400"], "cce-service-1":["500,600", "700,800"]}' ``` |
        
     
   
   
   
   
3. 创建Service。 
   ```
   kubectl create -f service-test.yaml
   ```
   回显如下，表示Service已创建。
   ```
   service/service-test created
   ```
   
   
4. 验证全端口转发设置成功。 
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
   
   2. 在左侧导航栏中选择"服务"，找到新建Service所在行，单击负载均衡名称跳转至ELB控制台查看。
   
   3. 切换至"监听器"页签，查看监听器的后端服务器已添加辅助弹性网卡，并确认业务端口显示全端口转发。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002693391891.png "点击放大")
      
   
   
   
   
 
#### 健康检查端口配置
开启全端口转发后，如果同时开启健康检查，则必须配置健康检查端口号。健康检查端口不随监听器端口动态变化，需要一个固定端口用于探测后端服务可用性。
#### 端口确定规则
健康检查端口的确定规则按优先级从低到高如下：
1. **容器端口兜底**（优先级最低）：如果未指定健康检查端口，系统自动使用Service的 targetPort（容器端口）作为健康检查端口号。开启全端口转发时，需确保 targetPort 为有效的整数端口号（如80），不能使用命名端口（如http），否则兜底逻辑不生效。
2. **配置cce-healthz**（优先级中）：如果使用全局健康检查配置 kubernetes.io/elb.health-check-option，且Service中存在名为 cce-healthz 的端口，则使用 cce-healthz 端口的 targetPort 作为所有端口的健康检查端口。
3. **配置monitor_port**（优先级最高）：如果通过 kubernetes.io/elb.health-check-options 注解为某端口显式配置了 monitor_port，则以该配置端口号为准。
 
#### 配置示例
- 方式一：未指定健康检查端口，使用targetPort兜底，健康检查端口示例为80
  ```
  annotations:
    kubernetes.io/elb.health-check-option: |
      {"protocol":"TCP","delay":"5","timeout":"10","max_retries":"3"}
  spec:
    ports:
      - name: cce-service-0
        port: 80
        targetPort: 80               # 健康检查端口 = 80（兜底）
        protocol: TCP
  ```
  
- 方式二：使用全局health-check-option + cce-healthz，健康检查端口示例为8080
  ```
  annotations:
    kubernetes.io/elb.health-check-option: |
      {"protocol":"TCP","delay":"5","timeout":"10","max_retries":"3"}
  spec:
    ports:
      - name: cce-service-0          # 业务端口
        port: 80
        targetPort: 80
        protocol: TCP
      - name: cce-healthz            # 健康检查端口，名称固定为cce-healthz
        port: 80
        targetPort: 8080             # 健康检查将探测此端口
        protocol: TCP
  ```
  
- 方式三：自定义健康检查显式配置monitor_port，健康检查端口示例为8080
  ```
  annotations:
    kubernetes.io/elb.health-check-options: |
      [{"target_service_port":"TCP:80","protocol":"TCP","delay":"5","timeout":"10","max_retries":"3","monitor_port":"8080"}]
  ```
  
 
#### 相关文档
- 需要了解端口区间监听器的详细配置时，请查看[为负载均衡类型的Service配置区间端口监听](https://support.huaweicloud.com/usermanual-cce/cce_10_0929.html)。
- 需要了解后端服务器组（Pool）的完整参数配置时，请查看[为负载均衡类型的Service配置后端为QUIC协议的UDP监听器](https://support.huaweicloud.com/usermanual-cce/cce_10_1107.html)。
 
