Kubernetes环境中的API网关

Posted

技术标签:

【中文标题】Kubernetes环境中的API网关【英文标题】:API gateway in kubernetes environment 【发布时间】:2021-08-14 09:58:57 【问题描述】:

我仍在学习微服务架构,并不清楚如何解决给定的问题。

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

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

Ingress 前面的集群外的 AGW:

AGW 作为入口控制器:

Ingress 后集群内的 AGW:

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

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

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

还有其他解决方案吗?如果不是,您会推荐其中的哪一个?或者也许有不同的方法来包含提到的反向代理功能?

【问题讨论】:

【参考方案1】:

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

如果您可以设法将 Api 网关用作 Ingress Controller,例如 Ambassador 或 Istio(我所知道的就是这些),那就更好了。您将删除一个额外的额外网络跃点。 由于ambassador 和 Istio 都是 Kubernetes 思维,使用 Kubernetes Resource 对象,您可以使用这些 Ingress Controller 控制任何您喜欢的东西。

【讨论】:

谢谢,我一直在想 Ingress 正在做负载平衡。但现在它更有意义了,第三种选择似乎比我预期的更实用。【参考方案2】:

在第三个 AGW 中,在集群内部,但是 Ingress 没有做任何事情 路由。所有路由(和负载平衡)都将在 AGW 中进行。

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

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

【讨论】:

以上是关于Kubernetes环境中的API网关的主要内容,如果未能解决你的问题,请参考以下文章

kubernates 组件(第二集)

无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

kubernates入门

kubernates入门

了解kubernates对象(第三集)

kubernates 学习笔记