关于 API 网关、Kubernetes 网关和服务网格,仍然存在很多混淆。很多是因为:
- 人们经常用相同的关键词提及这些技术,例如金丝雀部署、速率限制和服务发现。
- 所有这些技术都使用反向代理。
- 一些 API 网关有自己的 Kubernetes 网关和服务网格,反之亦然。
- 有很多文章/视频对这三种技术进行了比较,并得出了为什么一种技术优于另一种技术的结论。
在本文中,我将尝试解释这些技术并分享它们的根本区别以及如何迎合不同的用例。
API网关
API 网关位于您的客户端应用程序和 API 之间。它接受所有客户端请求,将它们转发到所需的 API,并在组合包中将响应返回给客户端。
它基本上是一个具有很多功能的反向代理。
除此之外,API 网关还可以具有身份验证、安全性、细粒度流量控制和监控等功能,让 API 开发人员只关注业务需求。
有许多可用的 API 网关解决方案。一些流行的免费和开源解决方案是:
- Apache APISIX:构建在 Nginx 之上的高性能、可扩展的云原生 API 网关。
- Gloo Edge:一个建立在 Envoy 代理之上的 API 网关。
- Kong:一个可插入的 API 网关,也是基于 Nginx 构建的。
- Tyk:一个用 Go 编写的 API 网关,支持 REST、GraphQL、TCP 和 gRPC 协议。
GCP、AWS和Azure等云平台也有自己专有的 API 网关。
API 网关、Kubernetes 网关和服务网格支持金丝雀部署——在新软件版本普遍可用之前逐渐向一小部分用户推出新软件版本。
下面的示例展示了如何在 Apache APISIX 中配置金丝雀部署。
您可以使用以下配置向APISIX Admin API发送请求:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>curl http://127.0.0.1:9180/apisix/admin/routes/1 <span style="color:var(--syntax-literal-color)">\</span>
<span style="color:var(--syntax-error-color)">-H</span> <span style="color:var(--syntax-string-color)">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> <span style="color:var(--syntax-error-color)">-X</span> PUT <span style="color:var(--syntax-error-color)">-d</span> <span style="color:var(--syntax-string-color)">'
{
"uri":"/*",
"plugins":{
"traffic-split":{
"rules":[
{
"weighted_upstreams":[
{
"upstream":{
"name":"api-v1",
"type":"roundrobin",
"nodes":{
"api-v1:8080":1
}
},
"weight":95
},
{
"weight":5
}
]
}
]
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"api-v2:8080":1
}
}
}'</span>
</code></span></span>
APISIX 现在会将 95% 的流量路由到 api-v1 服务,将 5% 的流量路由到 api-v2 服务。
Kubernetes 网关
Kubernetes 网关只是 Kubernetes 原生 API 网关。也就是说,您可以使用 Kubernetes API 管理这些 API 网关,类似于 Kubernetes pod、服务或部署。
在 Kubernetes 中,您的 API 是部署在集群中的 pod 和服务。然后,您使用 Kubernetes 网关将外部流量定向到您的集群。
Kubernetes 提供了两个 API 来实现这一点,Ingress API和Gateway API。
Kubernetes 入口 API
Ingress API 的创建是为了通过引入路由和 SSL 终止等功能来克服默认服务类型NodePort和LoadBalancer的限制。它还标准化了将 Kubernetes 服务暴露给外部流量的方式。
它有两个组件,Ingress和Ingress controller。
Ingress Kubernetes 本机对象定义了一组关于外部流量如何访问您的服务的规则。
此示例配置显示了基于 URI 路径和 Kubernetes Ingress 对象的路由流量:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-name-color)">apiVersion</span>: <span style="color:var(