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

Container Service for Kubernetes:ApsaraMQ for RocketMQ メトリクスに基づくイベント駆動型オートスケーリング (KEDA)

最終更新日:Aug 29, 2026

ApsaraMQ for RocketMQ を使用する際、メッセージの蓄積によってシステム負荷が高くなる可能性があります。サービスのクラッシュを防ぎ、システムの信頼性と安定性を向上させるために、Kubernetes Event-driven Autoscaling (KEDA) をオートスケーリングソリューションとして使用できます。KEDA を使用すると、ApsaraMQ for RocketMQ のメッセージ蓄積メトリクスに基づいて、自動化された効率的な水平ポッド自動スケーリング (HPA) を実装できます。

背景情報

ApsaraMQ for RocketMQ は、高性能、高信頼性、高スケーラビリティを備えた分散メッセージングミドルウェアであり、エンタープライズアプリケーションで広く使用されています。ただし、特に高負荷時にメッセージの蓄積が発生する可能性があります。これにより、システム負荷が過大になり、サービスのクラッシュを引き起こす可能性もあります。

このシナリオでは、Kubernetes イベント駆動型オートスケーリングツールである KEDA を使用して、カスタムの ApsaraMQ for RocketMQ メッセージ蓄積メトリクスに基づいてアプリケーションの水平ポッド自動スケーリングをトリガーできます。このソリューションにより、自動化された効率的なアプリケーションスケーリングが実現し、システムの信頼性と安定性が向上します。オープンソースの Apache RocketMQ を使用している場合は、Java Management Extensions (JMX) Prometheus Exporter を通じてメッセージデータを公開することで、同様の機能を実現できます。詳細については、Apache RocketMQ コミュニティをご覧ください。

このトピックでは、Managed Service for Prometheus をデータソースとして使用し、ApsaraMQ for RocketMQ と連携する KEDA ScaledObject の設定方法について説明します。

前提条件

ステップ 1:ワークロードのデプロイ

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

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

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

  3. デプロイメント ページで、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
            # これを実際の ApsaraMQ for 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 の設定

ScaledObject YAML ファイルで KEDA スケーリングポリシーを設定します。これらのポリシーには、スケール対象、レプリカの最小数と最大数、およびメッセージの蓄積しきい値などのスケーリングしきい値が含まれます。ScaledObject を設定する前に、ApsaraMQ for RocketMQ インスタンスメトリクスの Prometheus URL を取得する必要があります。

1. ApsaraMQ for RocketMQ コンソールでのインスタンス情報の取得

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

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

  3. 左側のナビゲーションペインで、トピックをクリックします。 右上隅でトピックの名前インスタンス IDを確認し、記録します。 たとえば、トピック名は keda で、インスタンス ID は mq-cn-uax33**** です。

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

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

  2. 左側のナビゲーションウィンドウで、Prometheusのマネージドサービス > インスタンス.

  3. 対象のインスタンスの Cloud Services-{{RegionId}} をクリックします。 左側のナビゲーションペインで、設定 をクリックし、HTTP API アドレス (Grafana 読み取りアドレス) を記録します。

    [パブリックエンドポイント] の URL を使用する必要があります。

3. ScaledObject YAML ファイルの作成

  1. 以下の内容を使用して、スケーリングポリシーを設定する 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

    スケール対象のワークロード。 この例では、ステップ 1: ワークロードのデプロイで作成したアプリケーションである sample-app を設定します。

    maxReplicaCount

    スケールアウトする最大レプリカ数。

    minReplicaCount

    スケールインする最小レプリカ数。

    serverAddress

    ApsaraMQ for RocketMQ メトリクス用の Prometheus サービスの URL です。以前に記録したHTTP API アドレス (Grafana 読み取りアドレス)を使用します。

    metricName

    PromQL クエリでリクエストするデータ。

    クエリ

    metricName の PromQL が要求するデータを集計します。 この例では、集計クエリはメッセージの蓄積のための PromQL です。

    しきい値

    スケーリングのしきい値。この例では、メッセージの蓄積数 30 をしきい値として使用します。蓄積数が 30 を超えると、スケールアウトがトリガーされます。

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

    # スケーリング設定を適用します。
    kubectl apply -f ScaledObject.yaml
    scaledobject.keda.sh/prometheus-scaledobject created
    # スケーリング設定のステータスを取得します。
    kubectl get 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
    # 生成された HPA のステータスを確認します。
    kubectl get 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 トークンを生成します。

      トークンが生成されると、ページに HTTP API アドレス (Grafana 読み取りアドレス) 情報が表示されます。 この情報には、表示アイコンとコピーアイコンから完全な値を取得できる生成されたトークンの値、およびパブリックエンドポイント内部エンドポイントのネットワークタイプ用の Prometheus アクセス URL が含まれます。 ScaledObject YAML ファイルの設定に必要な URL とトークンの値を記録してください。

    2. シークレットを作成します。customAuthHeader: "Authorization" および customAuthValue フィールドの値は、Base64 でエンコードする必要があります。

      apiVersion: v1
      kind: Secret
      metadata:
        name: keda-prom-secret
        namespace: default
      data:
        customAuthHeader: "QXV0Xxxxxxxlvbg=="
        customAuthValue: "kR2tpT2lJeFpXSmxaVFV6WlMTxxxxxxxxRMVFE0TUdRdE9USXpaQzFqWkRZd09EZ3dOVFV5WWpZaWZRLjlDaFBYU0Q2dEhWc1dQaFlyMGh3ZU5FQjZQZWVETXFjTlYydVNqOU82TTQ="
    3. 次のサンプルコードを使用して、KEDA TriggerAuthentication リソースを作成し、クラスターにデプロイします。

      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 # TriggerAuthentication リソースの名前。
      説明

      この例では、Custom 認証タイプを使用します。その他の認証方法については、KEDA コミュニティドキュメントをご参照ください。

ステップ 3:データの生成と消費

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

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

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

  2. トップメニューバーで、中国 (杭州) などのリージョンを選択します。インスタンスリストで、目的のインスタンスの名前をクリックして、[エンドポイントとネットワーク情報] を表示して記録します。

  3. 左側のナビゲーションペインで、アクセス制御 をクリックします。次に、インテリジェントID認識タブをクリックして、インスタンスのユーザー名とパスワードを表示して記録します。

  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 を RabbitMQ メトリクスと併用して、キューの長さとメッセージレートを監視することもできます。詳細については、「RabbitMQ メトリクスに基づくポッドのオートスケーリング」をご参照ください。