サービスメッシュ(ASM)トラフィックスケジューリングスイートは、プログレッシブサービスリリースポリシーをサポートしています。新しいサービスをリリースする際に、プログレッシブリリースポリシーを設定して、サービスが受信するトラフィックを徐々に増やすことができます。これにより、サービスがスムーズにリリースされます。このトピックでは、トラフィック管理スイートによって提供される LoadRampingPolicy を使用してプログレッシブサービスリリースを実装する方法について説明します。
背景情報
プログレッシブサービスリリースポリシーを定義する LoadRampingPolicy を使用すると、サービスが受信するリクエストを徐々に増やして、サービスのプログレッシブリリースを実装できます。 LoadRampingPolicy は、次のコンポーネントを使用し、次の方法で動作します。
リクエストサンプラー:LoadRampingPolicy は、リクエストサンプラーを使用して一定の割合のリクエストを拒否します。サービスリリースの初期段階では、リクエストサンプラーはサービスに送信されるリクエストの大部分を拒否します。
ロードメーター:LoadRampingPolicy は、ロードメーターを使用してサービス負荷を判断します。サービス負荷が特定のしきい値範囲内にある場合、リクエストサンプラーは、特定の手順を実行して、ほぼすべてのリクエストが受け入れられるまで、拒否されるリクエストの割合を徐々に減らします。このようにして、サービスに送信されるリクエストは徐々に増加します。
クラスターに新しいサービスをリリースする場合、LoadRampingPolicy を使用して、サービスが受信するトラフィックを徐々に増やすことができます。これにより、トラフィックバーストによるサービスエラーを防ぐことができます。同時に、LoadRampingPolicy はサービス負荷をリアルタイムでチェックして、サービスが受信するトラフィックの割合を徐々に改善します。これにより、サービスのスムーズなリリースが促進されます。
前提条件
コンテナサービス Kubernetes 版(ACK)マネージドクラスターが ASM インスタンスに追加されており、ASM インスタンスのバージョンが V1.21.X.XX 以降であること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
ACK クラスターのデフォルトの名前空間で、自動サイドカープロキシインジェクションが有効になっていること。詳細については、「グローバル名前空間の管理」をご参照ください。
kubectl を使用して ACK クラスターに接続していること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ASM トラフィックスケジューリングスイートが有効になっていること。詳細については、「ASM トラフィックスケジューリングスイートを有効にする」をご参照ください。
HTTPBin アプリケーションがデプロイされており、ゲートウェイ経由でアクセスできること。詳細については、「HTTPBin アプリケーションをデプロイする」をご参照ください。
手順 1:LoadRampingPolicy を作成する
kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
次の内容を含む 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 ミリ秒を超える場合、サービスリリースはリセットされ、リクエストサンプラーは最大拒否率でリクエストを拒否します。
次のコマンドを実行して、プログレッシブサービスリリースポリシーを設定します。
kubectl apply -f LoadRampingPolicy.yaml
手順 2:LoadRampingPolicy が有効になっていることを確認する
この例では、ストレステストツール Fortio を使用します。詳細については、GitHub Web サイトの Fortio の「Installation」セクションをご参照ください。
次のコマンドを実行して、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% に達します。
次のコマンドを実行して、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% に達したことを示しています。これは、プログレッシブサービスリリースが完了したことを示しています。
LoadRampingPolicy を削除します。
kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
サービスのリリース後、次のコマンドを実行して LoadRampingPolicy を削除します。
kubectl delete loadrampingpolicy load-ramping -n istio-system重要この例では、
LoadRampingPolicyは 300 秒の時間設定してサービスのプログレッシブリリースをシミュレートします。criteria.reset.thresholdセクションを設定しているため、プログレッシブサービスリリースポリシーの結果を確認した後、サービスレイテンシの変動によってサービスのプログレッシブリリースが再度トリガーされるのを防ぎ、サービスが期待どおりに動作することを保証するために、LoadRampingPolicy を手動で削除する必要があります。
参考資料
Grafana で LoadRampingPolicy が有効になっているかどうかを確認できます。Grafana の Prometheus インスタンスが ASM トラフィックスケジューリングスイート で構成されていることを確認する必要があります。
次の内容を Grafana にインポートして、LoadRampingPolicy のダッシュボードを作成できます。
ダッシュボードは次のとおりです。
