在 NGINX 入口控制器中保留源 IP

时间:2021-03-24 19:21:22

标签: nginx kubernetes kubernetes-ingress nginx-ingress

我们正在运行 NGINX 入口控制器作为我们 EKS 集群的“前门”。

我们的上游应用程序需要保留客户端 IP,因此我已将入口配置映射配置为使用代理协议:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  custom-http-errors: 404,503,502,500
  ssl-redirect: "true"
  ssl-protocols: "TLSv1.2"
  ssl-ciphers: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:!ECDHE-RSA-AES256-SHA384:!ECDHE-RSA-AES128-SHA256"
  use-proxy-protocol: "true"
  proxy-real-ip-cidr: "0.0.0.0/0"

这会将带有客户端 IP 的 X-Forwarded-For 标头发送到上游 Pod。这看起来运行良好,但是一旦我们的应用程序开始接收大量流量,我们的监视器在连接到集群上的应用程序时偶尔会报告连接超时。

我能够在使用 JMeter 的测试环境中重现该问题。一旦我将 use-proxy-protocol 设置为 false,连接超时将不再发生。我开始研究 use-proxy-protocol 设置。

入口文档描述了 use-proxy-protocol 设置 here

但是文档还提到了设置“enable-real-ip”和“forwarded-for-header

enable-real-ip 的说明中提供的链接中,它说我可以将 forwarded-for-header 设置为值 proxy_protocol

基于此,我已将 Ingress 配置映射更新为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx-test
data:
  custom-http-errors: 404,503,502,500
  ssl-redirect: "true"
  ssl-protocols: "TLSv1.2"
  ssl-ciphers: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:!ECDHE-RSA-AES256-SHA384:!ECDHE-RSA-AES128-SHA256"
  enable-real-ip: "true"
  forwarded-for-header: "proxy_protocol"
  proxy-real-ip-cidr: "0.0.0.0/0"

此配置还正确地将带有客户端 IP 的 X-Forwarded-For 标头发送到上游 Pod。但是,它似乎也消除了我看到的连接超时问题。通过这种设置,性能不会像我增加 JMeter 中的线程数那样严重下降。

我想更好地了解这两种配置之间的区别。我还想知道在 Kubernetes 商店中实现这一目标最广泛采用的最佳实践是什么,因为这可能是一个常见的用例。

0 个答案:

没有答案