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

Alibaba Cloud Service Mesh:ASM のルートレベルサーキットブレーカー機能を使用する

最終更新日:Jan 13, 2025

サービスメッシュ(ASM)を使用すると、仮想サービスやデスティネーションルールなどのリソースを設定して、マイクロサービスの非侵入型トラフィックガバナンスを実装できます。たとえば、トラフィックルーティング、スロットリング、サーキットブレーカー、トラフィックミラーリングなどの機能を使用できます。このトピックでは、ASM のルートレベルサーキットブレーカー機能の使用方法について説明します。

前提条件

  • このトピックに必要な 構成ファイル がダウンロードされていること。

  • Enterprise Edition または Ultimate Edition の ASM インスタンスが作成されており、ASM インスタンスのバージョンが V1.13.4 以降であること。詳細については、「ASM インスタンスを作成する」をご参照ください。

  • クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。

  • イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイを作成する」をご参照ください。

  • Bookinfo サービスと NGINX サービスが作成されていること。詳細については、「ASM インスタンスにアプリケーションをデプロイする」をご参照ください。

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

  • Istio ゲートウェイがデプロイされていること。詳細については、「Istio ゲートウェイを管理する」をご参照ください。

    Istio ゲートウェイの YAML コードを表示する

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - bf2.example.com
        port:
          name: http
          number: 80
          protocol: http
  • 仮想サービスが作成されていること。詳細については、「仮想サービスを管理する」をご参照ください。

    仮想サービスの YAML コードを表示する

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
      namespace: default
    spec:
      gateways:
      - bookinfo-gateway
      hosts:
      - bf2.example.com
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        name: productpage-route-name1
        route:
        - destination:
            host: productpage
            port:
              number: 9080
      - match:
        - uri:
            prefix: /httpbin
        name: httpbin-route-name1
        rewrite:
          uri: /
        route:
        - destination:
            host: httpbin.foo.svc.cluster.local
            port:
              number: 80
  • トラフィック生成ツール hey がインストールされていること。詳細については、GitHub の hey を参照してください。

背景情報

ASM では、trafficPolicy フィールドでサーキットブレーカー機能を設定できます。ネットワーク上のアクセスリクエスト数がサーキットブレーカーのしきい値に達すると、新しいアクセスリクエストは拒否されます。デスティネーションルールを設定する場合、trafficPolicy フィールドで、サーキットブレーカー機能の次の 2 つの構成項目を設定できます。

  • ConnectionPoolSettings: サービスへの最大接続数を指定します。リクエスト数がこの値に達すると、新しいリクエストは保留状態になり、タイムアウトになるか、再試行されます。

  • OutlierDetection: ロードバランシングプールから異常なインスタンスを削除するためのルールを指定します。

Istio は、デスティネーションルールに対して以下のサーキットブレーカー構成を提供します。詳細については、「Destination Rule」をご参照ください。

デスティネーションルールの YAML コードを表示する

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
                

オープンソース 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 フィールドの説明」をご参照ください。

フィールド

説明

isGateway: true

ゲートウェイに構成を適用するかどうかを指定します。既定値: false です。

value: 60

許可されるエラーリクエストの最大パーセンテージ。パーセンテージがこの値 60% を超え、リクエスト数が 3 以上の場合、新しいリクエストは拒否されます。

max_slow_requests: 10

許可される低速リクエストの最大数。数がこの値 10 を超えると、新しいリクエストは拒否されます。

説明

リクエストの応答時間が slow_request_rt フィールドの値を超えると、そのリクエストは低速リクエストと見なされます。

break_duration: 90s

新しいリクエストが拒否されるサーキットブレーキング期間。単位:秒。この例では、サーキットブレーキング期間は 90 秒に設定されています。

サーキットブレーカールールの構成と検証

この例では、bf2.example.com:80 仮想ホストの httpbin-route-name1 ルートに対してサーキットブレーカールールを構成して、スロットリングを実装します。

  1. 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
  2. 次のコマンドを実行して、ASMCircuitBreaker を作成します。

    kubectl apply -f asmcircuitbreaker-test-gw.yaml
  3. リクエストに対する 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! が返された場合、リクエストは拒否されます。

  4. 次のコマンドを実行して、Bookinfo サービスの /productpage インターフェースにアクセスします。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/productpage -v

    Productpage ページで HTTP 200 が返された場合、リクエストは拒否されません。

関連情報

ASMCircuitBreaker フィールドの説明