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

Container Service for Kubernetes:ApsaraMQ for RocketMQ メトリックに基づく KEDA

最終更新日:Apr 28, 2025

ApsaraMQ for RocketMQ を使用する場合、メッセージの累積はシステムの高負荷につながる可能性があります。 サービス中断を防ぎ、システムの信頼性と安定性を向上させるために、Kubernetes イベント駆動型自動スケーリング (KEDA) を使用して、ApsaraMQ for RocketMQ のメッセージ累積メトリックに基づいて水平ポッド自動スケーリングを自動化できます。

機能説明

高性能、高信頼性、高スケーラビリティを特徴とする分散メッセージングミドルウェアサービスとして、ApsaraMQ for RocketMQ はエンタープライズクラスのアプリケーションで広く採用されています。 ApsaraMQ for RocketMQ を使用する場合、特に負荷が高い場合にメッセージが累積することがあります。 これはさらにシステム負荷を増加させ、アプリケーションの停止を引き起こす可能性があります。

この問題を解決するために、KEDA を使用して、ApsaraMQ for RocketMQ のカスタムメッセージ累積メトリックに基づいてアプリケーションの水平ポッド自動スケーリングを有効にすることができます。 KEDA は、メッセージ累積メトリックに基づいてアプリケーションを効率的に自動スケーリングできます。 これにより、システムの信頼性と安定性が確保されます。 オープンソースの Apache RocketMQ を使用している場合は、Java Management Extensions (JMX) Prometheus エクスポーターによって収集されたメトリックに基づいて水平ポッド自動スケーリングを有効にすることができます。 詳細については、「Apache RocketMQ」をご参照ください。

このトピックでは、Managed Service for Prometheus をデータソースとして使用した RocketMQ メッセージドッキングスケーリングオブジェクトの構成について詳しく説明します。

前提条件

ステップ 1: アプリケーションをデプロイする

この例では、sample-app という名前の NGINX アプリケーションを作成します。

  1. ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイメント] を選択します。

  3. [デプロイメント] ページで、[YAML から作成] をクリックします。 [作成] ページで、[サンプルテンプレート][カスタム] に設定し、次の YAML テンプレートを使用して sample-app という名前の NGINX アプリケーションを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - name: sample-app
          # 実際の RocketMQ コンシューマーイメージに置き換えます。
            image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 
            resources:
              limits:
                cpu: "500m"

ステップ 2: ScaledObject を使用してスケーリングポリシーを構成する

KEDA スケーリングポリシーを ScaledObject YAML ファイルを使用して構成します。これには、スケーリングオブジェクト、最大レプリカ数と最小レプリカ数、およびメッセージ累積しきい値などのスケーリングしきい値が含まれます。 ScaledObject を構成する前に、Prometheus アドレスと ApsaraMQ for RocketMQ インスタンスメトリックのその他の関連情報を取得します。

1. ApsaraMQ for RocketMQ コンソールからインスタンス情報を取得する

  1. ApsaraMQ for RocketMQ コンソール にログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。

  2. 上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックします。

  3. 左側のナビゲーションウィンドウで、[トピック] をクリックし、右上隅にある [名前][インスタンス ID] (例: それぞれ keda と mq-cn-uax33****) を記録します。

2. Prometheus コンソールで ApsaraMQ for RocketMQ インスタンスの Prometheus データソースを取得する

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

  2. 左側のナビゲーションウィンドウで、[Managed Service For Prometheus] > [インスタンス] を選択します。

  3. [クラウドサービス-{{RegionId}}] という名前のインスタンスを見つけて、その名前をクリックします。 左側のウィンドウで、[設定] をクリックし、[HTTP API URL (Grafana 読み取り URL)] セクションのエンドポイントをコピーします。

    image

3. ScaledObject YAML ファイルを作成する

  1. 次の YAML テンプレートを使用して、スケーリングポリシー構成用の ScaledObject.yaml という名前のファイルを作成します。

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: prometheus-scaledobject
      namespace: default
    spec:
      scaleTargetRef:
        name: sample-app
      maxReplicaCount: 10
      minReplicaCount: 2
      triggers:
      - type: prometheus
        metadata:
          serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
          metricName: rocketmq_consumer_inflight_messages
          query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
          threshold: '30'

    次の表にパラメーターを示します。

    パラメーター

    説明

    scaleTargetRef.name

    スケーリングするオブジェクト。 この例では、値は sample-app に設定されています。これは、ステップ 1: アプリケーションをデプロイする で作成したアプリケーションの名前です。

    maxReplicaCount

    スケールアウト操作中に維持するレプリカの最大数。

    minReplicaCount

    スケールイン操作中に維持するレプリカの最小数。

    serverAddress

    ApsaraMQ for RocketMQ インスタンスのメトリックを格納する Prometheus インスタンスのエンドポイント。 この例では、値は前のステップで [HTTP API アドレス (Grafana 読み取りアドレス)] からコピーしたエンドポイントに設定されています。

    metricName

    Prometheus Query Language (PromQL) クエリデータ。

    query

    metricName パラメーターで指定された PromQL クエリデータを集計します。 この例では、累積メッセージ数の統計が集計されます。

    threshold

    スケーリングしきい値。 この例では、スケーリングしきい値は 30 です。これは、累積メッセージ数が 30 を超えるとアプリケーションがスケールアウトされることを示します。

  2. 次のコマンドを実行して ScaledObject.yaml ファイルをデプロイし、作成されたリソースを確認します。

    # スケーリング構成を適用します。
    kubectl apply -f ScaledObject.yaml
    
    # 次の出力は、作成が成功したことを示します。
    scaledobject.keda.sh/prometheus-scaledobject created
    
    # スケーリング構成のステータスを取得します。
    kubectl get ScaledObject
    
    # ScaledObject の詳細を示す出力。
    NAME                      SCALETARGETKIND      SCALETARGETNAME   MIN   MAX   TRIGGERS     AUTHENTICATION   READY   ACTIVE   FALLBACK   AGE
    prometheus-scaledobject   apps/v1.Deployment   sample-app        2     10    prometheus                    True    False    False      105s
    
    # アプリケーションをスケーリングするために Horizontal Pod Autoscaler (HPA) が作成されているかどうかを確認します。
    kubectl get hpa
    
    # HPA ステータスを示す出力。
    NAME                               REFERENCE               TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)   2         10        2          28m
  3. (オプション) 読み取り操作のデータセキュリティを向上させるには、Prometheus トークンを認証に使用します。

    詳細な手順を表示するには展開します

    1. ページのプロンプトに従って Prometheus トークンを生成します。

      image

    2. customAuthHeader: "Authorization" フィールドと customAuthValue フィールドに Base64 エンコードされた値を使用してシークレットを作成します。

      apiVersion: v1
      kind: Secret
      metadata:
        name: keda-prom-secret
        namespace: default
      data:
        customAuthHeader: "QXV0Xxxxxxxlvbg=="
        customAuthValue: "kR2tpT2lJeFpXSmxaVFV6WlMTxxxxxxxxRMVFE0TUdRdE9USXpaQzFqWkRZd09EZ3dOVFV5WWpZaWZRLjlDaFBYU0Q2dEhWc1dQaFlyMGh3ZU5FQjZQZWVETXFjTlYydVNqOU82TTQ="
    3. 次の YAML テンプレートを使用して、KEDA のアクセス資格情報を作成し、クラスターにデプロイします。

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-prom-creds
        namespace: default
      spec:
        secretTargetRef:
          - parameter: customAuthHeader
            name: keda-prom-secret
            key: customAuthHeader
          - parameter: customAuthValue
            name: keda-prom-secret
            key: customAuthValue
    4. ScaledObject YAML ファイルを作成するときに、前のステップで作成したアクセス資格情報の名前で authenticationRef フィールドを構成します。

      apiVersion: keda.sh/v1alpha1
      kind: ScaledObject
      metadata:
        name: prometheus-scaledobject
        namespace: default
      spec:
        scaleTargetRef:
          name: sample-app
        maxReplicaCount: 10
        minReplicaCount: 2
        triggers:
        - type: prometheus
          metadata:
            serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
            metricName: rocketmq_consumer_inflight_messages
            query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
            threshold: '30'
            authModes: "custom"
          authenticationRef: # 構成フィールド。
              name: keda-prom-creds # 資格情報名。
      説明

      この例では、カスタム認証を使用しています。 認証方式の詳細については、「KEDA コミュニティドキュメント」をご参照ください。

ステップ 3: データを生成および消費する

この例では、rocketmq-keda-sample プロジェクトを使用してデータを生成および消費します。 プロジェクトコードで、ステップ 2 で取得した ApsaraMQ for RocketMQ インスタンスのエンドポイント、ユーザー名、およびパスワードを指定します。

ステップ 4: 生成および消費されたデータを使用してアプリケーションスケーリングをトリガーする

  1. ApsaraMQ for RocketMQ コンソール にログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。

  2. 上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックし、[エンドポイントとネットワーク情報] を記録します。

  3. 左側のナビゲーションウィンドウで、[アクセス制御] をクリックし、[インテリジェント認証] タブをクリックして、ユーザー名とパスワードを記録します。

  4. プロデューサープログラムを実行してデータを生成し、次のコマンドを実行して HPA に関する情報をクエリします。

    kubectl get hpa

    予期される出力:

    NAME                               REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   32700m/30 (avg)   2         10        10         47m

    出力は、sample-app アプリケーションの複製ポッドの数が KEDA で指定された最大値にスケーリングされたことを示しています。

  5. プロデューサープログラムを停止し、コンシューマープログラムを実行します。 次に、次のコマンドを実行して HPA スケーリングステータスを確認します。

    kubectl get hpa -w

    予期される出力:

    NAME                               REFERENCE               TARGETS            MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   222500m/30 (avg)   2         10        10         50m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   232400m/30 (avg)   2         10        10         51m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        10         52m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        2          57m

    出力は、データ消費が終了した後、sample-app アプリケーションの複製ポッドの数が KEDA で指定された最小値にスケールダウンされたことを示しています。

参考資料

KEDA を ApsaraMQ for RabbitMQ メトリックと共に使用して、水平ポッド自動スケーリングを自動化し、キューの長さとメッセージングレートを監視できます。 詳細については、「ApsaraMQ for RabbitMQ のメトリックに基づく水平ポッド自動スケーリング」をご参照ください。