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

Container Service for Kubernetes:Prometheus メトリックに基づく水平自動スケーリングの実装

最終更新日:Mar 08, 2025

デフォルトでは、Horizontal Pod Autoscaler ( HPA ) は CPU とメモリのメトリックに基づく自動スケーリングをサポートしています。ただし、これらのメトリックは、複雑な操作シナリオでは不十分な場合があります。Managed Service for Prometheus によって収集されたカスタムメトリックと外部メトリックを HPA でサポートされているスケーリングメトリックに変換するには、このトピックをご参照ください。このトピックでは、モニタリングデータを取得し、対応するスケーリング設定を実装する方法について説明しています。このソリューションは、アプリケーションに柔軟で便利なスケーリングメカニズムを提供します。

前提条件

機能

デフォルトでは、HPA は CPU とメモリ使用量に基づく自動スケーリングのみをサポートしています。これは、O&M 要件を満たすことができません。 Managed Service for Prometheus は、オープンソースの Prometheus エコシステムと連携するフルマネージド型のモニタリングサービスです。 Managed Service for Prometheus はさまざまなコンポーネントを監視し、すぐに使用できる複数のダッシュボードを提供します。 Prometheus メトリックに基づいて水平ポッド自動スケーリングを有効にするには、次の手順を実行します。

  1. ACK クラスタで Managed Service for Prometheus を使用してメトリックを公開します。

  2. ack-alibaba-cloud-metrics-adapter を使用して、Prometheus メトリックを HPA でサポートされている Kubernetes メトリックに変換します。詳細については、「Kubernetes オブジェクトに関連しないメトリックでの自動スケーリング」をご参照ください。

  3. Configure and deploy the HPA to perform auto scaling based on the preceding metrics. 上記のメトリックに基づいて自動スケーリングを実行するように HPA を構成およびデプロイします。

    メトリックは、シナリオに基づいて次のタイプに分類できます。

次のセクションでは、alibaba-cloud-metrics-adapter を構成して Prometheus メトリックを HPA でサポートされているメトリックに変換し、自動スケーリングを行う方法について説明します。

ステップ 1: Prometheus メトリックを収集する

定義済みのメトリックを使用します

ACK クラスタにインストールされている Managed Service for Prometheus で使用可能な定義済みメトリックに基づいて、自動スケーリングを実行できます。定義済みメトリックには、コンテナ監視用の cadvisor メトリック、ノード監視用の Node-Exporter および GPU-Exporter メトリック、Managed Service for Prometheus によって提供されるすべてのメトリックが含まれます。Managed Service for Prometheus で定義済みメトリックを表示するには、次の手順を実行します。

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

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、[操作] > [prometheus Monitoring] を選択します。

  3. [ARMS Prometheus に移動] を右上隅でクリックします。

  4. 左側のナビゲーションウィンドウで、[設定] をクリックして、Managed Service for Prometheus でサポートされているすべてのメトリックを表示します。

Example 2: ポッドによって報告される Prometheus メトリックを使用する

Deploy a testing application and expose the metrics of the application based on the metric standards of open-source Prometheus. For more information, see METRIC TYPES. The following section describes how to deploy an application named sample-app and expose the http_requests_total metric to indicate the number of requests sent to the application. テスト アプリケーションをデプロイし、オープンソースの Prometheus のメトリック標準に基づいてアプリケーションのメトリックを公開します。詳細については、「METRIC TYPES」をご参照ください。次のセクションでは、sample-app という名前のアプリケーションをデプロイし、アプリケーションに送信されたリクエスト数を示す http_requests_total メトリックを公開する方法について説明します。

  1. ワークロードをデプロイします。

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

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

    3. [デプロイメント] ページの上部で、[YAML から作成] をクリックします。[作成] ページで、カスタム[サンプル テンプレート] ドロップダウン リストから [作成] を選択し、次のコンテンツをテンプレートに追加して、 をクリックします。

      YAML テンプレートを表示するには展開します

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        labels:
          app: sample-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sample-app
        template:
          metadata:
            labels:
              app: sample-app
          spec:
            containers:
            - image: luxas/autoscale-demo:v0.1.2
              name: metrics-provider
              ports:
              - name: http
                containerPort: 8080
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sample-app
        namespace: default
        labels:
          app: sample-app
      spec:
        ports:
          - port: 8080
            name: http
            protocol: TCP
            targetPort: 8080
        selector:
          app: sample-app
        type: ClusterIP
  2. ServiceMonitor を作成します。

    1. Application Real-Time Monitoring Service (ARMS) コンソール にログオンします。

    2. 左側のナビゲーションウィンドウで、[統合管理] をクリックします。ページ上部で、クラスターが存在するリージョンを選択します。

    3. 統合環境[統合管理] ページの [コンテナー サービス][環境名/ID] タブで、 タブをクリックします。 列で、クラスターと同じ名前を持つ Prometheus インスタンスをクリックします。

    4. [コンテナー サービス] ページで、[メトリック スクレイピング] タブをクリックします。

    5. 現在のタブの左側のナビゲーションウィンドウで、[service Monitor] をクリックします。次に、[作成] をクリックします。[servicemonitor 構成の追加] パネルで、[YAML] をクリックし、ServiceMonitor の次の構成を追加して、[作成] をクリックします。

      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        annotations:
          arms.prometheus.io/discovery: 'true'
        name: sample-app
        namespace: default
      spec:
        endpoints:
        - interval: 30s
          port: http
          path: /metrics
        namespaceSelector:
          any: true
        selector:
          matchLabels:
            app: sample-app
  3. モニタリングの状態を確認します。

    [自己監視] タブのインスタンス詳細ページで、[ターゲット] タブをクリックします。default/sample-app/0(1/1 up) が表示されている場合は、Managed Service for Prometheus がアプリケーションを監視しています。

  4. Prometheus ダッシュボードで、一定期間内の http_requests_total の値をクエリして、モニタリングデータがエラーなしで収集されていることを確認します。

Step 2: [ack-alibaba-cloud-metrics-adapter]

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

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のナビゲーションウィンドウで、アプリケーション > Helm を選択します。

  3. [helm] ページで、ack-alibaba-cloud-metrics-adapter を見つけ、更新[アクション] 列の をクリックします。

  4. [リリースの更新] パネルで、YAML エディターに次のコンテンツを追加し、[OK] をクリックします。

    YAML コンテンツ

      AlibabaCloudMetricsAdapter:
      ......
        prometheus:
          enabled: true    # パラメーターを true に設定して Prometheus アダプターを有効にします。
          # Managed Service for Prometheus のエンドポイントを指定します。
          url: https://cn-beijing.arms.aliyuncs.com:9443/api/v1/prometheus/xxxx/xxxx/xxxx/cn-beijing
          # Managed Service for Prometheus でトークンベースの認証が有効になっている場合は、prometheusHeader パラメーターの Authorization フィールドを指定します。
          prometheusHeader:
          - Authorization: xxxxxxx
    
          metricsRelistInterval: 1m # メトリック収集間隔を指定します。デフォルト値 1min を使用することをお勧めします。
        	logLevel: 5								# コンポーネントデバッグログのレベルを指定します。デフォルト値を使用することをお勧めします。
    
          adapter:
            rules:
              default: false  			# 事前定義されたメトリックを作成するかどうかを指定します。デフォルトでは、事前定義されたメトリックが作成されます。デフォルト値 false を使用することをお勧めします。
              custom:
    
              # 例 1: カスタムメトリック構成
              # この構成は、Prometheus メトリック container_memory_working_set_bytes をカスタムメトリック container_memory_working_set_bytes_per_second に変換します。
              # また、CPU メトリック container_cpu_usage_seconds_total を container_cpu_usage_core_per_second に変換します。
              # コマンドを実行してメモリ/CPU 値を確認できます。
              # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second"
              # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second"
              # ドキュメントを参照してください: https://help.aliyun.com/document_detail/184519.html
    
              - seriesQuery: 'container_memory_working_set_bytes{namespace!="",pod!=""}'
                resources:
                  overrides:
                    namespace: { resource: "namespace" }
                    pod: { resource: "pod" }
                name:
                  matches: "^(.*)_bytes"
                  as: "${1}_bytes_per_second"
                metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)' # metricsQuery パラメーターで指定されたラベルセレクターは、seriesQuery パラメーターで指定されたラベルに基づいてリソースを選択しません。
              - seriesQuery: 'container_cpu_usage_seconds_total{namespace!="",pod!=""}'
                resources:
                  overrides:
                    namespace: { resource: "namespace" }
                    pod: { resource: "pod" }
                name:
                  matches: "^(.*)_seconds_total"
                  as: "${1}_core_per_second"
                metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'  # metricsQuery パラメーターで指定されたラベルセレクターは、seriesQuery パラメーターで指定されたラベルに基づいてリソースを選択しません。
    
              # 例 2: 外部メトリック構成
    
              # ドキュメントを参照してください: https://help.aliyun.com/document_detail/608768.html
    
              # 変換ルールを追加します。メトリックラベルが Prometheus のメトリックのラベルと同じであることを確認してください。ラベルが異なる場合は、Prometheus のメトリックのラベルを指定してください。
    
              #- seriesQuery: http_requests_total{namespace!="",pod!=""}
              #  resources:
              #    overrides:
              #      # resource フィールドは Kubernetes API リソースを指定します。kubectl api-resources -o wide コマンドを実行してリソースをクエリできます。
              # key フィールドは Prometheus メトリックの LabelName を指定します。Prometheus メトリックが指定された LabelName を使用していることを確認してください。
              #      namespace: {resource: "namespace"}
              #      pod: {resource: "pod"}
              #  name:
              #    matches: ^(.*)_total
              #   as: ${1}_per_second
              #  metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
    
    
              # これは外部メトリック構成の例です。
    
              # ドキュメントを参照してください: https://help.aliyun.com/document_detail/608768.html
    
              #- seriesQuery: arms_app_requests_count
              #  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
    
    
              # これは、ユーザー定義 Prometheus メトリック http_requests_total からのカスタムメトリックの例です。
              # ドキュメントを参照してください: https://help.aliyun.com/document_detail/184519.html
    
              #- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
              #  resources:
              #    overrides:
              #      namespace: {resource: "namespace"}
              #      pod: {resource: "pod"}
              #  name:
              #    matches: "^(.*)_total"
              #    as: "${1}_per_second"
              #  metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
              # - seriesQuery: '{__name__=~"^some_metric_count$"}'
              #   resources:
              #     template: <<.Resource>>
              #   name:
              #     matches: ""
              #     as: "my_custom_metric"
              #   metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
    
        ......

    次の表に、いくつかのフィールドについて説明します。 ack-alibaba-cloud-adapter の構成ファイルの詳細については、このトピックのack-alibaba-cloud-metrics-adapter の構成ファイルセクションをご参照ください。

    フィールド

    説明

    AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom

    alibaba-cloud-metrics-adapter の構成。これは、Prometheus メトリックを変換するために使用されます。このフィールドを、上記の YAML コンテンツの値に設定します。

    alibabaCloudMetricsAdapter.prometheus.url

    Managed Service for Prometheus のエンドポイント。エンドポイントの取得方法の詳細については、このトピックのManaged Service for Prometheus API のエンドポイントを取得するセクションをご参照ください。

    AlibabaCloudMetricsAdapter.prometheus.prometheusHeader[].Authorization

    The token。詳細については、この Topic のManaged Service for Prometheus API のエンドポイントを取得するセクションをご参照ください。

    AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default

    事前定義済みのメトリックを作成するかどうかを指定します。デフォルトでは、事前定義済みのメトリックが作成されます。デフォルト値 false を使用することをお勧めします。

ack-alibaba-cloud-metrics-adapter を構成します。ack-alibaba-cloud-metrics-adapter のデプロイ後、次のコマンドを実行して Kubernetes 集約 API がデータを収集したかどうかを確認します。

  1. カスタム メトリックに基づいてポッドをスケーリングします。

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

      kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .
    2. 次のコマンドを実行して、デフォルトの名前空間で http_requests_per_second メトリックの現在の値をクエリします。

      # container_memory_working_set_bytes_per_second メトリックをクエリして、kube-system 名前空間のポッドの作業メモリのサイズを 1 秒あたりで表示します。
      kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second"
      
      # container_cpu_usage_core_per_second メトリックをクエリして、kube-system 名前空間のポッドの vCore 数を 1 秒あたりで表示します。
      kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second"

      サンプル出力:

      {
        "kind": "MetricValueList",
        "apiVersion": "custom.metrics.k8s.io/v1beta1",
        "metadata": {
          "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_memory_working_set_bytes_per_second"
        },
        "items": [
          {
            "describedObject": {
              "kind": "Pod",
              "namespace": "kube-system",
              "name": "ack-alibaba-cloud-metrics-adapter-7cf8dcb845-h****",
              "apiVersion": "/v1"
            },
            "metricName": "container_memory_working_set_bytes_per_second",
            "timestamp": "2023-08-09T06:30:19Z",
            "value": "24576k",
            "selector": null
          }
        ]
      }
  2. 外部メトリックに基づいてポッドをスケーリングします。

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

      kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .
    2. 次のコマンドを実行して、デフォルトの名前空間で http_requests_per_second メトリックの現在の値をクエリします。

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

      サンプル出力:

      {
        "kind": "ExternalMetricValueList",
        "apiVersion": "external.metrics.k8s.io/v1beta1",
        "metadata": {},
        "items": [
          {
            "metricName": "http_requests_per_second",
            "metricLabels": {},
            "timestamp": "2022-01-28T08:40:20Z",
            "value": "33m"
          }
        ]
      }
      

ステップ 3:収集されたメトリックに基づいて自動スケーリングを実行するように HPA を構成およびデプロイする

HPA をデプロイする

Prometheus メトリックを使用して、カスタム メトリックと外部メトリックを同時に公開できます。次の表は、2 種類のメトリックについて説明しています。

メトリックの種類

説明

カスタム メトリック

Kubernetes オブジェクト ( ポッドなど ) を、オブジェクトに関連するメトリックに基づいてスケーリングします。たとえば、ポッドメトリックに基づいてポッドをスケーリングできます。詳細については、「複数のメトリックとカスタムメトリックでの自動スケーリング」をご参照ください。

外部メトリック

Kubernetes オブジェクト ( ポッドなど ) を、オブジェクトに関連しないメトリックに基づいてスケーリングします。たとえば、ビジネス QPS に基づいてワークロードのポッドをスケーリングできます。詳細については、「Kubernetes オブジェクトに関連しないメトリックでの自動スケーリング」をご参照ください。

カスタム メトリックに基づいてポッドをスケーリングする

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

    kind: HorizontalPodAutoscaler
    apiVersion: autoscaling/v2
    metadata:
      name: sample-app-memory-high
    spec:
    # HPA でスケーリングするオブジェクトを記述します。HPA は、オブジェクトにデプロイされているポッドの数を動的に変更できます。
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
    # ポッドの最大数と最小数を指定します。
      minReplicas: 1
      maxReplicas: 10
    # HPA が自動スケーリングを実行する基準となるメトリックを指定します。同時に異なるタイプのメトリックを指定できます。
      metrics:
      - type: Pods
        pods:
          # pods/container_memory_working_set_bytes_per_second メトリックを使用します。
          metric: 
            name: container_memory_working_set_bytes_per_second
     # AverageValue タイプのしきい値を指定します。Pods メトリックには AverageValue タイプのしきい値のみを指定できます。
          target:
            type: AverageValue
            averageValue: 1024000m       # 1024000m は 1 KB のメモリしきい値を示します。単位: バイト/秒。m は Kubernetes で使用される精度単位です。値に小数点以下の桁数が含まれていて、ACK で高い精度が必要な場合は、m または k 単位が使用されます。たとえば、1001m は 1.001 に等しく、1k は 1000 に等しくなります。
  2. Run the following command to create the HPA: 次のコマンドを実行して HPA を作成します。

    kubectl apply -f hpa.yaml
  3. kubectl get hpa

    kubectl get hpa sample-app-memory-high

    Durable Functions in Python Durable Functions is an extension of Azure Functions that lets you write stateful functions in a serverless compute environment. The extension manages state, checkpoints, and restarts for you. This article gives you an overview of Durable Functions in Python. If you're not already familiar with Azure Functions, see Azure Functions developers guide. For more information about the differences between durable function orchestration in Python and other languages, see the Comparison with other Durable Functions languages article. Durable Functions lets you define stateful workflows in code that can: Interact with other Azure services Chain functions together Define timeouts and retry policies Pass data between functions Manage external events ``` ```html Python の Durable Functions Durable Functions は、サーバーレス コンピューティング環境でステートフル関数を記述できる Azure Functions の拡張機能です。この拡張機能は、状態、チェックポイント、および再起動を管理します。 この記事では、Python の Durable Functions の概要について説明します。Azure Functions に慣れていない場合は、「Azure Functions 開発者ガイド」をご覧ください。 詳細については、「他の Durable Functions 言語との比較」の記事をご参照ください。 Durable Functions を使用すると、次のことができるコードでステートフル ワークフローを定義できます。 他の Azure サービスと連携する 関数を連結する タイムアウトと再試行ポリシーを定義する 関数間でデータを渡す 外部イベントを管理する ```

    NAME                     REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-app-memory-high   Deployment/sample-app   24576k/1024000m   3         10        1          7m

外部メトリックに基づいてポッドをスケーリングする

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

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-app
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: http_requests_per_second
              selector:
                matchLabels:
                  job: "sample-app"
    # 外部メトリックには、Value または AverageValue タイプのしきい値のみを指定できます。
            target:
              type: AverageValue
              averageValue: 500m
  2. Run the following command to create the HPA: 次のコマンドを実行して、HPA を作成します。

    kubectl apply -f hpa.yaml
  3. LoadBalancer サービスが作成された後、次のコマンドを実行してストレステストを実行します。

    ab -c 50 -n 2000 LoadBalancer(sample-app):8080/
  4. `kubectl describe hpa [HPA名]`

    kubectl get hpa sample-app

    This document describes how to create an App Service Environment v3 (ASEv3). An ASEv3 is a deployment of the Azure App Service into a subnet in your Azure Virtual Network (VNet). It provides a fully isolated and dedicated environment for securely running your App Service apps at high scale. For more information, see What is an App Service Environment v3?. ``` ```html このドキュメントでは、App Service Environment v3 (ASEv3) を作成する方法について説明します。ASEv3 は、Azure 仮想ネットワーク (VNet) 内のサブネットへの Azure App Service のデプロイです。これは、App Service アプリを安全かつ大規模に実行するための完全に分離された専用環境を提供します。 詳細については、「App Service Environment v3 とは」をご参照ください。 ```

    NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    sample-app   Deployment/sample-app   33m/500m   1         10        1          7m

構成ファイル(ack-alibaba-cloud-metrics-adapter

ack-alibaba-cloud-metrics-adapter は、Prometheus メトリックを HPA でサポートされているメトリックに変換するために、次のステップを実行します。

  1. Discovery: HPA で使用できる Prometheus メトリックを検出します。

  2. Association: Kubernetes リソース ( ポッド、ノード、名前空間など ) とメトリックを関連付けます。

  3. Naming: 変換後に HPA で使用できるメトリックの名前を定義します。

  4. Querying: Managed Service for Prometheus API からメトリック データをクエリする方法を定義します。

In the preceding example, the http_requests_total メトリック(sample-app ポッドによって公開されます)は、HPA 用の http_requests_per_second メトリックに変換されます。次のコードブロックは、ack-alibaba-cloud-metrics-adapter の構成を示しています。

- seriesQuery: http_requests_total{namespace!="",pod!=""}
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  name:
    matches: ^(.*)_total
    as: ${1}_per_second
  metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)

パラメーター

説明

seriesQuery

Prometheus クエリ言語 (PromQL) はデータをクエリします。

metricsQuery

seriesQuery 内の PromQL クエリデータを集計します。

説明

metricsQuery パラメーターで指定された label セレクター は、seriesQuery パラメーターで指定されたラベルに基づいてリソースを選択しません。

リソース

Labels in the PromQL クエリデータ内のラベル。 resource オブジェクトと照合されます。resource オブジェクトは、ポッド、名前空間、ノードなど、クラスタ内の API リソースです。kubectl api-resources -o wide コマンドを実行して、API リソースをクエリできます。key フィールドは、Prometheus メトリックの LabelName を指定します。Prometheus メトリックが指定された LabelName を使用していることを確認してください。

名前

Prometheus メトリックの名前を、正規表現を使用して読みやすいメトリック名に変換します。この例では、http_request_totalhttp_request_per_second に変換されます。

  1. 検出

    Prometheus メトリックを指定します。seriesFilters パラメーターを指定して、メトリックをフィルタリングできます。seriesQuery パラメーターは、指定されたラベルに基づいてデータと照合します。次のコードブロックの例をご覧ください。

    seriesQuery: http_requests_total{namespace!="",pod!=""}
    seriesFilters:
        - isNot: "^container_.*_seconds_total"

    seriesFilters: オプション。このフィールドはメトリックをフィルタリングします。

    • is:<正規表現>: この正規表現を含む名前のメトリックと一致します。

    • isNot:<正規表現>: この正規表現を含まないメトリック名に一致します。

  2. 関連付け

    Prometheus メトリックのラベルを Kubernetes リソースにマッピングします。http_requests_total メトリックのラベルは namespace!=""pod!="" です。

    - seriesQuery: http_requests_total{namespace!="",pod!=""}
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
  3. 命名

    Prometheus メトリックから変換される HPA メトリックに名前を付けます。Prometheus メトリックの名前は変更されません。Prometheus メトリックを直接使用する場合は、名前設定を構成する必要はありません。

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" コマンドを実行して、HPA でサポートされているメトリックをクエリできます。

    - seriesQuery: http_requests_total{namespace!="",pod!=""}
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: "^(.*)_total"
        as: "${1}_per_second"
  4. クエリ

    Managed Service for Prometheus API に送信されるリクエストのテンプレート。ack-alibaba-cloud-adapter は、HPA のパラメーターをリクエストテンプレートに渡し、テンプレートに基づいて Managed Service for Prometheus API にリクエストを送信し、返されたパラメーター値を自動スケーリングのために HPA に送信します。

    - seriesQuery: http_requests_total{namespace!="",pod!=""}
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: ^(.*)_total
        as: ${1}_per_second
      metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)

Managed Service for Prometheus API のエンドポイントを取得します

シナリオ 1:Managed Service for Prometheus

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

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、[操作] > [prometheus Monitoring] を選択します。

  3. [ARMS Prometheus に移動] を右上隅でクリックします。

  4. 左側のナビゲーションウィンドウで、[設定] をクリックします。次に、[構成] タブをクリックし、[HTTP API URL (grafana Read URL)] を表示します。

    マネージドサービス for Prometheus API は、内部ネットワーク経由で呼び出すことをお勧めします。内部ネットワークを使用できない場合は、インターネット経由で API を呼び出すことができます。

    3.png

シナリオ 2:オープンソース Prometheus

オープンソースのセルフマネージド Prometheus ソリューションの場合は、Service を使用して標準 Prometheus API を公開する必要があります。次に、metrics-adapter コンポーネントで Prometheus データソース URL の相対パラメーターを構成し、オープンソース Prometheus からのデータに基づいて HPA データソースの構成を完了します。

次の例では、ACK コンソールの Marketplace ページにある Helm Chart コミュニティ アプリケーション ack-prometheus-operator を使用します。詳細については、「オープンソースの Prometheus を使用して ACK クラスタを監視する」をご参照ください。

  1. Managed Service for Prometheus をデプロイし、Prometheus の標準 API を公開します。

    1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。

    2. [アプリカタログ] ページで、[ack-prometheus-operator] を見つけてクリックします。表示されるページで、[デプロイ] をクリックします。

    3. 表示されるパネルで、[クラスタ] パラメーターと [名前空間] パラメーターを構成し、ビジネス要件に基づいて [リリース名] パラメーターを変更し、[次へ] をクリックします。[パラメーター] セクションをビジネス要件に基づいて変更し、[OK] をクリックします。

    4. デプロイ結果を表示します。

      1. Service を使用して標準 Prometheus API を公開します。 ack-prometheus-operator から Service ack-prometheus-operator-prometheus を例として使用します。

      2. ServiceIP:9090 をブラウザのアドレスバーに入力し、Prometheus コンソールにアクセスするために Server Load Balancer (SLB) インスタンスにアクセスできるようサービスのインターネットアクセスを有効にします。

        ブラウザのアドレスバーに入力し、サービスが Server Load Balancer (SLB) インスタンスにアクセスして Prometheus コンソールにアクセスできるようにインターネット経由のアクセスを有効にします。

      3. 上部のナビゲーションバーで、[ステータス] > [ターゲット] を選択してすべてのコレクションタスクを表示します。image.png

        [UP] 状態のタスクは想定どおりに実行されています。

        image.png

    5. [サービス] 列と [名前空間] 列で [ラベル] を確認します。

      次のコードブロックはエンドポイントを示しています。この例では、ServiceName は ack-prometheus-operator-prometheus で、ServiceNamespace は monitoring です。

      http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090
  2. コンポーネントの構成で、Prometheus データソースの URL パラメーターを設定して、コンポーネントと Prometheus 間の適切な通信を確保します。

    インターネット経由で Prometheus API にアクセスすることを選択した場合は、構成について次の例をご参照ください。

      AlibabaCloudMetricsAdapter:
      ......
        prometheus:
          enabled: true
          url: http://your_domain.com:9090   # your_domain.com をパブリック IP アドレスに置き換えます。

    ack-prometheus-operator を例として使用すると、url 値は http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 です。

関連情報