深入理解 Gateway API:设计原则、核心资源与数据流

#作者:程宏斌

文章目录

网关(Gateway)API是一组API类别,可提供动态基础设施配置和高级流量路由。
GatewayAPI通过使用可扩展的、角色导向的、协议感知的配置机制来提供网络服务。它是一个附加组件,包含可提供动态基础设施配置和高级流量路由的API类别。它定义了如GatewayClass、Gateway、HTTPRoute、TCPRoute等CRD(自定义资源),用来描述南北向流量的入口、路由和策略。

Istio、Envoy Gateway、Kong、NGINX等都是Gateway API的具体实现者,它们依据Gateway API规范来解析和执行这些资源,实现流量的转发、安全策略和负载均衡。因此,Gateway API是一个"标准",而Istio、Envoy等是这个标准的"实现",就像CSI定义存储接口、不同厂商提供驱动一样。

设计原则

GatewayAPI的设计和架构遵从以下原则:

角色导向:GatewayAPI类别是基于负责管理Kubernetes服务网络的组织角色建模的:

基础设施提供者:管理使用多个独立集群为多个租户提供服务的基础设施,例如,云提供商。

集群操作员:管理集群,通常关注策略、网络访问、应用程序权限等。

应用程序开发人员:管理在集群中运行的应用程序,通常关注应用程序级配置和Service组合。

可移植:GatewayAPI规范用自定义资源来定义,并受到许多实现的支持。

表达能力强:GatewayAPI类别支持常见流量路由场景的功能,例如基于标头的匹配、流量加权以及其他只能在Ingress中使用自定义注解才能实现的功能。

可扩展的:Gateway允许在API的各个层链接自定义资源。这使得在API结构内的适当位置进行精细定制成为可能。

资源模型

GatewayAPI具有三种稳定的API类别:

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

Gateway:定义流量处理基础设施(例如云负载均衡器)的一个实例。

HTTPRoute:定义特定于HTTP的规则,用于将流量从网关监听器映射到后端网络端点的表示。这些端点通常表示为Service。

GatewayAPI被组织成不同的API类别,这些API类别具有相互依赖的关系,以支持组织中角色导向的特点。一个Gateway对象只能与一个GatewayClass相关联;GatewayClass描述负责管理此类Gateway的网关控制器。各个(可以是多个)路由类别(例如HTTPRoute)可以关联到此Gateway对象。Gateway可以对能够挂接到其listeners的路由进行过滤,从而与路由形成双向信任模型。

下图说明这三个稳定的GatewayAPI类别之间的关系:

GatewayClass

Gateway可以由不同的控制器实现,通常具有不同的配置。Gateway必须引用某GatewayClass,而后者中包含实现该类的控制器的名称。

下面是一个最精简的GatewayClass示例:

apiVersion: gateway.networking.k8s.io/v1

kind: GatewayClass

metadata:

name: example-class

spec:

controllerName: example.com/gateway-controller

在此示例中,一个实现了GatewayAPI的控制器被配置为管理某些GatewayClass对象,这些对象的控制器名为example.com/gateway-controller。归属于此类的Gateway对象将由此实现的控制器来管理。

Gateway

Gateway用来描述流量处理基础设施的一个实例。Gateway定义了一个网络端点,该端点可用于处理流量,即对Service等后端进行过滤、平衡、拆分等。例如,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字段,因此对应实现的控制器负责将地址或主机名设置到Gateway之上。该地址用作网络端点,用于处理路由中定义的后端网络端点的流量。

HTTPRoute

HTTPRoute类别指定从Gateway监听器到后端网络端点的HTTP请求的路由行为。对于服务后端,实现可以将后端网络端点表示为服务IP或服务的支持EndpointSlices。HTTPRoute表示将被应用到下层Gateway实现的配置。例如,定义新的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: 80

在此示例中,来自Gatewayexample-gateway的HTTP流量,如果Host的标头设置为www.example.com且请求路径指定为/login,将被路由到Serviceexample-svc的8080端口。

请求数据流

以下是使用Gateway和HTTPRoute将HTTP流量路由到服务的简单示例:

在此示例中,实现为反向代理的Gateway的请求数据流如下:

客户端开始准备URL为http://www.example.com的HTTP请求

客户端的DNS解析器查询目标名称并了解与Gateway关联的一个或多个IP地址的映射。

客户端向GatewayIP地址发送请求;反向代理接收HTTP请求并使用Host:标头来匹配基于Gateway和附加的HTTPRoute所获得的配置。

可选的,反向代理可以根据HTTPRoute的匹配规则进行请求头和(或)路径匹配。

可选地,反向代理可以修改请求;例如,根据HTTPRoute的过滤规则添加或删除标头。

最后,反向代理将请求转发到一个或多个后端。

GatewayAPI是IngressAPI的后继者。但是其中不包括Ingress类型。因此,需要将现有Ingress资源一次性转换为GatewayAPI资源。

相关推荐
SongYuLong的博客4 小时前
Ubuntu24.04搭建GitLab服务器
运维·服务器·gitlab
guygg884 小时前
Linux服务器上安装配置GitLab
linux·运维·gitlab
RokFile4 小时前
SysInfoKeeper是一款面向 Linux/Unix 的硬件变动检测 CLI 工具
运维
地球没有花4 小时前
gitlab cicd 模块解释
运维·ci/cd·gitlab
小坏讲微服务5 小时前
Docker-compose搭建Docker Hub镜像仓库整合SpringBootCloud
运维·分布式·spring cloud·docker·云原生·容器·eureka
z***43845 小时前
当遇到 502 错误(Bad Gateway)怎么办
gateway
AI大模型学徒5 小时前
Docker(五)_数据根目录空间不足的原因与解决方法
运维·docker·容器
tzhou644525 小时前
Linux文本处理工具:cut、sort、uniq、tr
linux·运维·服务器
2501_941404316 小时前
数字化转型中的区块链技术:构建安全、透明的新生态
运维
清风一徐7 小时前
K8S环境中通过prometheus实现flink服务监控并给flink设置服务监测自动重启
linux·运维·云原生·容器·flink·kubernetes·prometheus