使用 Ingress 保留远程客户端 IP
Preserving remote client IP with Ingress
我的目标是让我的 Web 应用程序(部署在 Kubernetes 1.4 集群上)看到最初发出 HTTP 请求的客户端的 IP。由于我打算运行裸机集群上的应用程序,GCE和1.4中引入的service.alpha.kubernetes.io/external-traffic: OnlyLocal
服务注释不适用于我。
寻找替代方案,我找到了 which is proposing to set up an Ingress to achieve my goal. So, I've set up the Ingress and the NginX Ingress Controller。部署进行得很顺利,我能够通过入口地址和端口 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
作为四层代理,Nginx无法保留实际IP包中的原始源IP地址。您可以使用 Proxy protocol 解决此问题(link 指向 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"
通过向命令行参数添加 --nginx-configmap=<insert-configmap-name>
标志,在 Ingress 控制器清单中指定 ConfigMap 的名称。
我的目标是让我的 Web 应用程序(部署在 Kubernetes 1.4 集群上)看到最初发出 HTTP 请求的客户端的 IP。由于我打算运行裸机集群上的应用程序,GCE和1.4中引入的service.alpha.kubernetes.io/external-traffic: OnlyLocal
服务注释不适用于我。
寻找替代方案,我找到了
我的 Ingress 配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myWebApp
spec:
backend:
serviceName: myWebApp
servicePort: 8080
作为四层代理,Nginx无法保留实际IP包中的原始源IP地址。您可以使用 Proxy protocol 解决此问题(link 指向 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"
通过向命令行参数添加 --nginx-configmap=<insert-configmap-name>
标志,在 Ingress 控制器清单中指定 ConfigMap 的名称。