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

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

最終更新日:Oct 28, 2024

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 exporterによって収集されたメトリックに基づいて、水平ポッドの自動スケーリングを有効にできます。 詳細については、「Apache RocketMQ」をご参照ください。

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

前提条件

  • ack-kedaコンポーネントが展開されます。 詳細については、「ACK KEDA」をご参照ください。

  • ApsaraMQ for RocketMQ 5.xインスタンスが作成されました。 詳細は、インスタンスの作成をご参照ください。

    サーバーレスApsaraMQ for RocketMQ 5.xインスタンスは、ビジネスワークロードに基づく迅速なリソーススケーリングをサポートしています。 コストを削減するために、リソースが割り当てられ、実際の使用量に応じてコンピューティング料金が請求されます。 詳細については、「Serverless ApsaraMQ For RocketMQ 5.xインスタンスの概要」をご参照ください。

ステップ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
            image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0  // Change to the actual RocketMQ consumer image.
            resources:
              limits:
                cpu: "500m"

手順2: ScaledObjectを使用したスケーリングポリシーの設定

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

1。 ApsaraMQ for RocketMQコンソールからのインスタンス情報の取得

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

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

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

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

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

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

  3. cloud-product-prometheus _{{ RegionId}} という名前のインスタンスを見つけて、その名前をクリックします。 左側のウィンドウで、[設定] をクリックします。 [Cloud Service: rocketmq] をクリックし、[HTTP APIアドレス (Grafana読み取りアドレス)] セクションにエンドポイントをコピーします。

    4

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クエリデータを集計します。 この例では、蓄積されたメッセージの数の統計が集約される。

    しきい値

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

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

    # Apply the scaling configuration.
    kubectl apply -f ScaledObject.yaml
    
    # The following output indicates successful creation.
    scaledobject.keda.sh/prometheus-scaledobject created
    
    # Retrieve the status of the scaling configuration.
    kubectl get ScaledObject
    
    # Output showing the ScaledObject details.
    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
    
    # Check whether a Horizontal Pod Autoscaler (HPA) is created to scale the application. 
    kubectl get hpa
    
    # Output showing the HPA status.
    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-encoded値を使用してシークレットを作成します。

      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: # Configuration field.
              name: keda-prom-creds # Credential name.
      説明

      この例では、カスタム認証を使用します。 認証方法の詳細については、「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で指定された最小値に縮小されることを示しています。

関連ドキュメント

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