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

Container Service for Kubernetes:Scale pods based on Nginx Ingress metrics

最終更新日:Mar 26, 2026

Simple Log Service (SLS) Ingress メトリックを External Metrics API を介して Kubernetes の水平ポッド自動スケーリング (HPA) に接続することで、CPU だけでなく実際のトラフィック信号に基づいて Pod をスケーリングします。このガイドでは、Nginx アプリケーションのデプロイ、Ingress を介した公開、秒間クエリ数 (QPS) と 99.99パーセンタイル レイテンシに基づく HPA のスケーリング設定という完全な例を説明します。

前提条件

開始する前に、次のことを確認してください。

  • kubectl が構成された ACK クラスター

  • SLS ログ収集が有効化された Ingress コントローラー (クラスター作成時にデフォルトで有効化されます)

  • Helm チャートをインストールし、HPA リソースを作成する権限

仕組み

ack-alibaba-cloud-metrics-adapter コンポーネントは、Alibaba Cloud モニタリングサービスと Kubernetes External Metrics API を橋渡しします。インストール後、HPA は sls_ingress_qpssls_ingress_latency_p9999 などの SLS Ingress メトリックをクエリし、それに応じて Deployment のレプリカ数を調整できます。

ステップ 1: ack-alibaba-cloud-metrics-adapter のインストール

ack-alibaba-cloud-metrics-adapter コンポーネントは、External Metrics API を介して Kubernetes が ECS、SLB、RDS などの Alibaba Cloud サービスからモニタリングデータを取得できるようにします。

重要

このコンポーネントはインプレースアップグレードをサポートしていません。アップグレードするには、まず現在のバージョンをアンインストールし、次に最新バージョンをインストールします。アンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA はスケーリングを一時停止します。

  1. Container Service 管理コンソール」にログインします。ナビゲーションウィンドウで、[クラスター] をクリックします。

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

  3. Helm]ページで、[作成]をクリックします。[基本情報]の構成を完了し、[ack-alibaba-cloud-metrics-adapter]を選択して、[次へ]をクリックします。

  4. パラメーター設定」ページで、「チャート バージョン」を選択し、[OK] をクリックします。

ステップ 2: テストアプリケーションのデプロイ

  1. 次の内容で nginx-test.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] ページにリダイレクトされます。

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

ステップ 4: HPA の構成

HPA は、異なるスケーリングセマンティクスを持つ 2 つの SLS Ingress メトリックをサポートしています。

メトリックターゲットタイプスケーリング動作
sls_ingress_qpsAverageValueQPS は比較前に現在の Pod 数で除算されます
sls_ingress_latency_p9999Value生のレイテンシ値が直接比較されます
  1. 次の内容で ingress-hpa.yaml を作成します。

    パラメーター必須説明
    sls.ingress.routeはい形式: <namespace>-<svc>-<port>。例: default-nginx-80
    sls.logstoreはいSimple Log Service の Logstore。デフォルト: nginx-ingress
    sls.projectはいSimple Log Service の Project。デフォルト: k8s-log-<cluster-id>
    sls.internal.endpointいいえ内部ネットワーク経由で SLS にアクセスするかどうか。デフォルト: true。パブリックネットワークを使用するには false に設定します。
    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: "<your-sls-project>"      # デフォルト: k8s-log-<cluster-id>
                  sls.logstore: "nginx-ingress"           # Nginx Ingress ログのデフォルト SLS Logstore
                  sls.ingress.route: "default-nginx-80"  # 形式: <namespace>-<svc>-<port>
            target:
              type: AverageValue
              averageValue: 10   # Pod あたりの平均 QPS が 10 を超えるとスケールアップします
        - type: External
          external:
            metric:
              name: sls_ingress_latency_p9999
              selector:
                matchLabels:
                  sls.project: "<your-sls-project>"
                  sls.logstore: "nginx-ingress"
                  sls.ingress.route: "default-nginx-80"
                  # sls.internal.endpoint: "true"         # true = 内部ネットワーク (デフォルト); false = パブリックネットワーク
            target:
              type: Value
              value: 10   # 99.99パーセンタイル レイテンシが 10 ms を超えるとスケールアップします

    次の表は、HPA 構成で使用されるパラメーターについて説明しています。

  2. 構成を適用します。

    kubectl apply -f ingress-hpa.yaml

スケーリングの検証

Ingress ドメインに対して 5 分間の負荷テストを実行し、スケールアップをトリガーします。

# 300 秒間、10 個の同時リクエストを送信します
ab -t 300 -c 10 <Ingress に設定されたドメイン名>

HPA ステータスをリアルタイムで監視します。

kubectl get hpa ingress-hpa --watch

スケールアップが成功した場合の予想される出力 (REPLICAS が MAXPODS に達した場合):

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

トラフィックがしきい値を下回ると、REPLICAS は最小値に戻ります。

トラブルシューティング

kubectl describe hpa ingress-hpa を実行し、Conditions フィールドを確認してトラブルシューティングを開始します。Type 列と Status 列を使用して問題を特定し、以下の手順に従ってください。

「target」列に「unknown」と表示される

  1. kubectl describe hpa <hpa-name> を実行し、Conditions フィールドを確認します。

    • AbleToScaleFalse の場合: Deployment が正常であることを確認します。

    • ScalingActiveFalse の場合: 次のステップに進みます。

  2. External Metrics API が利用可能かどうかを確認するには、次のコマンドを実行します。

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

    応答が Error from server (NotFound) の場合は、alibaba-cloud-metrics-adapter の起動ステータスを確認してください。アダプターが正常に実行されており、HPA メトリックが Ingress 関連である場合は、まず SLS コンポーネントをデプロイします。詳細については、「Nginx Ingress のアクセスログを収集して分析する」をご参照ください。

  3. sls.ingress.route の形式を確認します。値は <namespace>-<svc>-<port> である必要があります。ここで、

    • namespace: Ingress が存在する名前空間

    • svc: Ingress に関連付けられた Service 名

    • port: その Service のポート名

ack-alibaba-cloud-metrics-adapter イメージ (バージョン 1.3.7) のプルに失敗しました

バージョン 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".

これは、コンポーネントが直接アップデートをサポートしていないために発生します。これを解決するには、次の手順を実行します。

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

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

  3. バックアップ構成を使用して最新バージョンをインストールします。

よくある質問

コマンドラインから 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}} をご利用の SLS Project 名に置き換えます。クラスター作成時にカスタム名を設定しなかった場合、デフォルトは k8s-log-{{ClusterId}} です。

正常な応答は、value フィールドに現在の QPS を含む ExternalMetricValueList を返します。ParameterInvalid エラーが発生した場合、メトリックにデータがありません。これは通常、ALB Ingress が構成されていないにもかかわらず、sls_ingress_qps の代わりに sls_alb_ingress_qps がクエリされたことを意味します。

HPA はどのメトリックをサポートしていますか?

全リストについては、「Alibaba Cloud HPA メトリック」をご参照ください。一般的な SLS Ingress メトリックは次のとおりです。

メトリック説明必須パラメーター
sls_ingress_qps指定された Ingress ルートの QPSsls.ingress.route
sls_alb_ingress_qpsALB Ingress ルートの QPSsls.ingress.route
sls_ingress_latency_avgすべてのリクエストの平均レイテンシsls.ingress.route
sls_ingress_latency_p5050パーセンタイルのレイテンシsls.ingress.route
sls_ingress_latency_p9595パーセンタイルのレイテンシsls.ingress.route
sls_ingress_latency_p9999パーセンタイルのレイテンシsls.ingress.route
sls_ingress_latency_p999999.99パーセンタイルのレイテンシsls.ingress.route
sls_ingress_inflowIngress のインバウンド帯域幅sls.ingress.route

Nginx Ingress ログ形式をカスタマイズした後、HPA を適応させるにはどうすればよいですか?

SLS ログ収集は、SLS が最初に有効化されたときにデプロイされる AliyunLogConfig カスタムリソース定義 (CRD) に依存します。 この CRD は、デフォルトの ACK Ingress Controller ログフォーマットに合わせて調整されています。 Ingress Controller のアクセスログフォーマットを変更した場合は、カスタムフォーマットに合わせて CRD 構成の processor_regex セクションを更新してください。 詳細については、「DaemonSet と CRD を使用してコンテナログを収集する」をご参照ください。

クラスターの作成時に SLS が無効になっており、HPA に Ingress メトリックが必要な場合は、まず SLS を再有効化または設定します。 詳細については、「Nginx Ingress のアクセスログを収集および分析する」をご参照ください。

次のステップ