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 采用 监听器级主机名过滤 与 路由级主机名匹配 两层模型:

  1. 监听器级过滤:监听器通过 hostname 字段声明其接受的主机名范围。例如 *.example.com 表示该监听器只处理子域名请求。
  2. 路由级匹配:HTTPRoute 或 TLSRoute 中的 spec.hostnames 字段进一步精确匹配。路由的主机名必须属于监听器声明的范围。
  3. 端口唯一性:同一 Gateway 内,port + protocol 组合必须唯一。不同监听器可以共享同一端口(如 TCP 和 UDP 分别监听 53)。
主机名与端口绑定流程 客户端请求 Gateway 资源 监听器: port 443 监听器级过滤 hostname: *.example.com 路由级匹配 hostnames: app.example.com 绑定规则: 1. 请求主机名必须匹配监听器 hostname 范围(如 *.example.com) 2. 路由 hostnames 必须属于监听器 hostname 的子集 3. 端口+协议组合在 Gateway 内唯一,不同监听器可绑定不同主机名

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,说明没有路由匹配,需要检查主机名或命名空间选择器配置。
监听器状态流转图 Pending 等待控制器处理 Programmed 配置已下发 Ready 监听器正常运行 Error 端口冲突/证书无效 状态说明: • Pending: 等待控制器处理 • Programmed: 配置已下发到数据面 • Ready: 监听器正常接收流量

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 流转,错误状态需及时排查。