【问题标题】:How to get the client ip inside the pod without cloud provider or LB如何在没有云提供商或 LB 的情况下获取 pod 内的客户端 ip
【发布时间】:2020-04-16 10:17:06
【问题描述】:

我需要在 Kubernetes 中获取客户端 IP,但我只能获取 Flannel 内部 IP 10.244.X.1(在 nginx 中通过 $remote_addr$http_x_forwarded_for 始终为 -)。

网络拓扑是:
客户端浏览器 -> k8s 集群节点 ip -> k8s 服务 (A) -> pod(需要客户端 ip) -> 其他服务

我在A 中尝试过externalTrafficPolicy,但不起作用。它仅适用于云提供商,还是在 LB 之后? [1]
我也试过ingress-nginx [2],得到同样的结果。

我的环境:

 Kernel Version:             3.10.0-1062.4.1.el7.x86_64
 OS Image:                   CentOS Linux 7 (Core)
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://18.6.2
 Kubelet Version:            v1.16.2
 Kube-Proxy Version:         v1.16.2
 Network Add-on:             Flannel

我已经阅读了一些类似的问题[3][4][5],看起来答案是暗示云提供商或LB。

【问题讨论】:

标签: kubernetes kubernetes-ingress flannel


【解决方案1】:

Kubernetes 服务以三种代理模式之一工作:用户空间、iptables 和 IPVS。我不熟悉 IPVS,但在用户空间和 iptables 模式下,客户端 IP 将针对 NodePort 和负载均衡器服务进行更改 [docs]。

由于这种代理行为,客户端 IP 必然会发生变化,并且只有在客户端和服务器使用“更高层”协议并且存在可以捕获原始客户端的“更高层”代理时才能保留数据IP 并将其注入请求中,然后再转发。如果客户端和服务器正在使用 HTTP,那么 IaaS L7/HTTP(S) 负载均衡器或 nginx 可以为您注入标准标头,但是如果您使用的是 nginx-ingress,那么问题在于它位于 NodePort 后面或 LoadBalancer 服务,因此当它到达实际的 nginx 进程时,客户端 IP 已被更改。您需要让 nginx 在集群外运行才能完成这项工作。

如果您在公共云上运行此程序,我认为大多数云的 L7 LB 解决方案都会为您注入这些 X-Forwarded-ForForwarded 标头。或者,考虑将您的服务器设计为不需要客户端 IP - 如果客户端 IP 用于对客户端进行身份验证或授权请求,则可以使用其他更多的云原生模式。

【讨论】:

  • This blog by HAProxy 揭示了它在 L3/4 层是可能的,不确定 K8S 是否有这个或替代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多