我们正在运行 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 商店中实现这一目标最广泛采用的最佳实践是什么,因为这可能是一个常见的用例。