全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用優雅下線功能避免流量損失

更新時間:Jun 30, 2024

ASM網關在縮容或滾動重啟時,會刪除網關Pod而導致少量流量損失。啟用優雅下線功能後,即使刪除網關Pod,現有串連在一定時間內仍能正常傳輸,流量將不會有損失。本文介紹如何使用優雅下線功能。

前提條件

步驟一:啟用優雅下線功能

您可以根據實際情況,在建立網關時或為已有網關啟用優雅下線功能。

建立網關時啟用優雅下線功能

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

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

  3. 入口網關頁面,單擊建立

  4. 建立頁面,選擇部署叢集,設定負載平衡CLB類型公網訪問,在建立負載平衡CLB下選擇負載平衡規格,設定網關副本數10,其他配置項保持預設。

    關於配置項的說明,請參見建立入口網關

  5. 單擊進階選項,選中優雅下線,配置連線逾時時間(秒),然後單擊建立

    配置項

    說明

    優雅下線

    選中後,當CLB停用時,將不會對網關業務產生影響。

    連線逾時時間(秒)

    CLB移除網關Pod後,會等待配置的連線逾時時間,然後再斷開與Pod的串連。配置該參數,可以給網關Pod提供一個緩衝時間,來處理現有的串連。網關Pod預設優雅下線時間為30s,CLB側配置的逾時時間通常不應該超過30s。

為已有網關啟用優雅下線功能

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

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

  3. 入口網關頁面,單擊目標網關的名稱。

  4. 網關詳情頁面,單擊進階選項,單擊優雅下線右側的修改表徵圖,選中優雅下線,配置連線逾時時間(秒),然後單擊確認

步驟二:部署樣本應用

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 使用以下內容,建立httpbin.yaml

    展開查看httpbin.yaml

    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. 執行以下命令,部署httpbin應用。

    kubectl apply -f httpbin.yaml -n default

步驟三:建立虛擬服務和網關規則

  1. 建立虛擬服務。

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

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 虛擬服務,然後單擊使用YAML建立

    3. 建立頁面,選擇命名空間和任意情境模版,配置以下YAML,然後單擊建立

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: httpbin
        namespace: default
      spec:
        gateways:
          - httpbin-gateway
        hosts:
          - '*'
        http:
          - route:
              - destination:
                  host: httpbin
                  port:
                    number: 8000
  2. 建立網關規則。

    1. 在網格詳情頁面左側導覽列,選擇ASM網關 > 網關規則,然後在右側頁面,單擊使用YAML建立

    2. 建立頁面,選擇命名空間和任意情境模版,配置以下YAML,然後單擊建立

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: httpbin-gateway
        namespace: default
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http
              number: 80
              protocol: HTTP
  3. 驗證路由配置是否成功。

    1. 擷取ASM網關地址,具體操作,請參見建立入口網關

    2. 在瀏覽器地址欄中,輸入http://<ASM網關地址>

      顯示如下,說明路由配置成功。httpbin

步驟四:驗證啟用優雅下線功能後的效果

  1. 根據您使用的作業系統,安裝並下載輕量級壓測工具hey的對應版本。具體操作,請參見hey

  2. 縮容ASM網關。

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

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

    3. 入口網關頁面,單擊目標網關右側的查看YAML

    4. 編輯對話方塊,設定replicaCount的參數值為1,然後單擊確定

      縮容

  3. 執行以下命令,以200並發,50000請求數請求httpbin應用,查看啟用優雅下線功能前後的流量損失情況。

    hey -c 200 -n 50000  -disable-keepalive   http://{ASM網關IP}/

    類型

    結果分析

    未啟用優雅下線功能

    輸出結果如下:

    Status code distribution:
      [200] 49747 responses
    
    Error distribution:
      [253] Get "http://47.55.2xx.xx": dial tcp 47.55.2xx.xx:80: connect: connection refused

    50000個請求中僅49747個請求返回200狀態代碼。說明僅49747個請求訪問成功,流量有少量的損失。

    啟用優雅下線功能

    輸出結果如下:

    ............
    Status code distribution:
      [200] 50000 responses

    50000個請求全部返回200狀態代碼。說明50000個請求都訪問成功,流量沒有損失。