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

Container Service for Kubernetes:Alibaba Cloud コンポーネントメトリックに基づく水平ポッド自動スケーリングの実装

最終更新日:Jan 09, 2026

正確な自動スケーリングは、トラフィックの急増を管理する際に、クラスターの応答時間とリソース効率を向上させるのに役立ちます。このトピックでは、Kubernetes External Metrics API を使用して、HTTP リクエストレートや Ingress のクエリ/秒 (QPS) などの主要なビジネスメトリックを統合し、自動スケーリングポリシーを実装する方法について説明します。

このトピックでは、Nginx という名前のデプロイメント、サービス、および Ingress を作成して Horizontal Pod Autoscaler (HPA) を設定する方法を示します。これにより、Simple Log Service (SLS) からの Ingress QPS メトリックに基づいて水平ポッド自動スケーリングを実装できます。

ステップ1:ack-alibaba-cloud-metrics-adapter コンポーネントのデプロイ

ack-alibaba-cloud-metrics-adapter コンポーネントを使用すると、Kubernetes は External Metrics API を介して、Elastic Compute Service (ECS)、Server Load Balancer (SLB)、ApsaraDB RDS (RDS) などの Alibaba Cloud プロダクトのモニタリングデータを取得できます。これにより、クラスターのモニタリングおよび自動スケーリング機能が強化されます。

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

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

  3. [Helm] ページで、[作成] をクリックします。[基本情報] パラメーターを設定し、ack-alibaba-cloud-metrics-adapter を選択してから、[次へ] をクリックします。

説明

ack-alibaba-cloud-metrics-adapter コンポーネントは直接のアップグレードをサポートしていません。コンポーネントをアンインストールしてから、最新バージョンをインストールする必要があります。

ステップ2:アプリケーションとサービスの作成

  1. nginx-test.yaml という名前のファイルを作成します。

    YAML の例を表示

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: nginx
      type: ClusterIP
  2. 次のコマンドを実行して、アプリケーションのデプロイメントとそれに対応するサービスを作成します。

    kubectl apply -f nginx-test.yaml

ステップ3:Ingress の作成

  1. クラスター管理ページの左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。[Ingress] ページの左上隅にある [Ingress の作成] をクリックします。

  2. [作成] パネルで、必要な情報を入力し、[OK] をクリックします。Ingress が作成されると、[Ingress] ページにリダイレクトされます。

  3. [名前] 列で Ingress 名をクリックして、そのルーティングルール情報を表示します。Ingress の詳細については、「Ingress の管理」をご参照ください。

ステップ4:HPA の設定

HPA でスケーリングのために SLS プロジェクトから 2 つのメトリックを設定できます。たとえば、sls_ingress_qpssls_ingress_latency_p9999 です。

  • sls_ingress_qpsAverageValue に設定します。これは、QPS が評価される前に Pod の数で除算されることを意味します。

  • sls_ingress_latency_p9999Value に設定します。これは、値が Pod の数で除算されないことを意味します。

  1. ingress-hpa.yaml という名前のファイルを作成し、次の内容をコピーします。

    YAML の例を表示

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: ingress-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment-basic
      minReplicas: 2
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: sls_ingress_qps
              selector:
                matchLabels:
                  sls.project: "***" # sls.project の値を実際の値に置き換えてください。
                  sls.logstore: "nginx-ingress"
                  sls.ingress.route: "default-nginx-80"
            target:
              type: AverageValue
              averageValue: 10
        - type: External
          external:
            metric:
              name: sls_ingress_latency_p9999
              selector:
                matchLabels:
                  # デフォルトの Ingress ログプロジェクトは k8s-log-clusterId です。
                  sls.project: "***" 
                  # デフォルトの Ingress Logstore は nginx-ingress です。
                  sls.logstore: "nginx-ingress"
                  # namespace-svc-port
                  sls.ingress.route: "default-nginx-80"
                  # SLS VPC エンドポイント。デフォルト値は true です。
                  # sls.internal.endpoint:true
            target:
              type: Value
              # sls_ingress_latency_p9999>10ms の場合、HPA は nginx-deployment-basic の Pod 数を自動的に増やします。
              value: 10

    HPA の設定には、次のパラメーターが含まれます。

    パラメーター名

    必須

    説明

    sls.ingress.route

    はい

    パラメーターのフォーマットは <namespace>-<svc>-<port> です。<namespace> は Ingress が配置されている名前空間です。<svc> は Ingress に対応するサービスの名前です。<port> は Ingress に対応するサービスのポートの名前です。例:default-nginx-80

    sls.logstore

    はい

    SLS の Logstore の名前。クラスターでは、sls.logstore のデフォルト値は nginx-ingress です。

    sls.project

    はい

    SLS のプロジェクトの名前。クラスターでは、sls.project のデフォルト値は k8s-log-Cluster ID です。

    sls.internal.endpoint

    いいえ

    SLS にプライベートネットワーク経由でアクセスするか、インターネット経由でアクセスするかを指定します。デフォルト値は true です。

    • true:プライベートネットワーク経由で SLS にアクセスします。

    • false:インターネット経由で SLS にアクセスします。

  2. 次のコマンドを実行して HPA を作成します。

    kubectl apply -f ingress-hpa.yaml

ステップ5:結果の検証

  1. HPA を設定した後、次のコマンドを実行して負荷テストを実行します。

    ab -t 300 -c 10 <domain_name_configured_for_ingress> # Apache Benchmark を使用して、Ingress によって公開されたサービスに対して負荷テストを実行します。同時実行数を 10、持続時間を 300 秒に設定します。
  2. スケーリングステータスを検証します。

    1. コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。[クラスター] ページで、対象のクラスターを見つけ、[アクション] 列の [その他] > [CloudShell でクラスターを管理] を選択します。

    2. 次のコマンドを実行して、スケーリングステータスを確認します。

      kubectl get hpa ingress-hpa

      期待される出力:

      NAME            REFERENCE                              TARGETS           MINPODS    MAXPODS    REPLICAS   AGE
      ingress-hpa     Depolyment/nginx-deployment-basic      21/10 (avg)       2          10         10          7m49s

      REPLICAS の値が MAXPODS の値と同じであれば、スケーリングは成功です。

よくある質問

コマンドラインから QPS メトリック sls_ingress_qps を取得する方法

コマンドラインからメトリックをクエリできます。次の例は、`sls_ingress_qps` メトリックをクエリする方法を示しています。

kubectl get --raw  /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress

コマンドの {{SLS_Project}} は、ACK クラスターに対応する SLS プロジェクトの名前を指定します。設定をカスタマイズしていない場合、デフォルト名は k8s-log-{{ClusterId}} です。ここで、{{ClusterId}} はクラスターの ID です。

コマンドが次の結果を返す場合:

Error from server: {
    "httpCode": 400,
    "errorCode": "ParameterInvalid",
    "errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is  in your log,please wrap : with quotation mark \"",
    "requestID": "xxxxxxx"
}

この結果は、メトリックに利用可能なデータがないことを示します。これは、`sls_alb_ingress_qps` メトリックをクエリしているが、ALB Ingress を設定していないことが原因である可能性があります。

コマンドが次のような結果を返す場合:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "sls_ingress_qps",
      "timestamp": "2025-02-26T16:45:00Z", 
      "value": "50",   # QPS 値
      "metricLabels": {
        "sls.project": "your-sls-project-name",
        "sls.logstore": "nginx-ingress"
      }
    }
  ]
}

この結果は、QPS の Kubernetes 外部メトリックが見つかったことを示します。value フィールドは QPS 値を表します。

kubectl get hpa コマンドが targetunknown として返す場合の対処法

この問題を解決するには、次の手順に従います。

  1. kubectl describe hpa <hpa_name> コマンドを実行して、HPA の障害の原因を特定します。

    • Conditions フィールドが AbleToScaleFalse であることを示している場合は、デプロイメントが正しいことを確認します。

    • Conditions フィールドが ScalingActiveFalse であることを示している場合は、次のステップに進みます。

  2. kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" コマンドを実行します。コマンドが Error from server (NotFound): the server could not find the requested resource を返す場合は、alibaba-cloud-metrics-adapter コンポーネントのステータスを確認します。

    alibaba-cloud-metrics-adapter のステータスが正常な場合、HPA メトリックが Ingress に関連しているかどうかを確認します。メトリックが Ingress に関連している場合は、まず SLS コンポーネントをデプロイする必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。

  3. HPA メトリックが正しく入力されていることを確認します。sls.ingress.route の値は <namespace>-<svc>-<port> のフォーマットを使用する必要があります。

    • namespace:Ingress の名前空間。

    • svc:Ingress サービスの名前。

    • port:Ingress サービスのポート名。

HPA でサポートされているメトリック名を確認する方法

詳細については、「Alibaba Cloud HPA Metrics」をご参照ください。次の表に、一般的なメトリックを示します。

メトリック名

説明

追加パラメーター

sls_ingress_qps

指定された IngressRoute のクエリ/秒 (QPS)。

sls.ingress.route

sls_alb_ingress_qps

ALB データの IngressRoute の QPS。

sls.ingress.route

sls_ingress_latency_avg

すべてのリクエストのレイテンシー。

sls.ingress.route

sls_ingress_latency_p50

50% のリクエストのレイテンシー。

sls.ingress.route

sls_ingress_latency_p95

95% のリクエストのレイテンシー。

sls.ingress.route

sls_ingress_latency_p99

99% のリクエストのレイテンシー。

sls.ingress.route

sls_ingress_latency_p9999

99.99% のリクエストのレイテンシー。

sls.ingress.route

sls_ingress_inflow

Ingress のインバウンド帯域幅。

sls.ingress.route

Nginx Ingress のログフォーマットをカスタマイズした後のシステムへの適応方法

SLS Ingress メトリックを使用した水平ポッド自動スケーリングの詳細については、「Alibaba Cloud コンポーネントのメトリックを使用した水平ポッド自動スケーリング」をご参照ください。クラスターで SLS の Nginx Ingress ログ収集を有効にし、正しく設定する必要があります。

  • クラスターを作成する際、SLS はデフォルトで有効になっています。デフォルト設定を維持する場合、SLS コンソールで Nginx Ingress アクセスログ分析レポートを表示し、Nginx Ingress のリアルタイムステータスをモニターできます。

  • クラスター作成時に SLS を無効にした場合、SLS Ingress メトリックを水平ポッド自動スケーリングに使用するには、再度有効にするか設定する必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。

  • Nginx Ingress のログフォーマットをカスタマイズするには、Custom Resource Definition (CRD) 設定の正規表現の processor_regex 部分を変更する必要があります。これは、クラスターで SLS を有効にするとデプロイされる AliyunLogConfig CRD が、ACK Ingress コントローラーのデフォルトのログフォーマットのみをサポートしているためです。詳細については、「DaemonSet CRD を使用したコンテナーログの収集」をご参照ください。

alibaba-cloud-metrics-adapter イメージのプル失敗

症状

ack-alibaba-cloud-metrics-adapter コンポーネントをバージョン 1.3.7 にアップグレードする際に、イメージのプル中にエラーが発生します。エラーメッセージは次のとおりです:

Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".

原因

ack-alibaba-cloud-metrics-adapter コンポーネントは現在、直接のアップグレードをサポートしていません。

解決策

コンポーネントをアップグレードするには、次の手順に従います。

  1. 現在のコンポーネント設定をバックアップします。

  2. 古いバージョンのコンポーネントをアンインストールします。

  3. バックアップした設定を使用して、最新バージョンのコンポーネントをインストールします。

重要

コンポーネントのアンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA のスケーリング動作は一時停止します。

関連ドキュメント