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

:ウォームアップ機能の使用

最終更新日:Jan 13, 2025

アプリケーションをスケールアウトする必要がある場合、新しいバージョンがデプロイされる場合、またはトラフィックバーストが予想される場合、Service Mesh(ASM)のウォームアップ機能を使用して、カスタムの時間枠内でリクエストトラフィックを徐々に増やすことができます。 これにより、スムーズな移行が保証され、サービスの中断、リクエストのタイムアウト、および負荷の急激なバーストによって引き起こされる潜在的なデータ損失のリスクが軽減されます。 このように、アプリケーションのスケーリングと更新中に安定したパフォーマンスと高可用性が保証されます。

前提条件

背景情報

ウォームアップ機能が無効になっている場合、ポッドが追加されると、新しいポッドに比例配分されたトラフィックが送信されます。 ただし、一部のサービスは、割り当てられたすべてのリクエストを処理できるようになる前にウォームアップするのに時間がかかります。 この場合、リクエストのタイムアウトやデータ損失が発生し、ユーザー エクスペリエンスが損なわれる可能性があります。 たとえば、Java 仮想マシン(JVM)で実行されている Web アプリケーションは、水平ポッド自動スケーリング機能を使用します。 ポッドが追加されると、ポッドには大量のリクエストが殺到します。 その後、ポッドがウォームアップしているため、リクエストへの応答が遅くなったり、タイムアウトしたりします。 ウォームアップ機能の動作原理は、新しいポッドが徐々にトラフィックを受信できるようにすることです。

ウォームアップ機能の使用

ウォームアップ機能を使用すると、サービスの期間を指定できます。 ウォームアップ機能が有効になっている場合、新しいインスタンスは起動時に少数のリクエストのみを受信します。 リクエストの数は、指定された期間中に徐々に増加します。 指定された期間が終了すると、インスタンスはウォームアップ モードを終了します。

ウォームアップ モードでは、新しいポッドが大量のリクエストによってノックダウンされるのを防ぎます。 新しいポッドは、指定された負荷分散ポリシーに基づいて分散されたリクエストを処理する前にウォームアップする時間があります。

この機能は、キャッシュに依存し、最適なパフォーマンスを提供するためにウォームアップする必要があるアプリケーションに役立ちます。 サービスでこの機能を有効にするには、DestinationRule の YAML ファイルで trafficPolicy.loadBalancer フィールドを設定します。 次のフィールドに注意してください。

  • loadBalancer: 負荷分散ポリシーのタイプを指定します。 有効な値: ROUND_ROBIN および LEAST_REQUEST

  • warmupDurationSecs: サービスのウォームアップ期間を指定します。 サービスの新しく作成されたエンドポイントは、作成されてから指定された期間、ウォームアップ モードのままになります。 この期間中、Istio は比例配分されたトラフィックを送信する代わりに、エンドポイントのトラフィック量を徐々に増加させます。

説明

ウォームアップ機能では、現在のゾーンにあるアプリケーションのポッド レプリカの数がゼロ以外である必要があります。 以下に 2 つのシナリオを示します。

  • データ プレーン上の ACK クラスターはゾーン A にのみデプロイされています: アプリケーションにゾーン A に 1 つのポッド レプリカがある場合、2 つ目のポッド レプリカを起動するとウォームアップ機能が有効になります。

  • データ プレーン上の ACK クラスターはゾーン A と B にデプロイされています: アプリケーションにゾーン A に 1 つのポッド レプリカしかない場合、ゾーン B に 2 つ目のポッド レプリカを起動してもウォームアップ機能は有効になりません。 デフォルトでは、スケジューラーはゾーン全体にデプロイされます。 この場合、3 つ目のポッド レプリカを起動するとウォームアップ機能が有効になります。

DestinationRule の YAML ファイルの例:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mocka
spec:
  host: mocka
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
      warmupDurationSecs: 100s

ステップ 1: ルーティングルールを設定してイングレスゲートウェイにアクセスする

この例では、ACK クラスタの reviews-v3 デプロイメントのレプリケートされたポッドの数が最初にゼロにスケーリングされます。

  1. イングレスゲートウェイを定義します。

    1. 次の内容を含む bookinfo-gateway.yaml という名前のファイルを作成します。

      展開して bookinfo-gateway.yaml ファイルを表示する

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: bookinfo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
      ---
      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        gateways:
          - bookinfo-gateway
        hosts:
          - '*'
        http:
          - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
            route:
              - destination:
                  host: productpage
                  port:
                    number: 9080
          - match:
            - uri:
                prefix: /reviews
            route:
              - destination:
                  host: reviews
                  port:
                    number: 9080
      
    2. 次のコマンドを実行して、bookinfo-gateway をデプロイします。

      kubectl apply -f bookinfo-gateway.yaml
  2. reviews という名前のサービスを作成します。

    1. 次の内容を含む reviews.yaml という名前のファイルを作成します。

      展開して reviews.yaml ファイルを表示する

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: reviews
      spec:
        host: reviews
        trafficPolicy:
          loadBalancer:
            simple: ROUND_ROBIN                        
    2. 次のコマンドを実行して、reviews サービスをデプロイします。

      kubectl apply -f reviews.yaml
  3. イングレスゲートウェイの IP アドレスに継続的にアクセスし、サービスメッシュのトポロジを表示します。

    この例では、hey コマンドを使用して 10 秒間リクエストを送信し、ストレスシナリオをシミュレートします。 hey のダウンロードとインストール方法の詳細については、hey をご参照ください。 ASM の可観測性機能を有効にしてトポロジを表示する方法の詳細については、「メッシュトポロジを使用してアプリケーションのトポロジを表示する」をご参照ください。

    hey -z 10s -q 100 -c 4 http://${IP address of the ingress gateway}/reviews/0

    次の図は、呼び出しトポロジを示しています。image

ステップ 2: 新しい Pod に送信されたリクエスト数を確認する

  1. ASM コンソール にログインします。

  2. 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の ASM インスタンス名をクリックするか、[アクション] をクリックします。

  4. 左側のナビゲーションペインで、[可観測性管理センター] > [監視指標] を選択します。

    • ASM インスタンスのバージョンが 1.17.2.35 より前の場合、[監視指標] ページの [監視ツール] タブをクリックします。[監視ツール] タブで、[cloud ASM Istio サービス] タブをクリックし、reviews サービスを選択します。

    • ASM インスタンスのバージョンが 1.17.2.35 以降の場合、[監視指標] ページの [cloud ASM Istio ワークロード] タブをクリックし、[ワークロード] ドロップダウンリストから reviews-v3 を選択し、[レポーター] ドロップダウンリストから source を選択します。

  5. ストレステストのリクエストを送信し、監視データを観察します。

    1. ウォームアップ機能が無効になっていることを確認します。ACK クラスタの reviews-v3 デプロイメントのレプリケート Pod の数を 0 から 1 にスケールします。

    2. 次のコマンドを実行して、ストレステスト用のリクエストをイングレスゲートウェイに送信します。

      この例では、ストレステストは 120 秒間続きます。

      hey -z 120s -q 100 -c 4 http://${IP address of the ingress gateway}/reviews/0
    3. Prometheus Monitoring ページのダッシュボードを観察します。

      ストレステスト開始後約 45 秒で、reviews-v3 の Pod が安定したレートでリクエストを受信し始めます。必要な時間は、ストレステスト環境によって異なります。image

  6. ACK クラスタの reviews-v3 デプロイメントのレプリケート Pod の数を 0 にスケールします。

手順 3:ウォームアップ機能を有効にする

  1. reviews.yaml ファイルを更新して、次の内容を含めます。

    warmupDurationSecs フィールドを追加し、値を 120s に設定します。

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: reviews
    spec:
      host: reviews
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
          # ウォームアップ期間を 120 秒に設定します。
          warmupDurationSecs: 120s
  2. 次のコマンドを実行して、reviews サービスを更新します。

    kubectl apply -f reviews.yaml

手順 4: ウォームアップ機能の効果を確認する

  1. ACK クラスタの reviews-v3 デプロイメントのレプリケート ポッド数を 0 から 1 にスケーリングします。

  2. 次のコマンドを実行して、ストレステストのためにイングレスゲートウェイにリクエストを送信します。

    この例では、ストレステストは 150 秒間続きます。

    hey -z 150s -q 100 -c 4 http://${IP address of the ingress gateway}/reviews/0
  3. [cloud ASM Istio サービス] タブで、サービスメッシュのダッシュボードを表示します。

    reviews-v3 のポッドは、ストレステスト開始後約 120 秒で安定したレートでリクエストを受信し始めます。必要な時間は、ストレステスト環境によって異なります。imageこの曲線は、メトリックが一定の間隔で収集されるため、滑らかではありません。実際には、reviews-v3 ポッドへのトラフィックはスムーズに増加します。サイドカープロキシのログ収集を有効にしている場合は、Simple Log Service コンソールでサイドカープロキシのログを検索できます。過去 5 分間のログが表示されます。imageウォームアップ機能が有効になっている場合、新しいインスタンスは起動時に少量のリクエストのみを受信します。リクエスト数は、指定された期間中に徐々に増加します。指定された期間が終了すると、インスタンスはウォームアップモードを終了します。

    ウォームアップ機能が有効になっている場合、トラフィックが reviews-v1、reviews-v2、および reviews-v3 に均等に分散されるまで約 150 秒かかります。image

参考文献