全部產品
Search
文件中心

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

更新時間:Nov 15, 2025

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

適用範圍

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

已有網關啟用功能

從ASM的1.26版本開始,變更優雅下線配置會導致網關重啟,請在低峰期操作。

控制台

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

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

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

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

YAML配置(ASM版本低於1.26)

為網關YAML配置添加註解(serviceAnnotations)。

apiVersion: istio.alibabacloud.com/v1
kind: IstioGateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  gatewayType: ingress
  serviceAnnotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on'          # 開啟負載平衡串連排空功能,即優雅下線
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '10'  # 串連排空逾時時間長度,取值範圍[10, 30]
...

YAML配置(ASM版本為1.26及以上)

為網關YAML配置添加註解(annotations)。

apiVersion: istio.alibabacloud.com/v1
kind: IstioGateway
metadata:
  annotations:
    # 如果是CLB、NLB類型的網關,取值範圍[10, 890]
    # 如果是ClusterIP和NodePort類型,不設上限。
    asm.alibabacloud.com/gateway-drain-timeout-seconds: "30"
  name: ingressgateway
  namespace: istio-system
...

建立網關時啟用功能

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

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

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

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

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

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

    配置項

    說明

    優雅下線

    選中後,當網關Pod滾動重啟時,CLB會平滑排空現有串連,從而最大限度減少對業務的影響。能更好地支援配置變更、網關升級等情境。

    連線逾時時間(秒)

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

    1.26版本開始支援最長890秒的逾時配置。

步驟二:部署樣本應用

  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網關地址>/

    類型

    結果分析

    未啟用優雅下線功能

    輸出結果如下:

    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個請求都訪問成功,流量沒有損失。