从Google Compute Engine网络负载均衡器后面访问外部客户端IP

时间:2016-03-19 22:46:01

标签: google-compute-engine

我在Google Container Engine上运行Ruby on Rails应用程序(在Nginx模式下使用Passenger)。这些pod位于GCE网络负载平衡器后面。我的问题是如何从Rails应用程序内部访问外部Client IP

Github问题here似乎提供了一个解决方案,但我运行了建议:

for node in $(kubectl get nodes -o name | cut -f2 -d/); do
  kubectl annotate node $node \
    net.beta.kubernetes.io/proxy-mode=iptables;
  gcloud compute ssh --zone=us-central1-b $node \
    --command="sudo /etc/init.d/kube-proxy restart";
done

但我仍然获得了REMOTE_ADDR的{​​{1}}标题。

关于如何访问真实10.140.0.1(用于地理定位)的想法?

编辑:为了更清楚,我知道从Rails内部访问客户端IP的方法,但是所有这些解决方案都让我获得了内部Kubernetes IP,我相信GCE网络负载均衡器没有配置(或者或许无法发送真实的客户端IP。

2 个答案:

答案 0 :(得分:2)

Google员工对another version问题的回答验证了我目前无法使用Google容器引擎网络负载均衡器进行的操作。

编辑(2017年5月31日):从Kubernetes v1.5及更高版本开始,这可以在GKE上使用beta注释service.beta.kubernetes.io/external-traffic。在SO here上回答了这个问题。请注意,当我添加注释时,在现有节点上创建的运行状况检查 。重新创建LB并重新启动节点解决了这个问题。

答案 1 :(得分:0)

似乎这根本不是铁路问题,而是GCE之一。您可以尝试

的第一部分
request.env["HTTP_X_FORWARDED_FOR"]

解释

Getting Orgin IP From Load Balancer建议https://cloud.google.com/compute/docs/load-balancing/http/有文字

  

代理设置HTTP请求/响应头,如下所示:

     
      
  • Via: 1.1 google(请求和回复)
  •   
  • X-Forwarded-Proto: [http | https](仅限请求)
  •   
  • X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>(仅限请求)   可以是以逗号分隔的IP地址列表,具体取决于客户端所在的中介附加的X-Forwarded-For条目   穿越。该部分的第一个元素   显示原始地址。
  •   
  • X-Cloud-Trace-Context: <trace-id>/<span-id>;<trace-options>(仅限请求)   Stackdriver Trace的参数。
  •