【问题标题】:How to get Nginx Ingress Controller to use Remote Adress如何让 Nginx 入口控制器使用远程地址
【发布时间】:2021-07-14 14:15:37
【问题描述】:

我在 Kubernetes 集群中使用 Nginx 入口控制器。我在集群中有一个应用程序,可以通过 Internet 获得。现在我使用 Ingress Controller 访问应用程序,目的是显示一些自定义错误。

如果我访问应用程序(不是我自己编写的,因此我无法更改那里的内容),它会收到nginx-ingress-controller-pod 的 IP 地址。 nginx-ingress-controller-pod的日志显示远程地址不同。

我已经尝试过use-proxy-protocol 之类的东西,然后我就可以使用$remote_addr 并获得正确的IP。但正如我提到的,我无法更改我的应用程序,所以我必须“欺骗”入口控制器以使用 $remote_addr 作为他自己的。 如何配置入口,以便应用程序从远程 IP 而不是从nginx-ingress-controller-pod IP 获取请求?有没有办法做到这一点?

编辑:我正在使用带有 kubernetes v1.19.2 和 nginx 图表 ingress-nginx-3.29.0 的裸机 kubernetes 安装。

【问题讨论】:

  • 你好@black_hawk,欢迎来到 StackOverflow。您是如何设置集群的?您使用的是裸机还是某些云提供商?你有 Kubernetes 和 nginx 哪个版本?请将您的错误添加到问题中。
  • 嘿@MikołajGłodziak,我更新了这个问题,但我不能提供任何错误,因为没有。我只知道,我的应用程序拒绝入口控制器的 ip 并需要远程地址。例如:入口控制器的日志显示远程地址为192.168.13.0,而我的应用程序获得了192.168.90.2 的clientip,这是ingress-controller-pod 的ip。然后应用程序将此 ip 转发到另一个 pod/service,后者拒绝它,因为它不是192.168.13.0。我希望我能让这个问题可以理解。

标签: kubernetes nginx-ingress


【解决方案1】:

使用第 7 层入口控制器无法实现。

如果 Ingress 保留源 IP,则响应将直接从应用程序 pod 发送到客户端,因此客户端将从与他连接的 IP:port 不同的 IP:port 获得响应。甚至更糟 - 客户端的 NAT 完全丢弃响应,因为它与现有连接不匹配。

您可以在 stackoverflow 上查看此 similar question 并接受答案:

由于入口在第 4 层代理之上。您无法在第 3 层 IP 协议中保留 SRC IP。最好的是,我认为 Nginx Ingress 已经默认设置为他们将“X-Forwarded-For”标头放在任何 HTTP 转发中。 您的应用应该记录 X-Forwarded-For 标头

您可以尝试通过关注this article 来解决问题。它可以帮助您保护您的 IP。

我还推荐这个very good article 关于负载平衡和代理。您还将了解一些有关 L7 上的负载平衡的知识:

L7 负载平衡和 OSI 模型 正如我在上面关于 L4 负载均衡的部分所说,使用 OSI 模型来描述负载均衡特性是有问题的。原因是 L7,至少正如 OSI 模型所描述的,它本身包含多个离散的负载平衡抽象层。例如,对于 HTTP 流量,请考虑以下子层:

  • 可选传输层安全 (TLS)。请注意,网络人士争论 TLS 属于哪个 OSI 层。为了便于讨论,我们将考虑 TLS L7。
  • 物理 HTTP 协议(​​HTTP/1 或 HTTP/2)。
  • 逻辑 HTTP 协议(​​标头、正文数据和尾部)。
  • 消息传递协议(gRPC、REST 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2022-11-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多