更新时间:2026-08-26 GMT+08:00

为负载均衡类型的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,以此类推。

与端口区间监听器配合使用

全端口转发通常与端口区间监听器(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连接集群,使用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字符串数组,具体配置项和说明如下表所示。

      配置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控制台,单击集群名称进入集群。
    2. 在左侧导航栏中选择“服务”,找到新建Service所在行,单击负载均衡名称跳转至ELB控制台查看。
    3. 切换至“监听器”页签,查看监听器的后端服务器已添加辅助弹性网卡,并确认业务端口显示全端口转发。

健康检查端口配置

开启全端口转发后,如果同时开启健康检查,则必须配置健康检查端口号。健康检查端口不随监听器端口动态变化,需要一个固定端口用于探测后端服务可用性。

端口确定规则

健康检查端口的确定规则按优先级从低到高如下:

  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"}]

相关文档