首页 > 解决方案 > 如何检查 pod1 中的 http 请求是否来自 kubernetes 集群内的 pod2?

问题描述

我想在基于客户端 IP 的快速服务器中使用速率限制器。假设它Pod1在 Kubernetes 集群中运行。在我的快速服务器中,当请求来自 kubernetes 集群外部时,我检查x-forwarded-for显示正确公共客户端的标头。IP

我还有一个运行在Pod2. 当请求来自 Php symfony 服务器时,x-forwarded-for标头包含.IPPod2

我的问题是,如果 http 请求来自 Php symfony 服务器(Pod2),我如何在快速服务器(Pod1)中验证。

编辑:在我的快递服务器中,我使用 npmjs.com/package/express-rate-limit 包和 redis-store 来限制请求。

标签: expresskubernetesgoogle-kubernetes-enginekubernetes-pod

解决方案


据我了解,您希望对在 POD-1 内运行的服务的流量进行速率限制。

有多种方法可以实现速率限制,但在您的场景中,如果我们看到 POD 2 会将请求发送到内部网络上的 POD-1。您不能使用内部 IP 或集群 IP来限制速率。

要在内部网络上实现速率限制,您可以使用 envoy 代理或服务网格(如果您正在使用它)。

在 istio 中有两种使用 envoy 代理全局和本地的速率限制。

https://istio.io/latest/docs/tasks/policy-enforcement/rate-limit/#:~:text=Global%20rate%20limiting%20uses%20a,the%20global%20rate%20limiting%20service

我建议如果您实施实例级速率限制,您可以使用 envoy local 来使用它。

https://istio.io/latest/docs/tasks/policy-enforcement/rate-limit/#local-rate-limit

但是,总有其他方法可以编写代码,使用 Kubernetes API 并基于过滤计数来检查服务或 POD-2 IP 的速率限制。如果您重新部署服务或部署 sprint 版本,您的 POD IP 可能会发生变化。

上面的解决方案不是那么好,因为它不是不可知论者你不能将你的工作负载移出 Kubernetes,而不必重新设计你的应用程序或完全重新考虑你的基础设施。

如果它适合您的场景,您可以通过将每个请求中的自定义标头从 POD2 发送到 POD1 来使用istio速率限制。您可以在自定义标头中添加任何值,并在此基础上进行速率限制。

不要编写添加自定义标头的代码,您也可以使用 istio 来完成。示例:使用 Istio 的 (1.6.0) envoy lua 过滤器添加自定义响应头

基于键值标头的速率限制示例:https ://domgalski-j.medium.com/istio-rate-limits-for-egress-traffic-8697df490f68


推荐阅读