全部產品
Search
文件中心

Alibaba Cloud Service Mesh:在ASM網關中實現會話保持

更新時間:Jun 30, 2024

會話保持(Session Affinity)又稱為粘性會話(Sticky Sessions),是一種負載平衡技術,能夠確保來自同一使用者(或會話)的所有請求均被發送到同一後端伺服器。該技術適用於需要保持使用者狀態的應用,例如線上購物車、登入工作階段和個人化等。

前提條件

功能介紹

本文示範的會話保持基於一致性雜湊演算法實現。Envoy目前支援RingHash和Maglev兩種一致性雜湊演算法。一致性雜湊演算法實現的負載平衡是一種軟會話保持(Soft Session Affinity),在有端點變化時會有一小部分請求的會話保持失效。基於一致性雜湊演算法的會話保持能實現更好的負載平衡,對分布式系統更加友好。

步驟一:將httpbin應用擴容至多副本

使用資料面的KubeConfig,執行以下命令,將httpbin應用擴容至3個副本,用於測試會話保持功能。

kubectl scale deployment/httpbin --replicas 3

步驟二:查看未啟用會話保持的效果

  1. 在瀏覽器中訪問http://${ASM網關地址}/status/418,訪問成功後進行多次重新整理。

    關於如何擷取ASM網關地址,請參見擷取入口網關地址

  2. 查看網關日誌。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

    3. 入口網關頁面,單擊目標網關右側的日誌中心,在網關日誌頁簽的搜尋方塊中加入and 418的搜尋條件,單擊查詢 / 分析,在左下方的原始日誌頁簽,展開upstream_addr索引。

      您可以看到請求較為均勻地分布在3個httpbin Pod上。

      image

步驟三:部署目標規則

使用以下內容,建立目標規則。具體操作,請參見管理目標規則

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演算法,您可以根據實際需求進行選擇。

步驟四:查看啟用會話保持的效果

  1. 在瀏覽器中訪問http://${ASM網關地址}/status/333,訪問成功後進行多次重新整理。

    關於如何擷取ASM網關地址,請參見擷取入口網關地址

  2. 查看網關日誌。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

    3. 入口網關頁面,單擊目標網關右側的日誌中心,在網關日誌頁簽的搜尋方塊中加入and 333的搜尋條件,單擊查詢 / 分析,在左下方的原始日誌頁簽,展開upstream_addr索引。

      您可以看到所有的請求均被轉寄給同一個後端httpbin Pod。

      image

  3. 開啟瀏覽器的開發人員工具,單擊網路,重新整理頁面,查看並單擊發出的請求。

    您可以看到該網站有一個Cookie。Cookie的名稱即為DestinationRule中設定的名稱。ASM網關會根據該Cookie實現會話保持。