2016-09-29 164 views
4

我的目标是让我的Web应用程序(部署在Kubernetes 1.4群集上)查看最初发出HTTP请求的客户端的IP。由于我打算在裸机集群上运行应用程序,因此GCE和1.4中引入的服务注释不适用于我。使用Ingress保留远程客户IP

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

我的入口配置:

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

回答

3

作为层4代理,Nginx的不能保留在实际的IP分组的初始源IP地址。您可以使用Proxy protocol(链接指向HAProxy文档,但Nginx也支持它)解决此问题。

但是,为了达到这个目的,上游服务器(也就是您的案例中的myWebApp服务)也需要支持该协议。如果您的上游应用程序也使用Nginx,则可以按照记录的in the official documentation在服务器配置中启用代理协议支持。

按照Nginx Ingress Controller's documentation,此功能可以在入控制器使用Kubernetes ConfigMap启用:

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

在入口控制清单指定ConfigMap的名称,加入--nginx-configmap=<insert-configmap-name>标志命令在线参数。