【问题标题】:Preserving remote client IP with Ingress使用 Ingress 保留远程客户端 IP
【发布时间】:2017-02-08 01:08:42
【问题描述】:

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

在寻找替代方案时,我找到了this question,它提议建立一个 Ingress 来实现我的目标。所以,我已经设置了 Ingress 和 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

【问题讨论】:

    标签: kubernetes clientip


    【解决方案1】:

    Nginx 作为第 4 层代理,无法在实际 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 的名称。

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2019-12-07
      • 2020-11-05
      • 1970-01-01
      相关资源
      最近更新 更多