すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:グレースフルシャットダウンを使用してトラフィック損失を防ぐ

最終更新日:Nov 15, 2025

Service Mesh (ASM) ゲートウェイでスケールインまたはローリングリスタートを実行すると、ゲートウェイ Pod が削除されます。これにより、少量のトラフィック損失が発生する可能性があります。グレースフルシャットダウン機能を有効にすると、この損失を防ぐことができます。グレースフルシャットダウンが有効になっている場合、ゲートウェイ Pod が削除されている間、既存の接続は一定期間データの転送を継続します。このトピックでは、グレースフルシャットダウン機能の使用方法について説明します。

範囲

ステップ 1: グレースフルシャットダウンを有効にする

既存のゲートウェイで機能を有効にする

ASM 1.26 以降では、グレースフルシャットダウン構成を変更するとゲートウェイが再起動します。この操作はオフピーク時間中に実行してください。

コンソール

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM Gateways] > [Ingress Gateway] を選択します。

  3. [Ingress Gateway] ページで、ターゲットゲートウェイの名前をクリックします。

  4. [ゲートウェイ詳細] ページで、[詳細オプション] をクリックし、[グレースフルシャットダウン] の横にある Edit アイコンをクリックし、[グレースフルシャットダウン] チェックボックスを選択し、[接続タイムアウト (秒)] を設定し、次に [確認] をクリックします。

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:
    # Classic Load Balancer (CLB) および Network Load Balancer (NLB) ゲートウェイの場合、有効な値は 10~890 です。
    # ClusterIP および NodePort ゲートウェイの場合、上限はありません。
    asm.alibabacloud.com/gateway-drain-timeout-seconds: "30"
  name: ingressgateway
  namespace: istio-system
...

ゲートウェイ作成時に機能を有効にする

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM Gateways] > [Ingress Gateway] を選択します。

  3. [Ingress Gateway] ページで、[作成] をクリックします。

  4. [作成] ページで、[デプロイメントクラスター] を選択し、[CLB タイプ][パブリックネットワークアクセス] に設定し、[新しい CLB インスタンス] でロードバランサーの仕様を選択し、[ゲートウェイレプリカ数]10 に設定します。他の設定項目はデフォルト値のままにします。

    設定項目の詳細については、「イングレスゲートウェイの作成」をご参照ください。

  5. [詳細オプション] をクリックし、[グレースフルシャットダウン] チェックボックスをオンにし、[接続タイムアウト (秒)] を設定してから [作成] をクリックします。

    設定項目

    説明

    グレースフルシャットダウン

    このオプションを選択すると、ゲートウェイ Pod がローリングリスタートされるときに、Classic Load Balancer (CLB) インスタンスは既存の接続をスムーズにドレインします。これにより、サービスへの影響が最小限に抑えられ、構成の変更やゲートウェイのスペックアップなどのシナリオがより適切にサポートされます。

    接続タイムアウト (秒)

    CLB インスタンスがゲートウェイ Pod を削除した後、Pod から切断する前に、設定された接続タイムアウト期間待機します。このパラメーターは、ゲートウェイ Pod が既存の接続を処理するためのバッファーを提供します。ゲートウェイ Pod のデフォルトのグレースフルシャットダウン時間は 30 秒です。CLB インスタンスに設定するタイムアウト期間は 30 秒を超えないようにする必要があります。

    バージョン 1.26 以降では、タイムアウト期間を最大 890 秒に設定できます。

ステップ 2: サンプルアプリケーションをデプロイする

  1. kubectl を使用して ACK クラスターに接続します。詳細については、「クラスターの 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

ステップ 3: 仮想サービスとゲートウェイルールを作成する

  1. 仮想サービスを作成します。

    1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[Traffic Management Center] > [VirtualService] を選択します。表示されたページで、[Create From 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 インスタンスの詳細ページで、左側のナビゲーションウィンドウの [ASM Gateways] > [Gateway] を選択します。表示されたページで、[Create From 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

ステップ 4: グレースフルシャットダウンの効果を検証する

  1. お使いのオペレーティングシステムと互換性のある軽量ストレステストツール hey のバージョンをダウンロードしてインストールします。詳細については、「hey」をご参照ください。

  2. ASM ゲートウェイをスケールインします。

    1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM Gateways] > [Ingress Gateway] を選択します。

    3. [Ingress Gateway] ページで、ターゲットゲートウェイの右側にある [View YAML] をクリックします。

    4. [編集] ダイアログボックスで、replicaCount パラメーターの値を 1 に設定し、[OK] をクリックします。

      缩容

  3. 次のコマンドを実行して、200 の同時実行数で httpbin アプリケーションに 50,000 件のリクエストを送信します。グレースフルシャットダウンが有効になる前と後でトラフィック損失を確認します。

    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

    50,000 件のリクエストのうち、49,747 件のみがステータスコード 200 を返します。これは、49,747 件のリクエストのみが成功し、少量のトラフィックが失われたことを示します。

    グレースフルシャットダウン有効

    次の出力が返されます:

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

    50,000 件すべてのリクエストがステータスコード 200 を返します。これは、50,000 件すべてのリクエストが成功し、トラフィック損失がないことを示します。