带有代理协议的 Kubernetes nginx 入口最终以损坏的标头告终



我尝试使用代理协议在谷歌容器上设置 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 手动配置负载均衡器。上面提到的服务注释为您完成了这一切。如果我意识到这一点,我本可以省去很多头痛。

最新更新