在GCE中运行Kubernetes LoadBalancer服务的PHP应用程序中获取访问者真实IP

时间:2017-02-20 14:11:40

标签: nginx kubernetes google-kubernetes-engine

我在使用PHP应用程序获取访问者真正的IP时遇到问题。我让Kubernetes在Google容器引擎中运行(master:1.4.8,node:1.4.7)。

服务定义:

apiVersion: v1
kind: Service
metadata:
    name: app-service
spec:
    type: LoadBalancer # spawning google loadbalancer
    selector:
        name: app # running simple php/nginx container
    ports:
        - port: 80
          targetPort: 80

X-Forwarded-For标题等怎么没有传递到我的php应用程序?我只回到源ip(在php REMOTE_ADDR中),这是10.0.1.1。在Google Cloud中,我可以看到该服务正在使用第4层负载均衡器。这可能是真正的源IP丢失且X-Forwarded-For标头永远不会被设置的问题吗?

如果有人能够解释我发生了什么事,那将会非常有帮助!

为了它的价值,我在我的app容器中使用以下nginx配置:

location ~ \.php$ {
    fastcgi_pass php-upstream;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
}

修改 我把我的整个应用程序放在CloudFlare后面,所以它现在指向CloudFlare http proxy - > GCE负载均衡器。不知怎的,X-Forwarded-For标题都存在!对我来说,问题似乎是GCE Load Balancer,它在某种程度上无法设置这些标题?

1 个答案:

答案 0 :(得分:2)

新功能是added to Kubernetes 1.5

  

由于此功能的实现,目标容器中显示的会话源IP将不是客户端的原始源IP。这是Kubernetes v1.5的默认行为。但是,从v1.5开始,添加了一个可选的beta功能,该功能将保留GCE / GKE环境的客户端源IP。在后续版本中,此功能将分阶段用于其他云提供商。

更多详细信息为available here,并归结为为loadbalancer类型的服务添加注释:

$ kubectl annotate service loadbalancer service.beta.kubernetes.io/external-traffic=OnlyLocal

这将打开节点上的运行状况检查端口,以验证节点上是否有可用的服务端点。

有关此问题如何推广到其他群集的更多详细信息似乎可在跟踪此功能的kubernetes/features问题上提供。

注意:问题与StackOverflow/Kubernetes-not-preserving-source-ip

类似