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

Container Service for Kubernetes:ARMS APMを使用した水平ポッド自動スケーリングの有効化

最終更新日:Dec 14, 2024

JavaアプリケーションのAPIへのリクエスト数が急増した場合は、Horizontal Pod Autoscaler (HPA) を設定して、APIの1秒あたりのクエリ (QPS) に基づいてアプリケーションを自動的にスケーリングできます。 このトピックでは、application Real-Time monitoring service (ARMS) のアプリケーションパフォーマンス管理 (APM) サービスを使用して収集されたモニタリングデータに基づいて、アプリケーションを自動的にスケーリングするようにHPAを設定する方法について説明します。

制御ポリシー機能の動作

Container Service for Kubernetes (ACK) クラスターでJavaアプリケーションのARMS APMを有効にすると、アプリケーションのAPIリクエストに関する詳細情報を表示できます。 JavaアプリケーションでARMS APMを有効にする方法の詳細については、「アプリケーションの監視」をご参照ください。 ARMS APMは、収集したデータをPrometheusのManaged Service for Prometheus (Prometheus) がサポートするメトリックに変換します。 次に、alibaba-cloud-metrics-adapterコンポーネントは、PrometheusメトリクスをHPAでサポートされているメトリクスに変換します。 このように、HPAは、収集されたメトリックに基づいてアプリケーションをスケーリングすることができる。

この例では、arms-springboot-demoという名前のアプリケーションが作成されます。 ストレステストは、アプリケーションによって公開される /demo/queryUser/10 APIで実行されます。

前提条件

手順

hpa

手順1: ARMS APMコンポーネントのインストール

アプリケーションでARMS APMを有効にするには、クラスターにone-pilotコンポーネントをインストールする必要があります。

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、ack-onepilotコンポーネントを見つけ、コンポーネントカードの [インストール] をクリックします。 表示されるダイアログボックスで、パラメーターを設定し、[OK] をクリックします。

ステップ2: ARMSへのアクセスをクラスターに許可する

  • ACKサーバーレスクラスター内のアプリケーション、またはエラスティックコンテナインスタンスにデプロイされているアプリケーションを監視するには、まず [クラウドリソースアクセス許可] ページでARMSへのアクセスをクラスターに許可する必要があります。 次に、ack-onepilot用に作成されたすべてのポッドを再起動します。

  • ACKクラスター内のアプリケーションを監視するには、まずARMS Addon Tokenがクラスターに存在するかどうかを確認する必要があります。

    ARMSアドントークンがクラスターに存在するかどうかを確認する操作

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[設定] > [秘密] を選択します。

    3. ページの上部で、[名前空間] ドロップダウンリストから [kube-system] を選択し、addon.arms.tokenが存在するかどうかを確認します。

    • ACKクラスターにARMSアドントークンがある場合、ARMSはクラスターに対してパスワードなしの認証を実行します。

      説明

      デフォルトでは、ARMSアドントークンはACK管理クラスターに存在します。 ただし、ARMSアドントークンは、かなり前に作成された一部のACK管理クラスターには存在しない場合があります。 次の手順を実行して、クラスターにARMSへのアクセスを許可します。

    • ACKクラスターにARMSアドントークンがない場合は、ACKクラスターにARMSへのアクセスを手動で許可する必要があります。

      1. カスタムポリシーを作成し、次の内容をポリシードキュメントに追加します。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ1: カスタムポリシーの作成セクションをご参照ください。

            {
              "Action": "arms:*",
              "Resource": "*",
              "Effect": "Allow"
            }
      2. カスタムポリシーをワーカーRAM (Resource Access Management) ロールにアタッチします。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのステップ2: カスタムポリシーをワーカーRAMロールにアタッチするセクションをご参照ください。

ステップ3: JavaアプリケーションのARMS APMの有効化

Javaアプリケーションをクラスターにデプロイする場合、アプリケーションにラベルを追加することでARMS APMを有効にできます。

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

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

  3. の右上隅にデプロイメントページをクリックします。YAMLから作成する.

  4. 表示されるページで、[サンプルテンプレート] ドロップダウンリストからテンプレートを選択し、[テンプレート] コードエディターのspec > template > metadataセクションに次のラベルを追加します。

    labels:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"     # Replace <your-deployment-name> with the actual application name. 
      one-agent.jdk.version: "OpenJDK11"     # This parameter is required if the application uses JDK 11. 
      armsSecAutoEnable: "on"    # This parameter is required if you want to enable Application Security.
    説明
    • アプリケーションセキュリティの詳細については、アプリケーションセキュリティとは

    • アプリケーションセキュリティの使用に対して課金されます。 アプリケーションセキュリティの課金の詳細については、「課金」をご参照ください。

    YAML Example

    次のYAMLテンプレートは、ARMS APMが有効な配置を作成する方法を示しています。

    Javaアプリケーションの完全なYAMLファイル

    apiVersion: v1
    kind: Namespace
    metadata:
      name: arms-demo
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: arms-springboot-demo
      namespace: arms-demo
      labels:
        app: arms-springboot-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: arms-springboot-demo
      template:
        metadata:
          labels:
            app: arms-springboot-demo
            armsPilotAutoEnable: "on"
            armsPilotCreateAppName: "arms-k8s-demo"
            one-agent.jdk.version: "OpenJDK11"
        spec:
          containers:
            - resources:
                limits:
                  cpu: 0.5
              image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-springboot-demo:v0.1
              imagePullPolicy: Always
              name: arms-springboot-demo
              env:
                - name: SELF_INVOKE_SWITCH
                  value: "true"
                - name: COMPONENT_HOST
                  value: "arms-demo-component"
                - name: COMPONENT_PORT
                  value: "6666"
                - name: MYSQL_SERVICE_HOST
                  value: "arms-demo-mysql"
                - name: MYSQL_SERVICE_PORT
                  value: "3306"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: arms-springboot-demo
      name: arms-springboot-demo
      namespace: arms-demo
    spec:
      ports:
        # the port that this service should serve on
        - name: arms-demo-svc
          port: 6666
          targetPort: 8888
      # label keys and values that must match in order to receive traffic for this service
      selector:
        app: arms-springboot-demo
    ---
    apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
    kind: Deployment
    metadata:
      name: arms-springboot-demo-subcomponent
      namespace: arms-demo
      labels:
        app: arms-springboot-demo-subcomponent
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: arms-springboot-demo-subcomponent
      template:
        metadata:
          labels:
            app: arms-springboot-demo-subcomponent
            armsPilotAutoEnable: "on"
            armsPilotCreateAppName: "arms-k8s-demo-subcomponent"
            one-agent.jdk.version: "OpenJDK11"
        spec:
          containers:
            - resources:
                limits:
                  cpu: 0.5
              image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-springboot-demo:v0.1
              imagePullPolicy: Always
              name: arms-springboot-demo-subcomponent
              env:
                - name: SELF_INVOKE_SWITCH
                  value: "false"
                - name: MYSQL_SERVICE_HOST
                  value: "arms-demo-mysql"
                - name: MYSQL_SERVICE_PORT
                  value: "3306"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: arms-demo-component
      name: arms-demo-component
      namespace: arms-demo
    spec:
      ports:
        # the port that this service should serve on
        - name: arms-demo-component-svc
          port: 6666
          targetPort: 8888
      # label keys and values that must match in order to receive traffic for this service
      selector:
        app: arms-springboot-demo-subcomponent
    ---
    apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
    kind: Deployment
    metadata:
      name: arms-demo-mysql
      namespace: arms-demo
      labels:
        app: mysql
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
            - resources:
                limits:
                  cpu: 0.5
              image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-demo-mysql:v0.1
              name: mysql
              ports:
                - containerPort: 3306
                  name: mysql
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: mysql
      name: arms-demo-mysql
      namespace: arms-demo
    spec:
      ports:
        # the port that this service should serve on
        - name: arms-mysql-svc
          port: 3306
          targetPort: 3306
      # label keys and values that must match in order to receive traffic for this service
      selector:
        app: mysql
    ---
  5. ARMS APMによって収集されたモニタリングデータを表示します。

    [デプロイメント] ページでアプリケーションを見つけ、[ARMSコンソール][操作] 列に表示されているかどうかを確認します。ARMS Console Button

    [ARMSコンソール] をクリックしてモニタリングデータを表示します。 左側のナビゲーションウィンドウで、[Interface Invocation] をクリックして、アプリケーションのAPIへのリクエスト (HTTPリクエストなど) に関する情報を表示します。 arms-springboot-demoアプリケーションのAPIへのリクエストを次の図に示します。 リクエスト頻度は安定しています。4

  6. Server Load Balancer (SLB) インスタンスを使用してarms-springboot-demoアプリケーションのAPIを公開するサービスを作成します。

    1. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [サービス] を選択します。

    2. サービスページの右上隅にある [作成] をクリックします。 [サービスの作成] ダイアログボックスでパラメーターを設定し、[OK] をクリックします。 サービスパラメーターの詳細については、「サービスの作成」をご参照ください。

      2

    3. サービスが作成されるまで待ちます。 [サービス] ページでは、arms-demo-svcサービスの外部エンドポイントを表示できます。 例: 47.94.XX.XX:8080。

    4. 次のコマンドを実行して、サービスの外部エンドポイントを使用して /demo/queryUser/10 APIにリクエストを送信します。

      curl http://47.94.XX.XX:8080/demo/queryUser/10

      期待される出力:

      {"id":1,"name":"KeyOfSpectator","password":"12****"}

      期待される出力は、リクエストが成功したことを示します。

手順4: alibaba-cloud-metrics-adapterの設定

重要
  • Prometheusコンポーネントがインストールされていることを確認します。 それ以外の場合、この手順は実行できません。 詳細については、「Prometheusのマネージドサービス」トピックの手順1: Prometheusのマネージドサービスの有効化を参照してください。

  • alibaba-cloud-metrics-adapterがkube-system名前空間にデプロイされていることを確認します。 それ以外の場合、この手順は実行できません。 詳細については、「alibaba-cloud-metrics-adapterのデプロイ」をご参照ください。

  1. 最初に

    ARMSコンソールを使用します。

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

  3. [インスタンス] ページで、管理するインスタンスを見つけ、その名前をクリックします。 名前はarms_metrics_{RegionId}_XXX形式です。 左側のナビゲーションウィンドウで、[設定] をクリックします。 [設定] タブの下部で、[HTTP API URL (Grafana読み取りURL)] セクションにプロメテウスURLを表示して記録します。

    5

  4. から取得したPrometheus URLを指定します。HTTP APIアドレス (Grafana読み取りアドレス)前の手順で、ack-alibaba-cloud-metrics-adapterの設定セクションを使用します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[アプリケーション] > [ヘルム] を選択します。

    3. On theヘルムページ, 検索ack-alibaba-cloud-metrics-adapterをクリックし、更新で、アクション列を作成します。

    4. では、リリースの更新パネルで、記録したプロメテウスURLを追加します。ステップ 2.

      8

  5. ack-alibaba-cloud-metrics-adapterのadapter-config ConfigMapの設定を変更します。

    1. Helmページで、ack-alibaba-cloud-metrics-adapterをクリックします。

    2. [基本情報] タブで、[adapter-config] をクリックします。

    3. adapter-configページの右上隅で、[YAMLの編集] をクリックします。

    4. adapter-config ConfigMapに次の設定を追加します。

      rules:
      - metricsQuery: sum by (rpc) (sum_over_time(<<.Series>>{rpc="/demo/queryUser/{id}",service="arms-demo:arms-k8s-demo",prpc="__all__",ppid="__all__",endpoint="__all__",destId="__all__",<<.LabelMatchers>>}[1m]))
        name:
          as: ${1}_per_second_queryuser
          matches: ^(.*)_count
        resources:
          namespaced: false
        seriesQuery: arms_app_requests_count

      完全なサンプルコード:

      サンプルコード

      apiVersion: v1
      data:
        config.yaml: >
          rules:
      
          - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
            name:
              as: ${1}_bytes_per_second
              matches: ^(.*)_bytes
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""}
          - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by
          (<<.GroupBy>>)
            name:
              as: ${1}_core_per_second
              matches: ^(.*)_seconds_total
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_cpu_usage_seconds_total{namespace!="",pod!=""}
          - metricsQuery: sum by (rpc)
          (sum_over_time(<<.Series>>{rpc="/demo/queryUser/{id}",service="arms-demo:arms-k8s-demo",prpc="__all__",ppid="__all__",endpoint="__all__",destId="__all__",<<.LabelMatchers>>}[1m]))
            name:
              as: ${1}_per_second_queryuser
              matches: ^(.*)_count
            resources:
              namespaced: false
            seriesQuery: arms_app_requests_count
      kind: ConfigMap
      metadata:
        annotations:
          meta.helm.sh/release-name: ack-alibaba-cloud-metrics-adapter
          meta.helm.sh/release-namespace: kube-system
        creationTimestamp: '2024-04-02T02:29:32Z'
        labels:
          app.kubernetes.io/managed-by: Helm
        managedFields:
          - apiVersion: v1
            fieldsType: FieldsV1
            fieldsV1:
              'f:data':
                .: {}
                'f:config.yaml': {}
              'f:metadata':
                'f:annotations':
                  .: {}
                  'f:meta.helm.sh/release-name': {}
                  'f:meta.helm.sh/release-namespace': {}
                'f:labels':
                  .: {}
                  'f:app.kubernetes.io/managed-by': {}
            manager: rc
            operation: Update
            time: '2024-04-02T02:40:52Z'
        name: adapter-config
        namespace: kube-system
        resourceVersion: '8223891'
        uid: 294634e6-aeae-4048-9e69-365a4ce4b2cd
      
  6. クラスター内のメトリクスを照会します。

    1. 次のコマンドを実行して、arms_app_requests_per_second_queryuserメトリックが存在するかどうかを確認します。

      kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1"

      期待される出力:

      {"kind":"APIResourceList","apiVersion":"v1","groupVersion":"external.metrics.k8s.io/v1beta1","resources":[{"name":"k8s_workload_memory_working_set","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_memory_rss","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_latency_p9999","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_memory_usage","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_traffic_rx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_inflow","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_upstream_rt","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_ratio","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_traffic_tx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_packet_rx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"ahas_sentinel_pass_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_memory_request","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_latency_avg","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_max_connection","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_cpu_limit","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_day","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_month","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_connection_utilization","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_status_5xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_cpu_request","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_network_rx_rate","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_network_rx_errors","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_week","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_memory_cache","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_cpu_request","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_percorepricing","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_packet_tx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_status_4xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_upstream_5xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_cpu_limit","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"ahas_sentinel_block_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_cpu_utilization","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_alb_ingress_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_memory_utilization","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_latency_p95","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l4_active_connection","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_memory_limit","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_hour","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_status_2xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_status_3xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_cpu_util","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_memory_usage","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_network_tx_rate","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"ahas_sentinel_total_qps","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_cpu_usage","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_network_tx_errors","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_rt","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_min","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_latency_p50","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"sls_ingress_latency_p99","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"slb_l7_upstream_4xx","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"k8s_workload_memory_request","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"ahas_sentinel_avg_rt","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"cost_memory_limit","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]},{"name":"arms_app_requests_per_second_queryuser","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]}]}

      出力は、arms_app_requests_per_second_queryuserメトリックが存在することを示します。

    2. 次のコマンドを実行して、リアルタイムメトリック値を表示します。

      kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/arms-demo/arms_app_requests_per_second_queryuser"| jq .

      期待される出力:

      {
        "kind": "ExternalMetricValueList",
        "apiVersion": "external.metrics.k8s.io/v1beta1",
        "metadata": {},
        "items": [
          {
            "metricName": "arms_app_requests_per_second_queryuser",
            "metricLabels": {
              "rpc": "/demo/queryUser/10"
            },
            "timestamp": "2022-11-09T07:49:07Z",
            "value": "6"
          }
        ]
      }

      出力は、メトリック値が期待どおりに返されたことを示します。

手順5: APMメトリックに基づいてアプリケーションを自動的にスケーリングするようにHPAを設定する

  1. hpa.yamlという名前のファイルを作成し、次の内容をファイルに追加します。

    説明
    • hpa.yamlファイルで指定するメトリック名は、前の手順でack-alibaba-cloud-metrics-adapterで定義したものと同じである必要があります。

    • hpa.yamlファイルのtargetパラメーターは、スケールアウトしきい値を指定します。 この例では、QPSが40を超えると、HPAはアプリケーションをスケールアウトします。

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: test-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: arms-springboot-demo
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: arms_app_requests_per_second_queryuser
    # You can specify only thresholds of the Value or AverageValue type for external metrics. 
            target:
              type: AverageValue
              averageValue: 40
  2. 次のコマンドを実行して、arm-springboot-demoアプリケーションにHPAをデプロイします。

    kubectl apply -f hpa.yaml
  3. 次のコマンドを実行して、メトリックの変更を照会します。

    kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/arms-demo/arms_app_requests_per_second_queryuser"| jq .
                            

    期待される出力:

    {
      "kind": "ExternalMetricValueList",
      "apiVersion": "external.metrics.k8s.io/v1beta1",
      "metadata": {},
      "items": [
        {
          "metricName": "arms_app_requests_per_second_queryuser",
          "metricLabels": {
            "rpc": "/demo/queryUser/10"
          },
          "timestamp": "2022-11-09T07:53:16Z",
          "value": "4216"
        }
      ]
    }
  4. 次のコマンドを実行して、HPAに関する詳細情報を照会します。

    kubectl get hpa -n arms-demo

    期待される出力:

    NAME       REFERENCE                         TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    test-hpa   Deployment/arms-springboot-demo   300m/40 (avg)   1         10        10         148m

    HPAがデプロイされていることを示す値が [ターゲット] 列に表示されます。

ストレステストを実行してアプリケーションスケーリングを検証する

  1. 次のコマンドを実行して、デモアプリケーションでストレステストを実行します。

    ab -c 50 -n 2000 http://47.94.XX.XX:8080/demo/queryUser/10
    説明

    47.94.XX.XX:8080 arms-demo-svcサービスの外部エンドポイントです。

  2. メトリック値が指定されたしきい値を超えたときにアプリケーションがスケーリングされているかどうかを確認します。

    • ストレステストを実行した後、アプリケーションのAPIへのリクエスト数が急増したことをARMSコンソールで確認できます。 次のイメージは例を示しています。amp控制台

    • 次のPrometheusダッシュボードは、アプリケーションのAPIのQPSが指定されたスケーリングしきい値を超えると、HPAがアプリケーションをスケーリングすることを示しています。p大盘

    • アプリケーションのAPIのQPSが指定されたスケーリングしきい値を超えると、デモアプリケーション用に作成されたレプリケートされたポッドの数がHPAによってスケールアウトされます。

      kubectl describe hpa test-hpa -n arms-demoコマンドを実行して、スケーリングイベントを照会できます。