使用Ingress保留远程客户端IP

时间:2016-09-29 15:51:33

标签: kubernetes clientip

我的目标是使我的Web应用程序(部署在Kubernetes 1.4群集上)看到最初发出HTTP请求的客户端的IP。由于我计划在裸机群集上运行应用程序,因此GCE和1.4中引入的service.alpha.kubernetes.io/external-traffic: OnlyLocal服务注释不适用于我。

寻找替代方案,我发现this question建议设置Ingress以实现我的目标。所以,我已经设置了Ingress和the NginX Ingress Controller。部署进展顺利,我能够通过Ingress地址和端口80连接到我的Web应用程序。但是在日志中我仍然看到集群内部IP(从172.16.0.0/16)范围 - 这意味着外部客户端IP未通过Ingress正确传递。您能告诉我除了上述内容之外还需要配置什么才能使其正常工作?

我的Ingress'配置:

apiVersion: extensions/v1beta1   
kind: Ingress
metadata:
  name: myWebApp
spec:
  backend:
    serviceName: myWebApp
    servicePort: 8080

1 个答案:

答案 0 :(得分:4)

作为第4层代理,Nginx无法在实际IP数据包中保留原始源IP地址。您可以使用Proxy protocol解决此问题(链接指向HAProxy文档,但Nginx也支持它)。

为此,上游服务器(意味着您的myWebApp服务)也需要支持此协议。如果您的上游应用程序也使用Nginx,您可以在服务器配置中启用代理协议支持,如文档in the official documentation所述。

根据Nginx Ingress Controller's documentation,可以使用Kubernetes ConfigMap在Ingress Controller中启用此功能:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-controller
data:
  use-proxy-protocol: "true"

通过在命令行参数中添加--nginx-configmap=<insert-configmap-name>标志,在Ingress控制器清单中指定ConfigMap的名称。