4月下旬, Kubernetes 社区发布的 Gateway API 意味着 Kubernetes 网络 API 的又一次演化。在 Google 和大量贡献者的带领下,Gateway API 利用一系列标准化的核心资源实现了网络的统一。与围绕 Ingress 所打造的实现生态系统类似, Gateway API 同样实现了统一,但范围更广,并充分吸取了 Ingress 和服务网格 (Service mesh) 等方面的经验。今天,我们很激动地发布了 Google Cloud 所实现的 Gateway API, 即 GKE Gateway 控制器的预览版本。一年多的开发过程中, GKE Gateway 控制器管理着 GKE 集群或 GKE 集群队列的内部和外部 HTTP/S 负载均衡。Gateway API 为负载均衡器基础架构提供了多租户共享能力,并提供了集中化的管理策略与控制能力。得益于该 API 的表现能力,它能够支持很多高级功能,如流量转移、流量监视、标头操作等。下文将带领您进一步了解该技术!


GKE Gateway 控制器概览

GatewayClass 将会是您在 GKE Gateway 控制器中遇到的第一个新资源。GatewayClass 提供的模板描述了该类的能力。在每个 GKE 1.20+ 集群中,您会看到两个预安装的 GatewayClass。 欢迎创建 GKE 1.20+ 集群并自行验证!

01  $ kubectl get gatewayclasses

02  

03NAME             CONTROLLER

04gke-l7-gxlb      networking.gke.io/gateway

05gke-l7-rilb      networking.gke.io/gateway


这些 GatewayClass 对应了 regional Internal (gke-l7-rilb) 和 global External (gke-l7-gxlb) HTTP(S) 负载均衡器,它们由 Gateway 控制器编排进而提供容器原生负载均衡


面向角色的设计

按照设计,Gateway API 支持多租户。它引入了两个主要资源,并在平台所有者和服务所有者之间实现了分离:

        Gateway 代表负载均衡器,将侦听需要由自己路由的流量。我们可以使用多个 Gateway ,为每个团队提供一个;或多个团队共享同一个 Gateway 。

        Route 是指与特定协议相关的路由配置,将会被应用给上述 Gateway 。目前 GKE 可支持 HTTPRoute ,未来还计划支持 TCPRoute 与 UDPRoute 。一个或多个 Route 可绑定到同一个 Gateway ,借此共同定义出您应用程序的路由配置。

以下示例展示了集群运维人员部署可供多个团队共享的 Gateway 资源的具体方式,该部署甚至跨越了不同名称空间。该 Gateway 的所有者可以通过集中化的方式定义域所有权、TLS 终结以及其他策略,全过程无需服务所有者参与。另一方面,服务所有者也可以为自己的应用定义路由规则和流量管理策略,而无需其他团队或平台管理员的配合。 Gateway 和 Route 资源之间的这种关系实现了真正的职责分离,并可通过标准化的 Kubernetes RBAC 加以管理。


高级路由和流量管理

GKE Gateway 控制器还引入了新的路由和流量管理功能。下列 HTTPRoute 由 Store 团队在自己的名称空间中部署,会寻找与 foo.example.com/store 匹配的流量,并为其应用下列流量规则:

        90% 的客户端流量转向 store-v1

        10% 的客户端流量转向 store-v2 ,以便对下一版本的商店进行金丝雀测试

        所有客户端流量同时被复制并镜像至 store-v3 ,以便用下列版本的商店进行可扩展性测试

01kind: HTTPRoute

02apiVersion: networking.x-k8s.io/v1alpha1

03metadata:

04  name: store-route

05  namespace: store

06  labels:

07    gateway: foo

08spec:

09  hostnames:

10  - "foo.example.com"

11  rules:

12  - matches:

13    - path:

14        value: /store

15    forwardTo:

16    - serviceName: store-v1

17      port: 8080

18      weight: 90

19    - serviceName: store-v2

20      port: 8080

21      weight: 10

22    filters:

23    - type: RequestMirror

24      requestMirror:

25        serviceName: store-v3

26        port: 8080


原生多集群支持

GKE Gateway 控制器通过自己的 multi-cluster GatewayClasses 实现了可同时面向内部和外部负载均衡的原生多集群支持。多集群网关负载均衡客户端流量可跨越 GKE 集群队列。该功能适用于一系列目标用例,包括:

        多集群或多区域冗余和故障转移

        通过与客户端距离最近的 GKE 集群提供低延迟服务

        集群间的蓝绿流量切换

        由于组织或安全约束拓展至多个集群

一旦在 Hub 中启用 ingress ,多集群 GatewayClasses (包含 `-mc` ) 就会出现在您的 GKE 集群中,准备好实现跨队列的使用。

01  $ kubectl get gatewayclasses

02 

03NAME             CONTROLLER

04gke-l7-gxlb      networking.gke.io/gateway

05gke-l7-rilb      networking.gke.io/gateway

06gke-l7-gxlb-mc   networking.gke.io/gateway

07gke-l7-rilb-mc   networking.gke.io/gateway


GKE Gateway 控制器与多集群服务实现了紧密集成,借此 GKE 能够提供多集群的南北和东西流量负载均衡。多集群网关还可充分利用多集群服务的服务发现能力,借此对后端 Pod 获得完整视图。外部多集群网关可提供面向互联网的负载均衡,内部多集群网关可提供面向内部私有流量的负载均衡。无论东西向流量、南北向流量、外部公共流量,或是内部私有流量,GKE 均可提供您所需的,拆箱即用的多集群网络能力。

GKE Gateway 控制器是 Google Cloud 对 Gateway API 的首个实现。归功于松散耦合的资源模型,TCPRoute、 UDPRoute 以及 TLSRoute 也将被快速纳入 Gateway API 规范,进而使其能力范围进一步扩展。这是 Kubernetes Service 网络连接能力新篇章的开端,未来之路还有很长!


相关推荐