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 在这里拯救你的一天,也拯救你的理智。
“未来属于那些相信网关之美的人。” - 埃莉诺·罗斯福(可能)
祝你路由顺利,愿你的流量总能找到回家的路!