サービスメッシュ(ASM)を使用すると、仮想サービスやデスティネーションルールなどのリソースを設定して、マイクロサービスの非侵入型トラフィックガバナンスを実装できます。たとえば、トラフィックルーティング、スロットリング、サーキットブレーカー、トラフィックミラーリングなどの機能を使用できます。このトピックでは、ASM のルートレベルサーキットブレーカー機能の使用方法について説明します。
前提条件
このトピックに必要な 構成ファイル がダウンロードされていること。
Enterprise Edition または Ultimate Edition の ASM インスタンスが作成されており、ASM インスタンスのバージョンが V1.13.4 以降であること。詳細については、「ASM インスタンスを作成する」をご参照ください。
クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
Bookinfo サービスと NGINX サービスが作成されていること。詳細については、「ASM インスタンスにアプリケーションをデプロイする」をご参照ください。
kubectl が ASM インスタンスに接続されていること。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
Istio ゲートウェイがデプロイされていること。詳細については、「Istio ゲートウェイを管理する」をご参照ください。
仮想サービスが作成されていること。詳細については、「仮想サービスを管理する」をご参照ください。
トラフィック生成ツール hey がインストールされていること。詳細については、GitHub の hey を参照してください。
背景情報
ASM では、trafficPolicy フィールドでサーキットブレーカー機能を設定できます。ネットワーク上のアクセスリクエスト数がサーキットブレーカーのしきい値に達すると、新しいアクセスリクエストは拒否されます。デスティネーションルールを設定する場合、trafficPolicy フィールドで、サーキットブレーカー機能の次の 2 つの構成項目を設定できます。
ConnectionPoolSettings: サービスへの最大接続数を指定します。リクエスト数がこの値に達すると、新しいリクエストは保留状態になり、タイムアウトになるか、再試行されます。OutlierDetection: ロードバランシングプールから異常なインスタンスを削除するためのルールを指定します。
Istio は、デスティネーションルールに対して以下のサーキットブレーカー構成を提供します。詳細については、「Destination Rule」をご参照ください。
オープンソース Istio のサーキットブレーカー機能は、次のように動作します。Envoy はアップストリームクラスター内のホストを定期的にスキャンして、ホストで例外が発生しているかどうかを確認します。例外が発生したホストは、接続プールから削除されます。このようにして、アップストリームホストでサーキットブレーキングが実装されます。この動作メカニズムには、次の欠点があります。
API ベースのサーキットブレーキングではなく、サービスベースのサーキットブレーキングが実装されます。
この機能は、ルーティングが発生した後にのみ、サービス宛てのトラフィックに有効になります。
上記の欠点を克服するために、ASM はデータプレーン上の Envoy フィルターチェーンを拡張し、com.aliyun.break filter を提供して、ルートレベルのサーキットブレーキングをサポートします。コントロールプレーンでは、ASM を使用すると、ASMCircuitBreaker CustomResourceDefinition(CRD)を使用して、基盤となる実装に焦点を当てることなくサーキットブレーキングを実装できます。
この例では、Bookinfo サービスと HTTPBin サービスを使用して、低速リクエストとエラーリクエストをシミュレートします。Bookinfo サービスは default ネームスペースにデプロイされます。HTTPBin サービスは foo ネームスペースにデプロイされます。イングレスゲートウェイは istio-system ネームスペースにデプロイされます。HTTPBin サービスは、foo ネームスペースのバックエンドテストサービスにデプロイされ、サーキットブレーキングの範囲を確認します。
シナリオ
ASM ゲートウェイに対してルートレベルのサーキットブレーカー機能を有効にすることができます。この機能は、HTTP プロトコルと Google Remote Procedure Call(gRPC)プロトコルをサポートしています。Istio ゲートウェイ構成を ASMCircuitBreaker CRD の YAML ファイルに追加できます。この例では、/httpbin へのリクエストを転送する httpbin-route-name1 ルートに対してサーキットブレーカールールが構成されています。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMCircuitBreaker
metadata:
name: ingressgateway
namespace: istio-system
spec:
workloadSelector:
labels:
app: istio-ingressgateway
isGateway: true
configs:
- match:
vhost:
name: "bf2.example.com"
port: 80
route:
name_match: nginx-route-name1
breaker_config:
slow_request_rt: 0.1s
break_duration: 90s
window_size: 10s
max_slow_requests: 10
min_request_amount: 3
error_percent:
value: 60
custom_response:
header_to_add:
x-envoy-circuitbreak: "true"
body: "hello, break!"
status_code: 499次の表に、いくつかのフィールドについて説明します。ASMCircuitBreaker CRD のその他のフィールドの説明については、「ASMCircuitBreaker フィールドの説明」をご参照ください。
フィールド | 説明 |
| ゲートウェイに構成を適用するかどうかを指定します。既定値: |
| 許可されるエラーリクエストの最大パーセンテージ。パーセンテージがこの値 60% を超え、リクエスト数が 3 以上の場合、新しいリクエストは拒否されます。 |
| 許可される低速リクエストの最大数。数がこの値 10 を超えると、新しいリクエストは拒否されます。 説明 リクエストの応答時間が |
| 新しいリクエストが拒否されるサーキットブレーキング期間。単位:秒。この例では、サーキットブレーキング期間は 90 秒に設定されています。 |
サーキットブレーカールールの構成と検証
この例では、bf2.example.com:80 仮想ホストの httpbin-route-name1 ルートに対してサーキットブレーカールールを構成して、スロットリングを実装します。
asmcircuitbreaker-test-gw.yaml ファイルを作成し、次の内容をファイルに追加します。
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMCircuitBreaker metadata: name: ingressgateway namespace: istio-system spec: workloadSelector: labels: app: istio-ingressgateway isGateway: true configs: - match: vhost: name: "bf2.example.com" port: 80 route: name_match: httpbin-route-name1 breaker_config: slow_request_rt: 0.1s break_duration: 90s window_size: 10s max_slow_requests: 10 min_request_amount: 3 error_percent: value: 60 custom_response: header_to_add: x-envoy-overload: "true" body: "hello, break!" status_code: 499次のコマンドを実行して、ASMCircuitBreaker を作成します。
kubectl apply -f asmcircuitbreaker-test-gw.yamlリクエストに対する 1 秒のレイテンシ、または Httpbin サービスの 500 応答エラーをシミュレートします。操作を 10 回繰り返します。
次のコマンドを実行して、リクエストに対する 1 秒のレイテンシをシミュレートします。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/delay/1 -v次のコマンドを実行して、HTTPBin サービスの 500 応答エラーをシミュレートします。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/status/500 -v
予期される出力:
< HTTP/1.1 499 Unknown < Content-Length: 12 < Content-Type: text/plain < x-envoy-overload: true < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < Hello,Break!Hello,Break!が返された場合、リクエストは拒否されます。次のコマンドを実行して、Bookinfo サービスの
/productpageインターフェースにアクセスします。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -vProductpage ページで
HTTP 200が返された場合、リクエストは拒否されません。