深入理解 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资源。

相关推荐
正在学习前端的---小方同学2 小时前
Harbor部署教程
linux·运维
peixiuhui2 小时前
Iotgateway技术手册-6. 数据流程
网关·iot·iotgateway·开源网关·采集软件·开源mqtt·开源modbus
牛奔2 小时前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
翼龙云_cloud3 小时前
阿里云渠道商:如何手动一键扩缩容ECS实例?
运维·服务器·阿里云·云计算
DX_水位流量监测4 小时前
大坝安全监测之渗流渗压位移监测设备技术解析
大数据·运维·服务器·网络·人工智能·安全
电商API&Tina4 小时前
京东 API 数据采集接口接入与行业分析
运维·服务器·网络·数据库·django·php
Mr_Xuhhh5 小时前
博客标题:深入理解Shell:从进程控制到自主实现一个微型Shell
linux·运维·服务器
f***24118 小时前
高效自动化管理临时文件的技术方案
运维·自动化
m0_738120728 小时前
应急响应——知攻善防靶场Linux-1详细应急过程
linux·运维·服务器·网络·web安全·ssh
obboda8 小时前
磁盘管理(MBR、LVM)
运维·5g