更新时间:2026-11-10 GMT+08:00
分享

Gateway与ListenerSet参数配置

在ELB Gateway架构中,Gateway用于定义集群入口的负载均衡器(ELB)实例及其监听规则;ListenerSet则是专门用于扩展和独立管理Gateway监听器(Listener)集合的CRD资源。两者配合使用,能够实现多协议支持、证书动态绑定及跨团队监听器解耦管理。本文主要介绍Gateway与ListenerSet的参数配置。

前提条件

集群版本已支持ELB Gateway功能。

约束与限制

在Gateway、ListenerSet中的listeners字段中配置域名和证书无效,需要在ListenerConfiguration中配置。

架构与关联机制

  • 核心Gateway资源:定义基本网关属性,可以包含默认监听器或直接引用外部ListenerSet。
  • ListenerSet扩展:当监听器数量较多或由不同团队独立维护时,可通过创建ListenerSet资源并显式关联到指定Gateway上,动态向ELB附加监听端口。

创建Gateway后自动创建ELB

  1. 创建Gateway关联CCE管理的GatewayClass

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway                      # 资源类型为 Gateway
    metadata:
      name: cce-gateway              # Gateway 名称
      namespace: default
    spec:
      gatewayClassName: cce-shared-internal  # GatewayClass 名称
      listeners:
        - name: http
          protocol: HTTP               # 协议
          port: 80                     # 监听端口

    在Gateway中的listeners里配置域名和证书无效,需要在listenerConfig中配置。

  2. 使用ListenerSet

    1. Gateway开启ListenerSet

      同命名空间:

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: parent-gateway
        namespace: default
      spec:
        gatewayClassName: cce-shared-internal
        # 必填:开启 ListenerSet 挂载许可
        allowedListeners:
          namespaces:
            from: Same       # 可选: Same (仅同命名空间), All (跨所有命名空间), Selector (按 Label 筛选)
        listeners:
          - name: default-http
            port: 80
            protocol: HTTP

      指定命名空间:

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: parent-gateway
        namespace: default
      spec:
        gatewayClassName: cce-shared-internal
        # 必填:开启 ListenerSet 挂载许可
        allowedListeners:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
                - key: kubernetes.io/metadata.name       #指定允许 ns-a、ns-b 和 ns-c 这三个特定命名空间挂载
                  operator: In
                  values:
                    - ns-a
                    - ns-b
                    - ns-c
        listeners:
          - name: default-http
            port: 80
            protocol: HTTP
    2. ListenerSet关联Gateway
      apiVersion: gateway.networking.k8s.io/v1
      kind: ListenerSet
      metadata:
        name: app-team-listeners
        namespace: default
      spec:
        # 绑定到目标 Gateway
        parentRef:
          group: gateway.networking.k8s.io
          kind: Gateway
          name: parent-gateway
          namespace: default      #Gateway的命名空间,同命名空间可不填
        # 定义该集合下的专属监听规则
        listeners:
          - name: https-app
            port: 443
            protocol: HTTPS

      HTTPS协议的监听器需要在lsconfig中配置证书,详见监听器参数配置(lsconfig)。

  3. 配置HTTPRoute关联Service后,可访问后端服务。

创建Gateway后关联已有ELB

  1. 创建Gateway关联已有ELB
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway                      # 资源类型为 Gateway
    metadata:
      name: cce-gateway              # Gateway 名称
      namespace: default
    spec:
      gatewayClassName: cce-existing-elb  # 使用已有ELB的GatewayClass
      addresses:
        - type: gateway.cce.io/loadbalancer-id
          value: "<ELB实例ID>"
      listeners:
        - name: http
          protocol: HTTP               # 协议
          port: 80                     # 监听端口
  2. 配置HTTPRoute关联Service后,可访问后端服务

配置Gateway/ListenerSet跨命名空间绑定HTTPRoute

挂载控制机制说明

  • 默认行为:默认情况下,Gateway和ListenerSet仅允许与自身位于同一命名空间(Same)的HTTPRoute进行绑定。
  • 跨命名空间挂载:若需允许其他命名空间的HTTPRoute挂载,需要在指定的Listener中显式配置allowedRoutes.namespaces控制策略。

配置示例

在listeners的配置条目中,通过修改allowedRoutes.namespaces的from字段来实现访问控制。以下以Gateway为例(ListenerSet配置方式相同):

场景一:允许任意命名空间挂载

将from设置为All,表示该Listener接收集群内任意命名空间定义的HTTPRoute。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: cce-gateway
  namespace: default
spec:
  gatewayClassName: cce-shared-internal  
  listeners:
    - allowedRoutes:
        namespaces:
          from: All            # 可选: Same (仅同命名空间), All (跨所有命名空间), Selector (按 Label 筛选)
      name: default-http
      port: 80
      protocol: HTTP

场景二:仅允许特定命名空间挂载(使用Label选择器)

将from设置为Selector,并结合selector匹配规则,可精细化控制仅允许指定Namespace挂载。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: cce-gateway
  namespace: default
spec:
  gatewayClassName: cce-shared-internal
  listeners:
    - allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchExpressions:
              - key: kubernetes.io/metadata.name       #指定允许 ns-a、ns-b 和 ns-c 这三个特定命名空间挂载
                operator: In
                values:
                  - ns-a
                  - ns-b
                  - ns-c
      name: default-http
      port: 80
      protocol: HTTP

Gateway主要参数

表1 GatewaySpec

参数

是否必填

参数类型

描述

gatewayClassName

是

String

GatewayClass名称。已有ELB场景固定填cce-existing-elb,创建后不可变。

listeners

是

Array of Listener objects

监听器列表,最少1个,最多64个。

addresses

是

Array of GatewaySpecAddress objects

地址列表,已有ELB场景必填。最多16个。ELB ID创建后不可变。

infrastructure

否

GatewayInfrastructure object

基础设施级属性,可绑定LBConfig,自定义ELB参数。

allowedListeners

否

AllowedListeners object

允许附加的ListenerSet范围,默认不允许。

表2 GatewaySpecAddress

参数

是否必填

参数类型

描述

type

是

String

地址类型。已有ELB固定填gateway.cce.io/loadbalancer-id。

value

是

String

ELB实例ID。实例必须存在且VPC匹配集群。

表3 Listener

参数

是否必填

参数类型

描述

name

是

String

监听器名称,Gateway内唯一。

port

是

Integer

监听端口,范围1-65535。同Gateway内端口+协议+主机名组合须唯一;同ELB下端口不可冲突。修改端口需要同时修改name。

protocol

是

String

协议:HTTP、HTTPS。修改协议需要同时修改name。

hostname

否

String

当前不支持在Gateway中配置,请在ListenerConfiguration(lsconfig)中配置证书。

tls

条件必填

ListenerTLSConfig

TLS配置。当前不支持在Gateway中配置,请在lsconfig中配置证书。

allowedRoutes

否

AllowedRoutes object

允许附加的路由规则,默认 {namespaces: {from: Same}}。

表4 AllowedRoutes

参数

是否必填

参数类型

描述

namespaces

否

RouteNamespaces object

允许路由来源的命名空间范围。

kinds

否

Array of RouteGroupKind objects

允许附加的路由类型,最多8项,不填则按协议自动推断。

表5 RouteNamespaces

参数

是否必填

参数类型

描述

from

否

String

取值Same(默认)、All、Selector。Same:仅支持同命名空间的HTTPRoute绑定。All:支持所有命名空间的HTTPRoute绑定。Selector:支持符合selector条件的命名空间中的HTTPRoute绑定。

selector

条件必填

LabelSelector object

from为Selector时必填。

表6 RouteGroupKind

参数

是否必填

参数类型

描述

group

否

String

路由组,默认gateway.networking.k8s.io。

kind

是

String

路由类型。

表7 AllowedListeners

参数

是否必填

参数类型

描述

namespaces

否

ListenerNamespaces object

ListenerSet来源命名空间范围。

表8 ListenerNamespaces

参数

是否必填

参数类型

描述

from

否

String

取值Same、All、Selector、None(默认)。

  • Same:仅支持同命名空间的ListenerSet挂载。
  • All:支持所有命名空间的ListenerSet挂载。
  • Selector:支持符合selector条件的命名空间中的ListenerSet挂载。
  • None:不支持ListenerSet挂载。

selector

条件必填

LabelSelector object

from为Selector时必填。

表9 GatewayInfrastructure

参数

是否必填

参数类型

描述

parametersRef

否

LocalParametersReference object

配置参数引用。

表10 LocalParametersReference

参数

是否必填

参数类型

描述

group

是

String

引用资源的Group。

kind

是

String

引用资源的Kind。

name

是

String

引用资源的Name,1-253字符。

表11 LabelSelector

参数

是否必填

参数类型

描述

matchLabels

否

Object

{key: value} 精确匹配键值对映射。等价于matchExpressions中operator为In且values仅含该value的条目。各条目之间为AND。不填(空对象)匹配所有资源,nil匹配无资源。

matchExpressions

否

Array of LabelSelectorRequirement objects

标签选择器表达式列表,各条件之间为AND。与matchLabels同时存在时取交集。

matchLabels与matchExpressions的结果取AND。空LabelSelector(两个字段都不填)匹配所有对象;nil LabelSelector匹配无对象。在Gateway场景中,当from为Selector时此字段必填,用于筛选允许的命名空间集合。

表12 LabelSelectorRequirement

参数

是否必填

参数类型

描述

key

是

String

标签键名,选择器作用对象。

operator

是

String

键与值的关系运算符。

取值:In(值在集合中)、NotIn(值不在集合中)、Exists(键存在)、DoesNotExist(键不存在)

values

条件必填

Array of strings

值数组。operator为In/NotIn时必须非空;operator为Exists/DoesNotExist时必须为空。

ListenerSet主要参数

表13 GatewaySpec

参数

是否必填

参数类型

描述

parentRef

是

ParentGatewayReference object

引用的父Gateway。父Gateway须通过AllowedListeners显式允许ListenerSet附加。

listeners

是

Array of Listener objects

监听器列表,最少1个,最多64个。

表14 ParentGatewayReference

参数

是否必填

参数类型

描述

group

否

String

引用资源的Group,默认gateway.networking.k8s.io。

kind

否

String

引用资源的Kind,默认Gateway。

name

是

String

父Gateway名称。创建后不可变。

namespace

否

String

父Gateway命名空间。不填则默认与ListenerSet同命名空间。创建后不可变。

相关文档