kubernetes - Kubernetes环境中的API网关
问题描述
我仍在学习微服务架构,并不清楚如何解决给定的问题。
假设我有一个 k8s 集群,其中部署了一些 BE 微服务、FE 应用程序或任何其他服务。我还有一个入口控制器,它确实消耗流量和路由到服务。
我想在该设置中的某个地方放置 API 网关,它会对请求执行一些额外的(可定制的)操作,例如身份验证、日志记录、添加标头等。我们可以将此功能包装为整个集群的反向代理。我找到了三种可能的解决方案:
Ingress前面的AGW外部集群:
AGW 作为入口控制器:
Ingress 后集群内的 AGW:
在第一种方法中,AGW 将所有流量路由到入口,但是我们需要有一个“私有域”,入口将被暴露在下面。AGW 将暴露在公共域下并将流量路由到这个私有域。这不是很好,因为 Ingress 没有暴露在公共领域。例如,当 Ingress 进行一些重定向并在 Location 标头中使用它的私有域而不是公共域时,我们遇到了一个问题。
在第二种方法中,AGW 功能嵌入在 Ingress Controller 中,但是我还没有找到适合我们需要的控制器。构建自定义入口控制器听起来不太好。
在第三个 AGW 中,在集群内部,但是 Ingress 没有做任何路由。所有路由(和负载平衡)都将在 AGW 中发生。
还有其他解决方案吗?如果不是,您会推荐其中的哪一个?或者也许有一种不同的方法来包含提到的反向代理功能?
解决方案
第二种和第三种解决方案通常效果最好。Ingress 不进行负载均衡,它是配置负载均衡规则的服务对象。
如果您可以设法使用 Api Gateway 作为 Ingress Controller,例如 Ambassador 或 Istio(我所知道的就是这些),那就更好了。您将删除一个额外的额外网络跃点。
因为ambassador 和 Istio 都是 kubernetes 思想,所以使用 kubernetes 资源对象,您可以使用这些 Ingress Controller 控制任何您喜欢的东西。
推荐阅读
- mysql - COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效
- javascript - 有没有办法在不覆盖指定属性的情况下将道具传播到组件上?
- oracle - PLSQL Loop through query 查找所有记录
- python - 对结果进行平均计算的列条件计数
- ruby-on-rails - 如何从单个活动记录对象中获取列值
- c++ - 如何限制矩阵类只获取“X”“O”或“。”
- javascript - 如何在数据库 MYSQL 的下拉菜单中选择选项的输入中显示数据?
- java - Swagger / Openapi with openapi-generator 我们在哪里添加业务逻辑代码?
- esp8266 - 是否有用于测试在 Arduino IDE 上编写的代码的 esp8266 模拟器?
- vba - VBA 矩阵搜索