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

Alibaba Cloud Service Mesh:LoadRampingPolicy を使用してプログレッシブサービスリリースを実装する

最終更新日:Jan 13, 2025

サービスメッシュ(ASM)トラフィックスケジューリングスイートは、プログレッシブサービスリリースポリシーをサポートしています。新しいサービスをリリースする際に、プログレッシブリリースポリシーを設定して、サービスが受信するトラフィックを徐々に増やすことができます。これにより、サービスがスムーズにリリースされます。このトピックでは、トラフィック管理スイートによって提供される LoadRampingPolicy を使用してプログレッシブサービスリリースを実装する方法について説明します。

背景情報

プログレッシブサービスリリースポリシーを定義する LoadRampingPolicy を使用すると、サービスが受信するリクエストを徐々に増やして、サービスのプログレッシブリリースを実装できます。 LoadRampingPolicy は、次のコンポーネントを使用し、次の方法で動作します。

  • リクエストサンプラー:LoadRampingPolicy は、リクエストサンプラーを使用して一定の割合のリクエストを拒否します。サービスリリースの初期段階では、リクエストサンプラーはサービスに送信されるリクエストの大部分を拒否します。

  • ロードメーター:LoadRampingPolicy は、ロードメーターを使用してサービス負荷を判断します。サービス負荷が特定のしきい値範囲内にある場合、リクエストサンプラーは、特定の手順を実行して、ほぼすべてのリクエストが受け入れられるまで、拒否されるリクエストの割合を徐々に減らします。このようにして、サービスに送信されるリクエストは徐々に増加します。

クラスターに新しいサービスをリリースする場合、LoadRampingPolicy を使用して、サービスが受信するトラフィックを徐々に増やすことができます。これにより、トラフィックバーストによるサービスエラーを防ぐことができます。同時に、LoadRampingPolicy はサービス負荷をリアルタイムでチェックして、サービスが受信するトラフィックの割合を徐々に改善します。これにより、サービスのスムーズなリリースが促進されます。

前提条件

手順 1:LoadRampingPolicy を作成する

  1. kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。

  2. 次の内容を含む LoadRampingPolicy.yaml ファイルを作成します。

    apiVersion: istio.alibabacloud.com/v1
    kind: LoadRampingPolicy
    metadata:
      name: load-ramping
      namespace: istio-system
    spec:
      drivers:
        average_latency_drivers:
          - selectors:
              - service: httpbin.default.svc.cluster.local
            criteria:
              forward:  // サービスリリースを進める
                threshold: 100
              reset:  // サービスリリースをリセットする
                threshold: 200
      start: true
      load_ramp:
        sampler:
          selectors:
            - service: httpbin.default.svc.cluster.local
        steps:
          - duration: 0s
            target_accept_percentage: 1
          - duration: 300s
            target_accept_percentage: 100.0

    次の表に、いくつかのフィールドについて説明します。関連フィールドの詳細については、「LoadRampingPolicy フィールドの説明」をご参照ください。

    フィールド

    説明

    steps

    リリースフェーズの定義。この例では、2 つのリリースフェーズが定義されています。定義では、300 秒以内にリクエストサンプラーが受信するリクエストの割合が 100% に近づく必要があります。

    selectors

    プログレッシブリリースポリシーが適用されるサービス。この例では、httpbin.default.svc.cluster.local が使用されています。これは、httpbin.default.svc.cluster.local サービスでプログレッシブリリースが実行されることを示します。

    criteria

    サービス負荷測定ベンチマークを指定します。この例では、criteria フィールドは次の内容を定義しています。(1)平均サービスレイテンシが 100 ミリ秒未満の場合、サービスリリースは続行されます。(2)平均サービスレイテンシが 200 ミリ秒を超える場合、サービスリリースはリセットされ、リクエストサンプラーは最大拒否率でリクエストを拒否します。

  3. 次のコマンドを実行して、プログレッシブサービスリリースポリシーを設定します。

    kubectl apply -f LoadRampingPolicy.yaml

手順 2:LoadRampingPolicy が有効になっていることを確認する

この例では、ストレステストツール Fortio を使用します。詳細については、GitHub Web サイトの Fortio の「Installation」セクションをご参照ください。

  1. 次のコマンドを実行して、HTTPBin アプリケーションのストレステストを実行します。

    fortio load -c 10 -qps 0 -t 300s -allow-initial-errors -a http://${IP address of the ASM ingress gateway}/status/200
    説明

    上記のコマンドの ${IP address of the ASM ingress gateway} を、ASMイングレスゲートウェイの IP アドレスに置き換えます。ASM イングレスゲートウェイの IP アドレスを取得する方法の詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」トピックの手順 3 のサブステップ 1 をご参照ください。

    予期される出力:

    ...
    # target 50% 0.0613214  // 50% 受理を目標とする
    # target 75% 0.0685102  // 75% 受理を目標とする
    # target 90% 0.0756739  // 90% 受理を目標とする
    # target 99% 0.0870132  // 99% 受理を目標とする
    # target 99.9% 0.115361  // 99.9% 受理を目標とする
    Sockets used: 31529 (for perfect keepalive, would be 10)
    Uniform: false, Jitter: false
    Code 200 : 26718 (45.9 %)
    Code 403 : 31510 (54.1 %)
    Response Header Sizes : count 58228 avg 111.04245 +/- 120.6 min 0 max 243 sum 6465780
    Response Body/Total Sizes : count 58228 avg 185.18012 +/- 52.32 min 137 max 243 sum 10782668
    All done 58228 calls (plus 10 warmup) 51.524 ms avg, 194.1 qps

    出力は、リクエストの平均レイテンシが 51 ミリ秒であり、この例で設定された許容範囲内であることを示しています。リクエストされたリソースへのアクセスが禁止されていることを意味する 403 ステータスコードが、約半分のリクエストに対して返されます。テストの 300 秒以内に、サービスが受信するリクエストの割合は 1% から徐々に増加します。テストの終わりに、サービスが受信するリクエストの割合は 100% に達します。

  2. 次のコマンドを実行して、HTTPBin アプリケーションのストレステストを再度実行します。

    fortio load -c 10 -qps 0 -t 300s -allow-initial-errors -a http://${IP address of the ASM ingress gateway}/status/200

    予期される出力:

    ...
    # target 50% 0.0337055
    # target 75% 0.0368905
    # target 90% 0.0396488
    # target 99% 0.0791
    # target 99.9% 0.123187
    Sockets used: 455 (for perfect keepalive, would be 10)
    Uniform: false, Jitter: false
    Code 200 : 82959 (99.5 %)
    Code 403 : 445 (0.5 %)
    Response Header Sizes : count 83404 avg 240.71018 +/- 17.63 min 0 max 243 sum 20076192
    Response Body/Total Sizes : count 83404 avg 241.44115 +/- 7.649 min 137 max 243 sum 20137158
    All done 83404 calls (plus 10 warmup) 35.970 ms avg, 278.0 qps

    出力は、拒否されたリクエストの割合がわずか 0.5% であり、サービスが受信したリクエストの割合が 99.5% に達したことを示しています。これは、プログレッシブサービスリリースが完了したことを示しています。

  3. LoadRampingPolicy を削除します。

    1. kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。

    2. サービスのリリース後、次のコマンドを実行して LoadRampingPolicy を削除します。

    kubectl delete loadrampingpolicy load-ramping -n istio-system
    重要

    この例では、LoadRampingPolicy は 300 秒の時間設定してサービスのプログレッシブリリースをシミュレートします。criteria.reset.threshold セクションを設定しているため、プログレッシブサービスリリースポリシーの結果を確認した後、サービスレイテンシの変動によってサービスのプログレッシブリリースが再度トリガーされるのを防ぎ、サービスが期待どおりに動作することを保証するために、LoadRampingPolicy を手動で削除する必要があります。

参考資料

Grafana で LoadRampingPolicy が有効になっているかどうかを確認できます。Grafana の Prometheus インスタンスが ASM トラフィックスケジューリングスイート で構成されていることを確認する必要があります。

次の内容を Grafana にインポートして、LoadRampingPolicy のダッシュボードを作成できます。

詳細を表示するにはクリックしてください

{ // Grafana ダッシュボードの設定
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": {
          "type": "grafana",
          "uid": "-- Grafana --"
        },
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",  // アノテーションとアラート
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "fiscalYearStartMonth": 0,
  "graphTooltip": 0,
  "id": 43,
  "links": [],
  "liveNow": false,
  "panels": [
    {
      "datasource": {
        "type": "prometheus",
        "uid": "${datasource}"
      },
      "description": "",
      "fieldConfig": { /* ... */ },  // フィールド設定
      "gridPos": { /* ... */ },  // グリッド位置
      "id": 1,
      "interval": "10s",
      "options": { /* ... */ },  // オプション
      "pluginVersion": "v10.1.0",
      "targets": [
        {
          "datasource": { /* ... */ },  // データソース
          "editorMode": "code",
          "expr": "(sum by (policy_name)(rate(sampler_counter_total{decision_type=\"DECISION_TYPE_ACCEPTED\"}[30s])) / sum by (policy_name)(rate(sampler_counter_total{}[30s]))) * 100",  // 受理率の計算式
          "intervalFactor": 1,
          "legendFormat": "policy_name={{policy_name}}",
          "range": true,
          "refId": "A"
        }
      ],
      "title": "ACCEPT PERCENTAGE",  // 受理率
      "type": "timeseries"  // 時系列グラフ
    },
    { /* ... */ }  // もう1つのパネル - スループット
  ],
  "refresh": false,
  "schemaVersion": 38,
  "style": "dark",
  "tags": [],
  "templating": { /* ... */ },  // テンプレート変数
  "time": { /* ... */ },  // 時間範囲
  "timepicker": {},
  "timezone": "browser",
  "title": "Policy Summary - load-ramping",  // ダッシュボードタイトル
  "version": 3,
  "weekStart": ""
}

ダッシュボードは次のとおりです。

image