API kubernetes环境中的网关

API gateway in kubernetes environment

我仍在学习微服务架构,无法清楚地了解如何解决给定的问题。

假设我有一个 k8s 集群,其中部署了一些 BE 微服务、FE 应用程序或任何其他服务。我还有一个入口控制器,它确实消耗流量并路由到服务。

我想在该设置中的某处放置 API 网关,它将对请求执行一些额外的(可自定义的)操作,例如身份验证、日志记录、添加 headers 等。我们可以包装将此功能作为整个集群的 reverse-proxy。我找到了三种可能的解决方案:

Ingress 前面的 AGW 外部集群:

AGW 作为入口控制器:

入口后群集内的 AGW:

在第一种方法中,AGW 将所有流量路由到入口,但是我们需要有一个“私有域”,入口将暴露在该域下。 AGW 将在 public 域下公开并将流量路由到此私有域。这不是很好,因为 Ingress 没有暴露在 public 域下。例如。我们遇到了一个问题,当 Ingress 进行一些重定向并在 Location header 中使用它的私有域而不是 public 时。

在第二种方法中,AGW 功能嵌入到 Ingress Controller 中,但是我还没有找到适合我们需要的控制器。构建自定义 Ingress Controller 听起来不太好。

第三个 AGW 在集群内部,但是 Ingress 没有做任何路由。所有路由(和负载均衡)都将发生在 AGW 中。

还有其他解决办法吗?如果不是,你会推荐他们中的哪一个?或者也许有不同的方法来包含提到的 reverse-proxy 功能?

In third AGW is inside cluster, but then Ingress is not doing any routing. All routing (and load balancing) will happen in AGW.

AGW 可以这样设计,它可以将请求转发到另一个服务,而无需为路由和负载平衡做任何特殊的事情。它可以将变异请求转发到服务的 ClusterIP 或微服务前面的内部 DNS Pods。您不需要 Ingress 只是为了对单个服务进行负载平衡。

一般来说,Ingress可以用来做负载均衡,也可以不做。当我们想要对多个服务进行负载平衡时,我们可以使用 Ingress 否则它对做其他事情更有用,例如TLS 终止。

第二种和第三种解决方案通常效果最好。 Ingress不做负载均衡,配置负载均衡规则的是服务对象

如果您可以设法使用 Api 网关作为 Ingress Controller,例如大使或 Istio(我知道的就是这些),那就更好了。您将删除额外的网络跃点。
因为大使和 Istio 是 kubernetes 思想的,使用 kubernetes 资源对象,你可以使用那些 Ingress Controllers 控制你喜欢的任何东西。