Kubernetes Gateway API 旨在简化和标准化我们在 Kubernetes 中处理流量路由的方式。它就像是 Ingress 的升级版,但更有礼貌,词汇更丰富。

为什么你应该关心?

说实话,目前的 Ingress API 灵活性就像钢梁一样。它能完成任务,但在多样性方面并不出色。而 Gateway API 则像瑜伽大师一样——灵活、强大,让你不禁想知道为什么这么久以来一直用旧的方法。

  • 更具表现力和可扩展性
  • 更好的关注点分离
  • 标准化处理高级流量路由场景的方法
  • 改进对多租户集群的支持

核心概念:快速了解

Gateway API 引入了一些新资源,它们协同工作,使流量路由变得轻而易举:

1. GatewayClass

可以将 GatewayClass 视为网关的蓝图。它定义了将实现网关的控制器和任何全局配置。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
  name: example-gateway-class
spec:
  controllerName: example.com/gateway-controller

2. Gateway

Gateway 资源是实际的网关实例,监听特定的端口和协议。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP

3. HTTPRoute

HTTPRoute 是你定义实际路由规则的地方。它就像 Kubernetes 社区的交通警察,根据各种标准指示请求去向。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: example-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 8080

优点、缺点和“哦,这很棒!”

让我们来看看 Gateway API 的优点,以及它可能的不足之处。

优点

  • 灵活性:想要基于头信息、查询参数甚至 HTTP 方法进行路由?Gateway API 可以满足你的需求。
  • 标准化:不再需要供应商特定的注释!Gateway API 旨在成为不同 Kubernetes 实现中的标准。
  • 可扩展性:自定义资源定义(CRD)允许轻松扩展而不破坏核心 API。

缺点

  • 学习曲线:如果你来自 Ingress,最初可能需要花一些时间来理解。
  • 成熟度:目前它仍处于测试阶段。随着发展,可能会有一些变化。

“哦,这很棒!”

其中一个最酷的功能是流量拆分。想要逐步推出新版本的服务?看看这个:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: canary-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /app
    backendRefs:
    - name: app-v1
      port: 8080
      weight: 90
    - name: app-v2
      port: 8080
      weight: 10

这种设置将 90% 的流量发送到 v1,10% 发送到 v2。为你的金丝雀部署保驾护航!

真实场景:Gateway API 的闪光点

让我们看看一些 Gateway API 真正大显身手的场景:

1. 多团队 Kubernetes 集群

想象一下,你正在为多个团队运行一个共享的 Kubernetes 集群。使用 Gateway API,你可以:

  • 为每个团队创建单独的网关
  • 使用 ReferenceGrant 控制哪些路由可以绑定到哪些网关
  • 在网关级别实施团队特定的策略

以下是如何设置团队特定网关的快速示例:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: team-a-gateway
  namespace: team-a
spec:
  gatewayClassName: shared-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: team-b-gateway
  namespace: team-b
spec:
  gatewayClassName: shared-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same

2. 高级流量管理

需要基于头信息、查询参数甚至 HTTP 方法进行流量路由?Gateway API 可以满足你的需求。以下是基于自定义头信息路由请求的示例:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: header-based-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - headers:
      - name: X-Version
        value: v2
    backendRefs:
    - name: app-v2
      port: 8080
  - matches:
    - headers:
      - name: X-Version
        value: v1
    backendRefs:
    - name: app-v1
      port: 8080
  - backendRefs:
    - name: app-default
      port: 8080

3. 实施 A/B 测试

Gateway API 的流量拆分功能非常适合 A/B 测试。以下是如何为新功能设置 A/B 测试:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: ab-test-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /feature
    backendRefs:
    - name: feature-a
      port: 8080
      weight: 50
    - name: feature-b
      port: 8080
      weight: 50

注意事项和提示

与任何新技术一样,使用 Gateway API 时需要注意一些事项:

注意差距

并非所有 Kubernetes 发行版都默认支持 Gateway API。你可能需要单独安装。查看 官方 Gateway API 仓库 以获取安装说明。

版本很重要

Gateway API 仍在发展中。确保你使用的版本与 Kubernetes 集群兼容。截至撰写时,v0.5.0 是最新的稳定版本。

控制器兼容性

并非所有入口控制器都支持 Gateway API。像 Contour 和 Istio 这样的流行选项有很好的支持,但始终检查你首选控制器的文档。

迁移路径

如果你正在从 Ingress 迁移,请仔细规划过渡。你可能希望在迁移期间同时运行 Ingress 和 Gateway API。

未来光明

Gateway API 不仅仅是昙花一现。它将成为 Kubernetes 中处理流量路由的标准。随着它的成熟,我们可以期待:

  • 更高级的功能,如断路和重试策略
  • 与服务网格技术的更好集成
  • 对非 HTTP 协议的改进支持

总结

Kubernetes Gateway API 就像你不知道自己需要的酷炫新工具,直到你尝试过。它比旧的 Ingress API 更具表现力、更强大、更标准化。当然,学习曲线有点陡峭,但收益远远超过最初的时间投入。

所以,下次当你发现自己被 Ingress 资源和注释困住时,记住:有更好的方法。Gateway API 在这里拯救你的一天,也拯救你的理智。

“未来属于那些相信网关之美的人。” - 埃莉诺·罗斯福(可能)

祝你路由顺利,愿你的流量总能找到回家的路!