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
- 创建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中配置。
- 使用ListenerSet
- 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 - 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: HTTPSHTTPS协议的监听器需要在lsconfig中配置证书,详见监听器参数配置(lsconfig)。
- Gateway开启ListenerSet
- 配置HTTPRoute关联Service后,可访问后端服务。
创建Gateway后关联已有ELB
- 创建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 # 监听端口 - 配置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主要参数
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| 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范围,默认不允许。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| type | 是 | String | 地址类型。已有ELB固定填gateway.cce.io/loadbalancer-id。 |
| value | 是 | String | ELB实例ID。实例必须存在且VPC匹配集群。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| 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}}。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| namespaces | 否 | RouteNamespaces object | 允许路由来源的命名空间范围。 |
| kinds | 否 | Array of RouteGroupKind objects | 允许附加的路由类型,最多8项,不填则按协议自动推断。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| from | 否 | String | 取值Same(默认)、All、Selector。Same:仅支持同命名空间的HTTPRoute绑定。All:支持所有命名空间的HTTPRoute绑定。Selector:支持符合selector条件的命名空间中的HTTPRoute绑定。 |
| selector | 条件必填 | LabelSelector object | from为Selector时必填。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| group | 否 | String | 路由组,默认gateway.networking.k8s.io。 |
| kind | 是 | String | 路由类型。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| from | 否 | String | 取值Same、All、Selector、None(默认)。
|
| selector | 条件必填 | LabelSelector object | from为Selector时必填。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| group | 是 | String | 引用资源的Group。 |
| kind | 是 | String | 引用资源的Kind。 |
| name | 是 | String | 引用资源的Name,1-253字符。 |
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| 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时此字段必填,用于筛选允许的命名空间集合。
ListenerSet主要参数
| 参数 | 是否必填 | 参数类型 | 描述 |
|---|---|---|---|
| parentRef | 是 | ParentGatewayReference object | 引用的父Gateway。父Gateway须通过AllowedListeners显式允许ListenerSet附加。 |
| listeners | 是 | Array of Listener objects | 监听器列表,最少1个,最多64个。 |