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

Container Service for Kubernetes:AHPA を使用してアプリケーションスケーリングのカスタムメトリックを設定する

最終更新日:Apr 27, 2025

シナリオによっては、HTTP リクエストのクエリ/秒 (QPS) やメッセージキューの長さなど、カスタムメトリックに基づいてアプリケーションをスケーリングする必要があります。Autoscaling Horizontal Pod Autoscaler (AHPA) は、alibaba-cloud-metrics-adapter コンポーネントと連携できる External Metrics メカニズムを提供し、カスタムメトリックに基づいてアプリケーションをスケーリングできるようにします。

前提条件

AHPA コントローラーがインストールされていること

手順 1: 準備

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

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

  3. [デプロイメント] ページで、[YAML から作成] をクリックします。次に、以下の YAML コンテンツをコピーして、sample-app という名前のデプロイメント、サービス、およびストレステスト用の fib-loader-qps という名前のデプロイメントを作成し、[作成] をクリックします。

    説明

    1 秒あたりのリクエスト数を示すカスタムメトリック requests_per_second が公開されます。

    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: registry.cn-hangzhou.aliyuncs.com/acs/knative-sample-fib-server:v1
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
            env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
  4. [作成] ページで、次の YAML コンテンツをコピーして ServiceMonitor を作成し、[作成] をクリックします。

    YAML コンテンツを表示するには、ここをクリックしてください

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: sample-app
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        port: http
        path: /metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          app: sample-app
  5. ServiceMonitor を有効にします。

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

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

    3. 上部のナビゲーションバーで、Prometheus インスタンスがデプロイされているリージョンを選択し、インスタンスの名前 (ACK クラスターの名前と同じ) をクリックします。

    4. 左側のナビゲーションウィンドウで、[サービスディスカバリ] をクリックします。右側の [設定] タブをクリックし、[ServiceMonitor] タブをクリックします。

    5. [sample-app][操作] 列のスイッチをオンにします。1.jpg

手順 2: ack-alibaba-cloud-metrics-adapter のデプロイ

  1. Prometheus インスタンスの内部 HTTP API エンドポイントを取得します。

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

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

    3. [インスタンス] ページの上部ナビゲーションバーで、Prometheus インスタンスがデプロイされているリージョンを選択し、インスタンスの名前をクリックします。Prometheus インスタンスの名前は、arms_metrics_{RegionId}_XXX 形式で付けられます。

    4. 左側のナビゲーションウィンドウで、[設定] をクリックします。[HTTP API URL (Grafana Read URL)] セクションで、[内部ネットワーク] の右側のエンドポイントを記録します。

      • オプション。アクセストークンが有効になっている場合は、クラスターのアクセストークンを設定し、アクセストークンを記録する必要があります。

      • [内部ネットワーク] の右側の HTTP API エンドポイントを記録します。

      2.jpg

  2. ack-alibaba-cloud-metrics-adapter をデプロイします。

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

    2. アプリカタログ タブで、[ack-alibaba-cloud-metrics-adapter] を見つけてクリックします。次に、ページの右上隅にある [デプロイ] をクリックします。

    3. [基本情報] ウィザードページで、[クラスター][名前空間] を指定し、[次へ] をクリックします。

    4. [パラメーター] ウィザードページで、[チャートバージョン] を指定します。[パラメーター] セクションで、記録した 内部 HTTP API エンドポイント に基づいて prometheus.urlprometheus.prometheusHeader を設定し、[OK] をクリックします。

        prometheus:
          enabled: true
          # 内部 HTTP API エンドポイント (Managed Service for Prometheus の URL) を入力します。
          url: http://cn-beijing-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/6b4b40986a3bec4f92ea418534****/115964845466****/arms-metrics-6fae216078e4****/cn-beijing
          # Managed Service for Prometheus でアクセストークンが有効になっている場合は、prometheusHeader Authorization を設定する必要があります。
          prometheusHeader:
          - Authorization: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMDc1MTY0MDksImlzcyI6Imh0dHA6******liYWJhY2xvdWQuY29tIiwiaWF0IjoxNjkyMTU2NDA5LCJqdGkiOiI3NmRkOWJkOS0zYzBkLTRjY2MtOTFkYy1lZTU1OGFkNjg3NmMifQ.gltEJ7g4j-QPao2durNk3OiEBYhv2F_nzG-cncVfFtY
  3. カスタムメトリックを設定します。

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

    2. コンテナー名アクション[alibaba-cloud-metrics-adapter] の 列の [更新] をクリックします。

    3. 次の YAML コンテンツをコピーして、エディターのコードを上書きします。次のサンプルコードの requests_per_second を、Managed Service for Prometheus で使用されている実際のメトリックに置き換える必要があります。次に、[OK] をクリックします。

        ......
        prometheus:
          adapter:
            rules:
              custom:
              - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})
                name:
                  as: requests_per_second
                resources:
                  overrides:
                    namespace:
                      resource: namespace
                seriesQuery: requests_per_second # Managed Service for Prometheus で使用されているメトリックの名前を指定します。
              default: false
          enabled: true    # 値を true に設定して、ack-alibaba-cloud-metrics-adapter を有効にします。
          ......
    4. 次のコマンドを実行して、メトリックの詳細情報をクエリします。

      kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"
      {"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2023-08-15T07:59:09Z","value":"10"}]}

手順 3: AHPA のデプロイ

  1. 次の AHPA リソースを作成します。

    • external.metric を設定して、メトリック名と matchLabels を指定します。メトリック名は、カスタムメトリックの設定 で指定されたメトリック名と同じである必要があります。この例では、requests_per_second メトリックが指定されています。

    • しきい値を設定します。この例では、AverageValue10 に設定されています。1 秒あたりのリクエスト数が 10 を超えると、アプリケーションはスケールアウトされます。

    YAML コンテンツを表示するには、ここをクリックしてください

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscaler
    metadata:
      name: customer-deployment
      namespace: default
    spec:
      metrics:
      - external:
          metric:
            name: requests_per_second
            selector:
              matchLabels:
                namespace: default
                service: sample-app
          target:
            type: AverageValue
            averageValue: 10
        type: External
      minReplicas: 0
      maxReplicas: 50
      prediction:
        quantile: 95
        scaleUpForward: 180
      scaleStrategy: observer
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      instanceBounds:
      - startTime: "2023-08-01 00:00:00"
        endTime: "2033-08-01 00:00:00"
        bounds:
        - cron: "* 0-8 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 4
        - cron: "* 9-15 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 5
        - cron: "* 16-23 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 1
  2. 次のコマンドを実行して、スケーリング結果をクエリします。

    custom-metric % kubectl get ahpa
    NAME                  STRATEGY   REFERENCE                   METRIC                TARGETS     DESIREDPODS   REPLICAS   MINPODS   MAXPODS   AGE
    customer-deployment   observer   Deployment/sample-app       requests_per_second   60000m/10   6             1          1         50        7h53m

    Kubernetes でより高い精度が必要な場合は、m または k 単位が使用されます。たとえば、この例では 1001m は 1.001、60000m は 60 に相当します。出力は、1 秒あたりのリクエスト数が 60 であり、しきい値 10 を超えていることを示しています。必要なポッド数 (DESIREDPODS) は 6 です。