Service Mesh (ASM) ゲートウェイでスケールインまたはローリングリスタートを実行すると、ゲートウェイ Pod が削除されます。これにより、少量のトラフィック損失が発生する可能性があります。グレースフルシャットダウン機能を有効にすると、この損失を防ぐことができます。グレースフルシャットダウンが有効になっている場合、ゲートウェイ Pod が削除されている間、既存の接続は一定期間データの転送を継続します。このトピックでは、グレースフルシャットダウン機能の使用方法について説明します。
範囲
Enterprise Edition または Ultimate Edition の ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
ステップ 1: グレースフルシャットダウンを有効にする
既存のゲートウェイで機能を有効にする
ASM 1.26 以降では、グレースフルシャットダウン構成を変更するとゲートウェイが再起動します。この操作はオフピーク時間中に実行してください。
コンソール
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Ingress Gateway] ページで、ターゲットゲートウェイの名前をクリックします。
[ゲートウェイ詳細] ページで、[詳細オプション] をクリックし、[グレースフルシャットダウン] の横にある
アイコンをクリックし、[グレースフルシャットダウン] チェックボックスを選択し、[接続タイムアウト (秒)] を設定し、次に [確認] をクリックします。
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
...ゲートウェイ作成時に機能を有効にする
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Ingress Gateway] ページで、[作成] をクリックします。
[作成] ページで、[デプロイメントクラスター] を選択し、[CLB タイプ] を [パブリックネットワークアクセス] に設定し、[新しい CLB インスタンス] でロードバランサーの仕様を選択し、[ゲートウェイレプリカ数] を 10 に設定します。他の設定項目はデフォルト値のままにします。
設定項目の詳細については、「イングレスゲートウェイの作成」をご参照ください。
[詳細オプション] をクリックし、[グレースフルシャットダウン] チェックボックスをオンにし、[接続タイムアウト (秒)] を設定してから [作成] をクリックします。
設定項目
説明
グレースフルシャットダウン
このオプションを選択すると、ゲートウェイ Pod がローリングリスタートされるときに、Classic Load Balancer (CLB) インスタンスは既存の接続をスムーズにドレインします。これにより、サービスへの影響が最小限に抑えられ、構成の変更やゲートウェイのスペックアップなどのシナリオがより適切にサポートされます。
接続タイムアウト (秒)
CLB インスタンスがゲートウェイ Pod を削除した後、Pod から切断する前に、設定された接続タイムアウト期間待機します。このパラメーターは、ゲートウェイ Pod が既存の接続を処理するためのバッファーを提供します。ゲートウェイ Pod のデフォルトのグレースフルシャットダウン時間は 30 秒です。CLB インスタンスに設定するタイムアウト期間は 30 秒を超えないようにする必要があります。
バージョン 1.26 以降では、タイムアウト期間を最大 890 秒に設定できます。
ステップ 2: サンプルアプリケーションをデプロイする
kubectl を使用して ACK クラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
次の内容で httpbin.yaml ファイルを作成します。
httpbin アプリケーションをデプロイします。
kubectl apply -f httpbin.yaml -n default
ステップ 3: 仮想サービスとゲートウェイルールを作成する
仮想サービスを作成します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで、[Create From YAML] をクリックします。
[作成] ページで、[名前空間] と [シーンテンプレート] を選択し、次の 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
ゲートウェイルールを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウの を選択します。表示されたページで、[Create From YAML] をクリックします。
[作成] ページで、[名前空間] と [シーンテンプレート] を選択し、次の 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
ルーティングが正常に設定されたことを確認します。
ASM ゲートウェイアドレスを取得します。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ブラウザのアドレスバーに http://<ASM ゲートウェイアドレス> と入力します。
次のページが表示され、ルーティングが正常に設定されたことを示します。

ステップ 4: グレースフルシャットダウンの効果を検証する
お使いのオペレーティングシステムと互換性のある軽量ストレステストツール hey のバージョンをダウンロードしてインストールします。詳細については、「hey」をご参照ください。
ASM ゲートウェイをスケールインします。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Ingress Gateway] ページで、ターゲットゲートウェイの右側にある [View YAML] をクリックします。
[編集] ダイアログボックスで、
replicaCountパラメーターの値を 1 に設定し、[OK] をクリックします。
次のコマンドを実行して、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 refused50,000 件のリクエストのうち、49,747 件のみがステータスコード 200 を返します。これは、49,747 件のリクエストのみが成功し、少量のトラフィックが失われたことを示します。
グレースフルシャットダウン有効
次の出力が返されます:
............ Status code distribution: [200] 50000 responses50,000 件すべてのリクエストがステータスコード 200 を返します。これは、50,000 件すべてのリクエストが成功し、トラフィック損失がないことを示します。