为负载均衡类型的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配置全端口转发
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“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"]}'
- kubernetes.io/elb.pools-options:后端服务器组配置,支持设置后端协议、分配策略类型以及会话保持。注解值格式为JSON字符串数组,具体配置项和说明如下表所示。
- 创建Service。
kubectl create -f service-test.yaml
回显如下,表示Service已创建。
service/service-test created
- 验证全端口转发设置成功。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“服务”,找到新建Service所在行,单击负载均衡名称跳转至ELB控制台查看。
- 切换至“监听器”页签,查看监听器的后端服务器已添加辅助弹性网卡,并确认业务端口显示全端口转发。
健康检查端口配置
开启全端口转发后,如果同时开启健康检查,则必须配置健康检查端口号。健康检查端口不随监听器端口动态变化,需要一个固定端口用于探测后端服务可用性。
端口确定规则
健康检查端口的确定规则按优先级从低到高如下:
- 容器端口兜底(优先级最低):如果未指定健康检查端口,系统自动使用Service的 targetPort(容器端口)作为健康检查端口号。开启全端口转发时,需确保 targetPort 为有效的整数端口号(如80),不能使用命名端口(如http),否则兜底逻辑不生效。
- 配置cce-healthz(优先级中):如果使用全局健康检查配置 kubernetes.io/elb.health-check-option,且Service中存在名为 cce-healthz 的端口,则使用 cce-healthz 端口的 targetPort 作为所有端口的健康检查端口。
- 配置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配置区间端口监听。
- 需要了解后端服务器组(Pool)的完整参数配置时,请查看为负载均衡类型的Service配置后端为QUIC协议的UDP监听器。