网关 API
使用可扩展的、面向角色的、协议感知的配置机制来提供网络服务。 Gateway API 是一个 附加组件,包含 API 类,提供动态基础设施供应和高级流量路由。
设计原则
以下原则塑造了 Gateway API 的设计和架构
- 面向角色: Gateway API 类是根据负责管理 Kubernetes 服务网络的组织角色建模的
- 基础设施提供商:管理允许多个隔离的集群为多个租户提供服务的设施,例如云提供商。
- 集群操作员:管理集群,通常关心策略、网络访问、应用程序权限等。
- 应用程序开发人员:管理在集群中运行的应用程序,通常关心应用程序级配置和 服务 组合。
- 可移植: Gateway API 规范定义为 自定义资源,并受许多 实现 支持。
- 富有表现力: Gateway API 类支持用于常见流量路由用例的功能,例如基于头的匹配、流量加权,以及其他以前只能使用自定义注释在 Ingress 中实现的功能。
- 可扩展: Gateway 允许在 API 的各个层级链接自定义资源。这使得在 API 结构中的适当位置进行细粒度定制成为可能。
资源模型
Gateway API 有三个稳定的 API 类
GatewayClass:定义一组具有通用配置的网关,并由实现该类的控制器管理。
Gateway:定义一个流量处理基础设施的实例,例如云负载均衡器。
HTTPRoute:定义从网关监听器到后端网络端点表示的流量映射的 HTTP 特定规则。这些端点通常表示为 服务。
Gateway API 组织成不同的 API 类,这些类之间存在相互依赖的关系,以支持组织的面向角色的性质。一个 Gateway 对象与一个 GatewayClass 相关联;GatewayClass 描述了负责管理此类网关的网关控制器。然后,一个或多个路由类(如 HTTPRoute)与网关相关联。网关可以过滤可能附加到其 listeners
的路由,形成与路由的双向信任模型。
下图说明了三个稳定的 Gateway API 类的关系
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 流量的集群内代理服务器。
一个最小的 Gateway 资源示例
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
的 HTTP 流量,其 Host: 标头设置为 www.example.com
,并且请求路径指定为 /login
,将被路由到服务 example-svc
上的端口 8080
。
有关此 API 类完整定义,请参阅 HTTPRoute 参考。
请求流程
这是一个使用网关和 HTTPRoute 将 HTTP 流量路由到服务的简单示例
在此示例中,作为反向代理实现的网关的请求流程为
- 客户端开始准备对 URL
http://www.example.com
的 HTTP 请求 - 客户端的 DNS 解析器查询目标名称,并了解到一个或多个与网关关联的 IP 地址的映射。
- 客户端向网关 IP 地址发送请求;反向代理接收 HTTP 请求,并使用 Host: 标头匹配从网关和附加的 HTTPRoute 派生的配置。
- 可选地,反向代理可以根据 HTTPRoute 的匹配规则执行请求标头和/或路径匹配。
- 可选地,反向代理可以修改请求;例如,根据 HTTPRoute 的过滤规则添加或删除标头。
- 最后,反向代理将请求转发到一个或多个后端。
一致性
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 规范。