Gateway API

Gateway API 是一系列 API 类型,提供动态基础设施供应和高级流量路由。

通过使用可扩展、面向角色、协议感知的配置机制来提供网络服务。Gateway API 是一个包含 API 插件,其中包含提供动态基础设施供应和高级流量路由的类型

设计原则

以下原则塑造了 Gateway API 的设计和架构

  • 面向角色: Gateway API 类型是根据负责管理 Kubernetes 服务网络的组织角色建模的
    • 基础设施提供商: 管理允许多个隔离集群为多个租户提供服务的基础设施,例如云提供商。
    • 集群操作员: 管理集群,通常关注策略、网络访问、应用程序权限等。
    • 应用程序开发人员: 管理在集群中运行的应用程序,通常关注应用程序级别的配置和服务组合。
  • 可移植: Gateway API 规范定义为自定义资源,并受到许多实现的支持。
  • 富有表现力: Gateway API 类型支持常见的流量路由用例的功能,例如基于标头的匹配、流量加权以及其他只能通过使用自定义注解在 Ingress 中实现的功能。
  • 可扩展: Gateway 允许在 API 的各个层链接自定义资源。这使得可以在 API 结构内的适当位置进行精细的自定义。

资源模型

Gateway API 有三种稳定的 API 类型

  • GatewayClass: 定义一组具有通用配置的网关,并由实现该类的控制器管理。

  • Gateway: 定义流量处理基础设施的实例,例如云负载均衡器。

  • HTTPRoute: 定义将流量从 Gateway 监听器映射到后端网络端点的表示的 HTTP 特定规则。这些端点通常表示为服务

Gateway API 被组织成具有相互依赖关系的不同 API 类型,以支持组织中面向角色的特性。一个 Gateway 对象恰好与一个 GatewayClass 相关联;GatewayClass 描述了负责管理此类网关的网关控制器。然后,一个或多个路由类型(例如 HTTPRoute)与网关相关联。Gateway 可以筛选可能附加到其 listeners 的路由,从而与路由形成双向信任模型。

下图说明了三种稳定的 Gateway API 类型的关系

A figure illustrating the relationships of the three stable Gateway API kinds

GatewayClass

网关可以由不同的控制器实现,通常具有不同的配置。网关必须引用一个 GatewayClass,其中包含实现该类的控制器的名称。

一个最小的 GatewayClass 示例

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: example-class
spec:
  controllerName: example.com/gateway-controller

在此示例中,配置了已实现 Gateway API 的控制器来管理控制器名称为 example.com/gateway-controller 的 GatewayClass。此类的网关将由实现的控制器管理。

有关此 API 类型的完整定义,请参见 GatewayClass 参考。

Gateway

Gateway 描述了流量处理基础设施的实例。它定义了一个可用于处理流量的网络端点,例如对后端(如服务)进行筛选、负载均衡、拆分等。例如,网关可以表示云负载均衡器或配置为接受 HTTP 流量的集群内代理服务器。

一个最小的网关资源示例

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

在此示例中,流量处理基础设施的实例被编程为侦听端口 80 上的 HTTP 流量。由于未指定 addresses 字段,因此实现控制器的地址或主机名将分配给网关。此地址用作处理路由中定义的后端网络端点的流量的网络端点。

有关此 API 类型的完整定义,请参见 Gateway 参考。

HTTPRoute

HTTPRoute 类型指定从网关侦听器到后端网络端点的 HTTP 请求的路由行为。对于服务后端,实现可以将后端网络端点表示为服务 IP 或服务的后备端点。HTTPRoute 表示应用于底层网关实现的配置。例如,定义新的 HTTPRoute 可能会导致在云负载均衡器或集群内代理服务器中配置其他流量路由。

一个最小的 HTTPRoute 示例

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-httproute
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "www.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /login
    backendRefs:
    - name: example-svc
      port: 8080

在此示例中,来自网关 example-gateway、Host: 标头设置为 www.example.com 且请求路径指定为 /login 的 HTTP 流量将路由到端口 8080 上的服务 example-svc

有关此 API 类型的完整定义,请参见 HTTPRoute 参考。

请求流

这是一个通过使用网关和 HTTPRoute 将 HTTP 流量路由到服务的简单示例

A diagram that provides an example of HTTP traffic being routed to a Service by using a Gateway and an HTTPRoute

在此示例中,作为反向代理实现的网关的请求流为

  1. 客户端开始准备 URL http://www.example.com 的 HTTP 请求
  2. 客户端的 DNS 解析器查询目标名称,并了解与网关关联的一个或多个 IP 地址的映射。
  3. 客户端将请求发送到网关 IP 地址;反向代理接收 HTTP 请求,并使用 Host: 标头来匹配从网关和附加的 HTTPRoute 派生的配置。
  4. (可选)反向代理可以根据 HTTPRoute 的匹配规则执行请求标头和/或路径匹配。
  5. (可选)反向代理可以修改请求;例如,根据 HTTPRoute 的筛选规则添加或删除标头。
  6. 最后,反向代理将请求转发到一个或多个后端。

一致性

Gateway API 涵盖了广泛的功能集,并得到了广泛的实现。这种组合需要明确的一致性定义和测试,以确保 API 在任何使用地点都提供一致的体验。

有关发布渠道、支持级别和运行一致性测试等详细信息,请参阅一致性文档。

从 Ingress 迁移

Gateway API 是 Ingress API 的后继者。但是,它不包含 Ingress 类型。因此,有必要将现有 Ingress 资源一次性转换为 Gateway API 资源。

有关将 Ingress 资源迁移到 Gateway API 资源的详细信息,请参阅Ingress 迁移指南。

下一步

Gateway API 资源不是由 Kubernetes 原生实现的,而是将规范定义为由各种 实现 支持的自定义资源安装 Gateway API CRD 或按照所选实现的安装说明进行操作。安装实现后,请使用入门指南来帮助您快速开始使用 Gateway API。

有关所有 Gateway API 类型的其他详细信息,请参阅API 规范

上次修改时间为太平洋标准时间 2024 年 1 月 1 日晚上 9:15:修复了几个链接错误 (8b46ec4047)