我在 nginx 上遇到了粘性会话的情况ip_hash
,它总是将流量导向一台服务器。nginx 在 Google Cloud 负载均衡器后面运行,从 nginx 开始,它会先到达我应用程序的 GC Kubernetes 负载均衡器,然后再真正进入其中一个 pod。
我认为所有用户的 IP 都被 GC 负载均衡器屏蔽,以便 nginx 将它们识别为一个源。
有人告诉我,我们可以将用户的原始 IP 添加到 nginx 的标头中,以便负载均衡器能够将他们识别为不同的用户。我该如何处理?或者还有其他解决方案吗?
答案1
如果您使用网络负载平衡(使用目标池),负载平衡器将保留 IP。Kubernetes 正在更改源 IP与集群/节点 IP。
Kubernetes 具有保留客户端源 IP 的功能。您可以查看文档如何在 Type=LoadBalancer 的服务中保留客户端源 IP(网络负载平衡)。
答案2
配置会话亲和性在初始配置期间目标池通过将其设置为以下之一非默认值为了提供所需水平的粘性会话:
CLIENT_IP
2 元组哈希,使用源 IP 和目标 IP。只要实例保持健康,来自客户端的所有连接都将最终到达同一实例,无论使用何种协议。
CLIENT_IP_PROTO
3 元组哈希,使用源 IP、目标 IP 和协议。只要客户端使用相同的协议且实例保持健康,来自客户端的所有连接最终都会到达同一个实例。
拉什曼·迪瓦卡指会话亲和性配置是不可修改的属性集“在创作过程中”目标池。他对云计算负载平衡功能的评论可能对您有用:网络负载均衡器与 HTTP(s) 负载均衡器。
答案3
使用 proxy_set_header 将您的 IP 原始地址添加到 NGINX 标头。查看以下示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
用同样的方式,你可以将你的 IP 来源添加到 NGINX 标头。