Kubernetes Gateway API 深入解读和落地指南
Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 规范,是 Kubernetes 官方正在开发的新的 API,Ingress 是 Kubernetes 已有的 API。Gateway API 会成为 Ingress 的下一代替代方案。Gateway API 提供更丰富的功能,支持 TCP、UDP、TLS 等,不仅仅是 HTTP。Ingress 主要面向 HTTP 流量。 Gateway API 具有更强的扩展性,通过 CRD 可以轻易新增特定的 Gateway 类型,比如 AWS Gateway 等。Ingress 的扩展相对较难。Gateway API 支持更细粒度的流量路由规则,可以精确到服务级别。Ingress 的最小路由单元是路径。
Gateway API 的意义和价值:
-
作为 Kubernetes 官方项目,Gateway API 能够更好地与 Kubernetes 本身集成,有更强的可靠性和稳定性。
-
支持更丰富的流量协议,适用于服务网格等更复杂的场景,不仅限于 HTTP。可以作为 Kubernetes 的流量入口 API 进行统一。
-
具有更好的扩展性,通过 CRD 可以轻松地支持各种 Gateway 的自定 义类型,更灵活。
-
可以实现细粒度的流量控制,精确到服务级别的路由,提供更强大的流量管理能力。
综上,Gateway API 作为新一代的 Kubernetes 入口 API,有更广泛的应用场景、更强大的功能、以及更好的可靠性和扩展性。对于生产级的 Kubernetes 环境,Gateway API 是一个更好的选择。本篇文章将深入解读 Kubernetes Gateway API 的概念、特性和用法,帮助读者深入理解并实际应用 Kubernetes Gateway API,发挥其在 Kubernetes 网络流量管理中的优势。
发展现状
版本现状
Gateway API 目前还处于开发阶段,尚未发布正式版本。其版本发展现状如下:
-
v1beta1: 当前的主要迭代版本,Gateway API 进入了beta 版本,这意味着我们可以在生产中使用 Gateway API 能力了,目前 beta 版本仅支持 HTTP 协议, TCP 协议、UDP 协议、gRPC 协议、TLS 协议均为 alpha 版本。
-
v1.0: 首个正式GA版本,API稳定,可以用于生产环境。但功能还会持续完善。
可用场景
下面简单整理了一下 HTTPRoute 的一些可用场景:
-
多版本部署:如果您的应用程序有多个版本,您可以使用 HTTPRoute 来将流量路由到不同的版本,以便测试和逐步升级。例如,您可以将一部分流量路由到新版本进行测试,同时保持旧版本的运行。
-
A/B 测试:HTTPRoute 可以通过权重分配来实现 A/B 测试。您可以将流量路由到不同的后端服务,并为每个服务指定一个权重,以便测试不同版本的功能和性能。
-
动态路由:HTTPRoute 支持基于路径、请求头、请求参数和请求体等条件的动态路由。这使得您可以根据请求的不同属性将流量路由到不同的后端服务,以满足不同的需求。
-
重定向:HTTPRoute 支持重定向,您可以将某些请求重定向到另一个 URL 上,例如将旧的 URL 重定向到新的 URL。
周边生态
目前,尽管 Gateway API 还处于开发阶段,但已经有部分项目表示支持或计划支持Gateway API。主要包括:
-
Istio 是最流行的服务网格项目之一,Istio 1.9 版本计划引入实验性的 Gateway API 支持。用户可以通过 Gateway 和 HTTPRoute 资源来配置 Istio 的 Envoy 代理。
-
Linkerd 是另一个流行的服务网格项目,Linkerd 2.10 版本添加了 Gateway API 支持。用户可以使用 Gateway API 资源来配置 Linkerd 的代理。
-
Contour 是一个Kubernetes Ingress Controller,Contour 1.14.0 版本添加 Gateway API 支持,可以使用 Gateway 和 HTTPRoute 来配置 Contour。
-
Flagger 是一款 Kubernetes 的蓝绿部署和 A/B 测试工具,Flagger 0.25版本添加了对Gateway API的支持,可以使用Gateway和HTTPRoute构建Flagger的流量路由。
-
HAProxy Ingress Controller支持Gateway API,可以使用Gateway和HTTPRoute构建HAProxy的配置。
-
Traefik是著名的开源边缘路由器,Traefik 2.5版本开始支持Gateway API并逐步淘汰Ingress支持。
除此之外,Apisix、Envoy gateway、Higress等开源项目也支持或打算支持Gateway API,各大云服务商都在积极跟进Gateway API进展,预计未来会在相应的服务中提供Gateway API支持。可以看出,尽管Gateway API还不算成熟和稳定,但由于其强大的功能和作为Kubernetes官方项目的影响力,已经获得大量项目的支持和兼容。服务网格、API网关以及各大云服务商都将是Gateway API的重点生态。
未来规划
-
完善功能和稳定性:继续完善 Gateway API 的功能和稳定性,以确保其能够应对不同场景的需求。
-
管理规模:针对大规模 Kubernetes 集群的需求,优化 Gateway API 的性能和扩展性,使其能够管理更多的网关和路由规则。
-
增强安全性:加强 Gateway API 的安全性,包括在传输过程中的加密、身份验证等方面,以确保网络流量的安全性。
-
完善文档和社区支持:完善 Gateway API 的文档和社区支持,以帮助用户更好地使用和了解该项目。
Gateway API 规范解读
基础概念
Kubernetes Gateway API 定义了三种基本资源类型:GatewayClass、Gateway、Route 。
- Gatewayclass: 一组共享通用配置和行为的 Gateway 集合,与 IngressClass、StorageClass 类似,需要知道 Gateway API 并不会创建真正的网关,真正的网关是由一些支持 Gateway API 的社区(基础设备提供商)所提供的 Controller 所创建,如 Envoy 、Istio、Nginx。GatewayClass, Gatewayclass 的作用就是绑定一个 Controller 定义一种网关类型。
- Gateway: 可以说成 GatewayClass 的具体实现,声明后由 GatewayClass 的基础设备提供商提供一个具体存在的 Pod,充当了进入 Kubernetes 集群的流量的入口,负责流量接入以及往后转发,同时还可以起到一个初步过滤的效果。
- Route: 真实的路由,定义了特定协议的规则,用于将请求从 Gateway 映射到 Kubernetes 服务。目前只有 HTTPRoute 进入了v1beta 版本,是比较稳定的版本,后续 TCPRoute、UDPRoute、GRPCRoute、TLSRoute 等也会陆续进入 beta 版本达到生产可用,这里将只对 HTTPRoute 进行介绍。
关于他们三者之间的关系,官方文档也给了一幅非常清晰的结构图,如下图所示,在我看来,图片主要强调了面向角色的特点,官方想表达意思是 GatewayClass 由基础设施供应商提供,Gateway 资源由集群工程师创建,基本环境搭建完成后,开发者便可以轻松创建 HTTPRoute 将自己的业务代理出来。
工作原理
结构图
GatewayClass
通过部署 GatewayClass 绑定下游实现提供的 Controller,为集群提供一种网关能力,这里可以看作是一种注册声明吧,将你的下游实现注册到集群中供 Gateway 绑定使用。Controller 可以看作监听 Gateway 资源的 Operator。
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller #绑定的 Controller 名称