我尝试使用代理协议在谷歌容器上设置 nginx 入口(节点端口(,以便可以将真正的 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。有什么建议吗?
GKE:使用 kubernetes v1.6+ 源代码 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。
我自己也有这个问题,这就是最终让它工作的原因。更新到 nginx 控制器的 beta.8 版本。
如果某些使用 AWS 的人想从我的错误中吸取教训,请不要通过 aws CLI 手动配置负载均衡器。上面提到的服务注释为您完成了这一切。如果我意识到这一点,我本可以省去很多头痛。