會話保持(Session Affinity)又稱為粘性會話(Sticky Sessions),是一種負載平衡技術,能夠確保來自同一使用者(或會話)的所有請求均被發送到同一後端伺服器。該技術適用於需要保持使用者狀態的應用,例如線上購物車、登入工作階段和個人化等。
前提條件
已建立入口網關,並暴露80連接埠。
功能介紹
本文示範的會話保持基於一致性雜湊演算法實現。Envoy目前支援RingHash和Maglev兩種一致性雜湊演算法。一致性雜湊演算法實現的負載平衡是一種軟會話保持(Soft Session Affinity),在有端點變化時會有一小部分請求的會話保持失效。基於一致性雜湊演算法的會話保持能實現更好的負載平衡,對分布式系統更加友好。
步驟一:將httpbin應用擴容至多個副本
使用資料面的KubeConfig,執行以下命令,將httpbin應用擴容至3個副本,用於測試會話保持功能。
kubectl scale deployment/httpbin --replicas 3步驟二:查看未啟用會話保持的效果
步驟三:部署目標規則
使用以下內容,建立目標規則。具體操作,請參見管理目標規則。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
namespace: default
spec:
host: httpbin.default.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: sticky-session-key
ttl: 0s部署該目標規則後,通過網關訪問httpbin服務時,如果請求沒有攜帶該Cookie,網關就會根據請求來源和目的地的IP和連接埠得出一個雜湊值,並且在請求返回時設定這個Cookie。之後的請求,如果攜帶這個Cookie,網關就不會重建這個值。這個Cookie會在一致性雜湊演算法中作為雜湊函數的Key輸入,進而計算出最終要訪問的實際後端。
會話保持的有效性由具體的一致性雜湊演算法保證。本例中並沒有明確配置使用哪個一致性雜湊演算法,預設使用RingHash演算法。ASM從1.16版本開始支援Maglev演算法,您可以根據實際需求進行選擇。
步驟四:查看啟用會話保持的效果
在瀏覽器中訪問
http://${ASM網關地址}/status/333,訪問成功後進行多次重新整理。關於如何擷取ASM網關地址,請參見擷取入口網關地址。
查看網關日誌。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在入口網關頁面,單擊目標網關右側的日誌中心,在網關日誌頁簽的搜尋方塊中加入
and 333的搜尋條件,單擊查詢 / 分析,在左下方的原始日誌頁簽,展開upstream_addr索引。您可以看到所有的請求均被轉寄給同一個後端httpbin Pod。

開啟瀏覽器的開發人員工具,單擊網路,重新整理頁面,查看並單擊發出的請求。
您可以看到該網站有一個Cookie。Cookie的名稱即為DestinationRule中設定的名稱。ASM網關會根據該Cookie實現會話保持。
