2016-09-29 161 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>標誌命令在線參數。