4. Gateway 资源模型:spec 字段、listeners 配置、gatewayClassName 绑定、addresses 与 ports

Gateway 是 Gateway API 的核心资源,它定义了流量进入集群的入口点。一个 Gateway 资源描述了某个负载均衡器或代理的期望状态,包括它应该监听哪些端口、处理哪些协议、绑定到哪个 GatewayClass,以及是否指定静态地址。本章将深入解析 Gateway 资源模型的四个关键组成部分。

4.1 Gateway 资源整体结构

Gateway 的 spec 字段是声明式配置的核心,它包含以下主要子字段:

字段 类型 必需 说明
gatewayClassName string 是 绑定到指定的 GatewayClass,决定底层实现
listeners []Listener 是 定义监听端口、协议、主机名及 TLS 配置
addresses []GatewayAddress 否 请求特定的 IP 地址或主机名
关键原则: Gateway 本身不实现网络功能,它只是一个声明式规范。实际的负载均衡器或代理由 GatewayClass 对应的控制器创建和管理。

4.2 gatewayClassName 绑定

gatewayClassName 是 Gateway 与 GatewayClass 之间的绑定纽带。它指定了该 Gateway 应该由哪个控制器实现。一个有效的 Gateway 必须引用一个已存在的 GatewayClass 资源。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: default
spec:
  gatewayClassName: example-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80

绑定关系决定了 Gateway 的行为特征:

  • 实现选择: 控制器根据 gatewayClassName 找到对应的 GatewayClass,并读取其 controllerName 字段。
  • 参数传递: GatewayClass 的 parametersRef 可以引用一个自定义参数资源,为 Gateway 提供实现特定的配置。
  • 准入控制: 如果引用的 GatewayClass 不存在或已被删除,Gateway 将无法被正常处理。
注意: 一个 GatewayClass 可以被多个 Gateway 引用,但每个 Gateway 只能引用一个 GatewayClass。这种一对多的关系允许不同的团队共享同一个底层实现,同时保持各自的配置隔离。

4.3 listeners 配置详解

listeners 是 Gateway 最核心的配置字段,它是一个数组,每个元素定义了一个独立的监听端点。每个 listener 包含以下关键属性:

字段 类型 必需 说明
name string 是 Listener 的唯一名称,用于路由引用
port PortNumber 是 监听的端口号(1-65535)
protocol ProtocolType 是 协议类型:HTTP、HTTPS、TLS、TCP、UDP 等
hostname Hostname 否 主机名过滤,仅匹配指定主机名的流量
tls GatewayTLSConfig 条件必需 HTTPS/TLS 协议的证书和配置
allowedRoutes AllowedRoutes 否 限制哪些路由可以绑定到此 listener

4.3.1 协议与端口组合规则

不同的协议对端口有特定的约束:

  • HTTP: 通常使用 80 端口,但也可以使用其他端口。
  • HTTPS: 通常使用 443 端口,必须配置 TLS。
  • TLS: 用于 TLS 透传,必须配置 TLS。
  • TCP/UDP: 用于四层负载均衡,不涉及 TLS。
最佳实践: 在同一个 Gateway 中,不同 listener 的端口和协议组合必须唯一。如果两个 listener 使用相同的端口,则它们的协议必须一致,且 hostname 不能重叠。

4.3.2 hostname 过滤机制

hostname 字段允许 listener 仅接受特定主机名的流量。当多个 listener 共享同一个端口时,hostname 用于区分流量应该由哪个 listener 处理。

listeners:
- name: foo-http
  protocol: HTTP
  port: 80
  hostname: "foo.example.com"
- name: bar-http
  protocol: HTTP
  port: 80
  hostname: "bar.example.com"

在这个例子中,两个 listener 都监听 80 端口,但通过 hostname 区分:foo.example.com 的请求由 foo-http 处理,bar.example.com 的请求由 bar-http 处理。

4.4 addresses 与 ports 字段

addresses 字段允许用户请求特定的 IP 地址或主机名作为 Gateway 的入口点。这是一个可选字段,如果未指定,则由控制器自动分配。

spec:
  addresses:
  - type: IPAddress
    value: "192.168.1.100"
  - type: Hostname
    value: "gateway.example.com"

addresses 的类型支持:

类型 说明 示例
IPAddress 请求一个特定的 IPv4 或 IPv6 地址 "10.0.0.1"
Hostname 请求一个特定的 DNS 主机名 "gw.mycompany.com"
注意: addresses 是一个请求(request),而不是保证(guarantee)。如果请求的地址不可用(例如已被占用或不在可用范围内),控制器可能会拒绝该请求或分配一个替代地址。实际分配的地址会反映在 Gateway 的 status 字段中。

ports 字段在 Gateway 的 spec 中并不直接存在。端口信息是通过 listeners 数组中的每个 listener 的 port 字段定义的。因此,Gateway 的端口集合是由所有 listener 的端口组合而成的。

4.5 Gateway 资源模型关系图

下面的 SVG 图展示了 Gateway 资源模型的核心组件及其关系:

Gateway 资源模型核心组件关系 Gateway gatewayClassName listeners[] addresses[] name protocol port hostname tls (条件必需) allowedRoutes 关键说明 • gatewayClassName 是必需字段,绑定到 GatewayClass 决定实现 • listeners 是核心配置,每个 listener 定义独立的监听端点 • addresses 是可选请求,实际分配地址以 status 为准

4.6 完整 Gateway 配置示例

以下是一个包含所有主要字段的完整 Gateway 配置示例:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: production-gateway
  namespace: infrastructure
spec:
  gatewayClassName: istio-gateway-class
  addresses:
  - type: IPAddress
    value: "10.0.0.100"
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    hostname: "*.example.com"
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            environment: production
  - name: https
    protocol: HTTPS
    port: 443
    hostname: "*.example.com"
    tls:
      mode: Terminate
      certificateRefs:
      - name: example-com-tls
        kind: Secret
    allowedRoutes:
      namespaces:
        from: All
  - name: tcp-passthrough
    protocol: TLS
    port: 8443
    tls:
      mode: Passthrough
    allowedRoutes:
      namespaces:
        from: Same
测试验证要点: 在验证 Gateway 配置时,应重点检查:1) gatewayClassName 引用的 GatewayClass 是否存在且状态正常;2) listener 的端口和协议组合是否唯一;3) TLS 配置是否完整(HTTPS/TLS 协议必须配置 tls 字段);4) addresses 请求是否被控制器接受并反映在 status 中。

4.7 Gateway 状态与条件

Gateway 的 status 字段反映了控制器的处理结果,其中 conditions 数组提供了关键的状态信息:

条件类型 说明 常见状态
Accepted Gateway 配置是否被控制器接受 True / False
Programmed 底层基础设施是否已配置完成 True / False / Unknown
ResolvedRefs 引用的资源(如 Secret)是否解析成功 True / False

通过检查这些条件,可以快速诊断 Gateway 配置问题。例如,如果 ResolvedRefs 为 False,通常意味着 TLS 证书引用了一个不存在的 Secret。