具有黏性會話的 kubernetes 負載平衡器始終將流量傳送到一個 pod

具有黏性會話的 kubernetes 負載平衡器始終將流量傳送到一個 pod

我的負載平衡器設定存在問題,它總是將大部分流量(例如 99%)重定向到一個 Pod。基本上基礎設施如圖所示在此圖上。目標是我需要啟用黏性會話,無論是在 nginx 還是 Google 負載平衡器上,並且我的流量平均分配到可用的 Pod。

簡而言之,我的集群中有 2 個 RC 和 2 個服務。 1 個 nginx pod 在 Google 負載平衡器 (nginx-lb) 和另一個負載平衡器 (app-lb) 後面提供服務,以平衡 2 個應用程式 pod 的流量。這是我對配置的看法:

  • nginx-lb:我將 nginx-lb 設定為sessionAffinity: NoneexternalTrafficPolicy: Local因為我想我現在不需要黏性會話,但我確實需要透過用戶的IP。此時,所有傳入流量都將被同等對待,但我們試圖透過設定來保留用戶的 IP externalTrafficPolicy: Local

  • nginx:nginx本身已啟用ngx_http_realip_模組保持用戶的 IP 轉發,但我沒有在這裡使用 ip_hash,因為我仍然認為我們在這裡還不需要粘性會話。再次,就像 nginx-lb 一樣,我試圖傳遞所有傳入流量,但保留用戶的 IP。這裡的nginx主要用於代理和SSL處理程序。

  • app-lb:然後來到 app-lb,我在其中啟用了sessionAffinity: ClientIP黏性會話externalTrafficPolicy: Cluster負載平衡。我相信這是透過 ClientIP 進行實際負載平衡的地方,因為這是唯一擁有/知道背後有 2 個 Pod 的服務。

我測試了此配置,約有 50 個用戶運行一天,但仍然重定向到一個 Pod,而另一個 Pod 處於空閒狀態,與第一個 Pod 相比,CPU 和記憶體使用率較低。

我想問一下,我的設定是否符合我想要實現的目標?是否有我缺少的配置?任何意見都將受到高度讚賞。

附言。我重寫了整個問題,以根據我的理解添加更多事實,但基本上仍然與具有不同措辭的原始問題相關。

答案1

發生這種情況是因為您正在使用sessionAffinity: ClientIP,這是服務上的親和力並且是基於 ip 的,因此服務獲取負載平衡器的 ip,嘗試使用sessionAffinity: None,如果您想使用粘性會話,請使用 nginx 入口控制器

答案2

您是否嘗試過使用比手機和筆記型電腦更多的客戶端來測試您的應用程式?
也許您可以從多個 Google 計算引擎實例來測試它。

由於您正在實現粘性會話和負載平衡,因此ip_hash兩個設備有 50% 的機會由同一個 pod 提供服務,即使您重新加載頁面,它也將始終由同一個 pod 提供服務,直到您更改 ip。

使用 ip-hash,客戶端的 IP 位址用作雜湊金鑰,以決定應為客戶端的請求選擇伺服器群組中的哪台伺服器。此方法可確保來自相同客戶端的請求始終會定向到同一伺服器,除非該伺服器不可用。 http://nginx.org/en/docs/http/load_balancing.html

相關內容