會話保持(Session Affinity)又稱為粘性會話(Sticky Sessions),是一種負載均衡技術,能夠確保來自同一用戶(或會話)的所有請求均被發送到同一后端服務器。該技術適用于需要保持用戶狀態的應用,例如在線購物車、登錄會話和個性化設置等。
前提條件
已創建入口網關,并暴露80端口。
功能介紹
本文演示的會話保持基于一致性哈希算法實現。Envoy目前支持RingHash和Maglev兩種一致性哈希算法。一致性哈希算法實現的負載均衡是一種軟會話保持(Soft Session Affinity),在有端點變化時會有一小部分請求的會話保持失效。基于一致性哈希算法的會話保持能實現更好的負載均衡,對分布式系統更加友好。關于一致性哈希負載均衡的配置介紹,請參見LoadBalancerSettings.ConsistentHashLB。
步驟一:將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實現會話保持。