4、核心资源定义:Gateway 资源对象的 YAML 结构、监听器(Listener)配置、主机名与端口绑定
在 Gateway API 资源配额模型中,Gateway 资源是流量入口的核心抽象。它定义了网络端点(如负载均衡器、Ingress Controller)的行为规范,包括监听协议、端口、主机名绑定以及 TLS 终止策略。本章将深入解析 Gateway 资源的 YAML 结构、监听器配置细节以及主机名与端口的绑定机制。
4.1 Gateway 资源 YAML 结构全景
一个标准的 Gateway 资源由 spec.gatewayClassName、spec.listeners 和 spec.addresses 三大部分组成。以下是一个典型的四层/七层混合网关定义:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-gateway
namespace: infra
spec:
gatewayClassName: acme-lb
listeners:
- name: https-app
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
mode: Terminate
certificateRefs:
- name: wildcard-example-tls
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
tier: frontend
- name: http-api
protocol: HTTP
port: 80
hostname: "api.example.com"
allowedRoutes:
namespaces:
from: All
addresses:
- type: IPAddress
value: 192.168.1.100
关键字段说明:
gatewayClassName:引用集群中预定义的 GatewayClass,决定底层实现(如 Nginx、Envoy、HAProxy)。listeners:核心配置数组,每个监听器独立定义协议、端口、主机名和 TLS。addresses:可选字段,显式指定网关的 IP 或主机名;未指定时由控制器自动分配。
4.2 监听器(Listener)配置详解
监听器是 Gateway 资源中最关键的配置单元。每个监听器代表一个独立的网络端点,支持以下核心属性:
| 字段 | 类型 | 说明 | 示例值 |
|---|---|---|---|
name |
string | 监听器唯一名称,同一 Gateway 内不可重复 | https-app |
protocol |
string | 监听协议:HTTP、HTTPS、TLS、TCP、UDP | HTTPS |
port |
int32 | 监听端口(1-65535),同一 Gateway 内端口+协议组合唯一 | 443 |
hostname |
string | 可选,主机名过滤,支持通配符 * |
*.example.com |
tls |
object | TLS 配置,仅 HTTPS/TLS 协议有效 | 见下文 |
allowedRoutes |
object | 路由访问控制,限制可绑定到此监听器的 Route 资源 | from: Selector |
协议选择建议:HTTP/HTTPS 用于七层路由(基于 Host/Path);TLS 用于四层 TLS 透传;TCP/UDP 用于四层原始流量。混合协议场景建议为每个协议组创建独立的监听器。
4.3 主机名与端口绑定机制
主机名与端口的绑定决定了流量如何被路由到后端服务。Gateway API 采用 监听器级主机名过滤 与 路由级主机名匹配 两层模型:
- 监听器级过滤:监听器通过
hostname字段声明其接受的主机名范围。例如*.example.com表示该监听器只处理子域名请求。 - 路由级匹配:HTTPRoute 或 TLSRoute 中的
spec.hostnames字段进一步精确匹配。路由的主机名必须属于监听器声明的范围。 - 端口唯一性:同一 Gateway 内,
port + protocol组合必须唯一。不同监听器可以共享同一端口(如 TCP 和 UDP 分别监听 53)。
4.4 监听器配置实战:多协议混合网关
在实际生产环境中,一个 Gateway 通常需要同时暴露 HTTP 和 HTTPS 服务。以下是一个多协议混合网关的配置示例:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: hybrid-gateway
namespace: default
spec:
gatewayClassName: envoy
listeners:
- name: http
protocol: HTTP
port: 80
hostname: "*.example.com"
allowedRoutes:
namespaces:
from: All
- name: https
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
mode: Terminate
certificateRefs:
- name: example-tls
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
tier: web
- name: tls-passthrough
protocol: TLS
port: 8443
hostname: "secure.example.com"
tls:
mode: Passthrough
allowedRoutes:
namespaces:
from: Same
注意:当使用
mode: Passthrough 时,TLS 握手在客户端与后端之间直接完成,Gateway 不进行证书终止。此时 tls.certificateRefs 字段必须为空。
4.5 监听器冲突与优先级规则
当多个监听器存在潜在冲突时,Gateway API 定义了明确的优先级规则:
| 冲突场景 | 解决规则 | 示例 |
|---|---|---|
| 相同端口+协议 | 不允许,必须唯一 | 两个监听器同时使用 TCP/443 会报错 |
| 相同端口+不同协议 | 允许(如 TCP/53 和 UDP/53) | DNS 服务同时监听 TCP 和 UDP |
| 主机名重叠 | 更精确的主机名优先匹配 | api.example.com 优先于 *.example.com |
| 路由绑定冲突 | 路由只能绑定到一个监听器 | HTTPRoute 的 hostnames 必须唯一匹配 |
4.6 监听器状态与健康度
Gateway 资源的 status.listeners 字段提供了每个监听器的运行时状态,用于调试和监控:
status:
listeners:
- name: https-app
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
- group: gateway.networking.k8s.io
kind: GRPCRoute
conditions:
- type: Ready
status: "True"
reason: Ready
message: "Listener is ready"
attachedRoutes: 5
- name: http-api
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
conditions:
- type: Ready
status: "False"
reason: PortUnavailable
message: "Port 80 is already in use"
监控指标:
attachedRoutes 字段显示当前绑定到该监听器的路由数量。如果为 0,说明没有路由匹配,需要检查主机名或命名空间选择器配置。
4.7 最佳实践与避坑指南
- 主机名规划:使用通配符
*时注意层级,*.example.com匹配app.example.com但不匹配example.com(无子域名)。 - 端口复用:避免在同一 Gateway 中为同一端口配置多个监听器,除非协议不同(如 TCP/UDP)。
- TLS 模式选择:七层路由优先使用
Terminate模式;四层透传或 mTLS 场景使用Passthrough。 - 命名空间隔离:通过
allowedRoutes.namespaces.from: Selector限制路由来源,防止跨命名空间越权访问。 - 状态监控:定期检查
status.listeners[].conditions,确保所有监听器处于Ready状态。
核心要点总结:
- Gateway 资源通过
listeners数组定义多个网络端点,每个端点独立配置协议、端口、主机名和 TLS。 - 主机名绑定采用两层模型:监听器级范围过滤 + 路由级精确匹配。
- 端口+协议组合在 Gateway 内必须唯一,不同监听器可通过主机名区分流量。
- 监听器状态从 Pending → Programmed → Ready 流转,错误状态需及时排查。