使用代理协议的kubernetes nginx入口最终以损坏的标题结束

我尝试在代理协议的谷歌容器上设置nginx入口(nodeport),以便真正的IP可以被转发到后端服务,但结束了与头破碎。

2017/02/05 13:48:52 [error] 18#18: *2 broken header: "     ~  ]H k  m[|    I  iv. {y  Z  嵦v Ȭq   2Iu4P z;  o$ s    "   + / , 0̨̩    /" while reading PROXY protocol, client: 10.50.0.1, server: 0.0.0.0:443 

如果没有代理协议,事情运作良好。 根据https://blog.mythic-beasts.com/2016/05/09/proxy-protocol-nginx-broken-header/这是由于协议v2使用(二进制),但nginx只能说v1 。 任何build议?

GKE:使用kubernetes v1.6 + source ip默认保存,可以在x-real-ip下的头文件中找到,而不需要设置任何额外的nginx配置。

AWS:通过将其添加到注释中,可以保留源IP

 apiVersion: v1 kind: Service metadata: name: nginx-ingress namespace: nginx-ingress annotations: service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*' labels: app: nginx-ingress 

签出此链接https://github.com/kubernetes/ingress/tree/master/examples/aws/nginx

刚刚遇到这个问题,我自己。 对我来说,我并不是一个负载均衡器(除了我的nginx入口),所以我实际上并不需要proxy-protocol集。

但是,我得到127.0.0.1作为客户端IP仍然。 诀窍是在我使用的nginx入口版本中存在一个错误(0.9.0-beta.5)。 更新我的容器图像到gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.8修复了这个问题,我收到了正确的X-Forwarded-For头。

请注意,更高的版本(在撰写本文时为beta.11)还有问题,所以我暂时停留在beta.8上。

您可以在https://console.cloud.google.com/gcr/images/google-containers/GLOBAL/nginx-ingress-controller上查看可用的版本。

如果您想查看可用的配置选项,请查看https://github.com/kubernetes/ingress/tree/master/controllers/nginx