我在 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
三元組哈希,使用來源和目標 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 標頭。