# 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                     # 监听端口
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
   在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）](https://support.huaweicloud.com/usermanual-cce/cce_10_1183.html)。
      
   
   
   
   
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主要参数
表1GatewaySpec 
| 参数                | 是否必填 | 参数类型                                                                       | 描述                                               |
|:---|:---|:---|:---|
| 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范围，默认不允许。                          |
   
 表2GatewaySpecAddress 
| 参数   | 是否必填 | 参数类型 | 描述                                            |
|:---|:---|:---|:---|
| type | 是    | String  | 地址类型。已有ELB固定填gateway.cce.io/loadbalancer-id。 |
| value  | 是   | String | ELB实例ID。实例必须存在且VPC匹配集群。                       |
   
 表3Listener 
| 参数            | 是否必填 | 参数类型                                                      | 描述                                                                 |
|:---|:---|:---|:---|
| 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}}。                            |
   
 表4AllowedRoutes 
| 参数            | 是否必填 | 参数类型                                                               | 描述                            |
|:---|:---|:---|:---|
| namespaces | 否    | [RouteNamespaces] object         | 允许路由来源的命名空间范围。               |
| kinds       | 否     | Array of [RouteGroupKind] objects | 允许附加的路由类型，最多8项，不填则按协议自动推断。 |
   
 表5RouteNamespaces 
| 参数       | 是否必填 | 参数类型                                                   | 描述                                                                                                                       |
|:---|:---|:---|:---|
| from     | 否    | String                                                | 取值Same（默认）、All、Selector。Same：仅支持同命名空间的HTTPRoute绑定。All：支持所有命名空间的HTTPRoute绑定。Selector：支持符合selector条件的命名空间中的HTTPRoute绑定。 |
| selector | 条件必填  | [LabelSelector] object | from为Selector时必填。                                                                                                     |
   
 表6RouteGroupKind 
| 参数   | 是否必填 | 参数类型    | 描述                            |
|:---|:---|:---|:---|
| group | 否 | String | 路由组，默认gateway.networking.k8s.io。 |
| kind    | 是  | String | 路由类型。                         |
   
 表7AllowedListeners 
| 参数           | 是否必填 | 参数类型                                                         | 描述                   |
|:---|:---|:---|:---|
| namespaces | 否    | [ListenerNamespaces] object | ListenerSet来源命名空间范围。 |
   
 表8ListenerNamespaces 
| 参数      | 是否必填 | 参数类型                                                    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| from   | 否  | String                                                  | 取值Same、All、Selector、None（默认）。 - Same：仅支持同命名空间的ListenerSet挂载。  - All：支持所有命名空间的ListenerSet挂载。  - Selector：支持符合selector条件的命名空间中的ListenerSet挂载。  - None：不支持ListenerSet挂载。   |
| selector | 条件必填  | [LabelSelector] object | from为Selector时必填。                                                                                                                                                                                                                                                                                                                                                                                                                |
   
 表9GatewayInfrastructure 
| 参数          | 是否必填 | 参数类型                                                              | 描述       |
|:---|:---|:---|:---|
| parametersRef | 否   | [LocalParametersReference] object | 配置参数引用。 |
   
 表10LocalParametersReference 
| 参数   | 是否必填 | 参数类型      | 描述                 |
|:---|:---|:---|:---|
| group | 是     | String    | 引用资源的Group。        |
| kind | 是       | String | 引用资源的Kind。        |
| name  | 是     | String   | 引用资源的Name，1-253字符。 |
   
 表11LabelSelector 
| 参数              | 是否必填 | 参数类型                                                                             | 描述                                                                                                        |
|:---|:---|:---|:---|
| matchLabels       | 否     | Object                                                                           | {key: value} 精确匹配键值对映射。等价于matchExpressions中operator为In且values仅含该value的条目。各条目之间为AND。不填（空对象）匹配所有资源，nil匹配无资源。 |
| matchExpressions | 否     | Array of [LabelSelectorRequirement] objects | 标签选择器表达式列表，各条件之间为AND。与matchLabels同时存在时取交集。                                                                |
   
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
matchLabels与matchExpressions的结果取AND。空LabelSelector（两个字段都不填）匹配所有对象；nil LabelSelector匹配无对象。在Gateway场景中，当from为Selector时此字段必填，用于筛选允许的命名空间集合。
 表12LabelSelectorRequirement 
| 参数        | 是否必填   | 参数类型           | 描述                                                                                                 |
|:---|:---|:---|:---|
| key     | 是     | String         | 标签键名，选择器作用对象。                                                                                     |
| operator | 是     | String           | 键与值的关系运算符。 取值：In（值在集合中）、NotIn（值不在集合中）、Exists（键存在）、DoesNotExist（键不存在） |
| values     | 条件必填 | Array of strings | 值数组。operator为In/NotIn时必须非空；operator为Exists/DoesNotExist时必须为空。                                    |
   
#### ListenerSet主要参数
表13GatewaySpec 
| 参数        | 是否必填 | 参数类型                                                              | 描述                                                                                             |
|:---|:---|:---|:---|
| parentRef | 是   | [ParentGatewayReference] object | 引用的父Gateway。父Gateway须通过[AllowedListeners]显式允许ListenerSet附加。 |
| listeners  | 是   | Array of [Listener] objects      | 监听器列表，最少1个，最多64个。                                                                                |
   
 表14ParentGatewayReference 
| 参数          | 是否必填 | 参数类型   | 描述                                            |
|:---|:---|:---|:---|
| group      | 否  | String | 引用资源的Group，默认gateway.networking.k8s.io。       |
| kind      | 否  | String | 引用资源的Kind，默认Gateway。                          |
| name      | 是 | String | 父Gateway名称。创建后不可变。                           |
| namespace | 否   | String | 父Gateway命名空间。不填则默认与ListenerSet同命名空间。创建后不可变。 |
   
