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

Container Service for Kubernetes:Nginx Ingress のトラフィックメトリックに基づいて複数のアプリケーションを水平スケーリングする

最終更新日:Nov 09, 2025

複数のインスタンスをデプロイするとアプリケーションの安定性は向上しますが、アイドルのリソースが発生し、クラスターのコストが高くなる可能性があります。手動でのスケーリングは手間がかかり、遅延が発生しがちです。Nginx Ingress を使用して、複数のアプリケーションに対して Horizontal Pod Autoscaler (HPA) を実装できます。HPA は、ワークロードに基づいて Pod レプリカの数を動的に調整します。これにより、アプリケーションの安定性と迅速な応答が保証されます。また、リソース使用率を最適化し、コストを削減します。このトピックでは、Nginx Ingress を使用して複数のアプリケーションに HPA を実装する方法について説明します。

Ingress は、外部リクエストをクラスター内のサービスに転送します。サービスは、リクエストを Pod に送信します。本番環境では、リクエスト量に基づいて自動スケーリングを設定できます。この量は、nginx_ingress_controller_requests メトリックによって公開されます。Nginx Ingress Controller のこの組み込みメトリックを使用して HPA を実装できます。ACK クラスターの Nginx Ingress Controller は、コミュニティ版の拡張バージョンであり、より使いやすくなっています。

準備

Nginx Ingress を使用して複数のアプリケーションに Horizontal Pod Autoscaling (HPA) を実装する前に、Alibaba Cloud Prometheus メトリックを HPA 互換のメトリックに変換する必要があります。

  • Alibaba Cloud Prometheus モニタリングコンポーネントをデプロイします。詳細については、「Alibaba Cloud Prometheus を使用したモニタリング」をご参照ください。

  • ack-alibaba-cloud-metrics-adapter コンポーネントをデプロイし、その prometheus.url フィールドを設定します。

    prometheus.url の設定方法を展開して表示

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

    2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[アプリケーション] > [Helm] を選択します。

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

    4. [リリースを更新] パネルで、alibabaCloudMetricsAdapter.prometheus.url フィールドを取得した Prometheus データリクエスト URL に設定します。次に、[OK] をクリックします。

      詳細については、「Prometheus データリクエスト URL を取得する方法」をご参照ください。
      詳細については、「ack-alibaba-cloud-metrics-adapter コンポーネント設定ファイルの詳細な説明」をご参照ください。
  • Apache Benchmark ストレステストツールをインストールします。

    サンプルコマンドを展開して表示

    • macOS: Homebrew を使用してインストールします。

      brew install httpd
    • Windows: Apache Lounge にアクセスし、Windows 版の Apache をダウンロードします。コマンドラインを使用して cd コマンドを実行し、展開された bin フォルダに移動します。次に、ab.exe を実行してプログラムを開始します。

    • Ubuntu または Debian:

      sudo apt update
      sudo apt install apache2-utils
    • CentOS 8 または RHEL:

      sudo yum install httpd-tools

    インストールが完了したら、ab -V を実行してインストールを確認します。

このチュートリアルでは、2 つの Deployment とそれに対応するサービスを作成し、異なるアクセスパスを持つ Ingress を設定して外部トラフィックをルーティングします。次に、nginx_ingress_controller_requests メトリックに基づいてアプリケーションの HPA を設定し、selector.matchLabels.service フィールドを使用してメトリックをフィルターします。これにより、Pod はトラフィックの変化に応じてスケールインおよびスケールアウトできます。

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

次の YAML ファイルを使用して、アプリケーションの Deployment とそれに対応するサービスを作成します。

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

    YAML の例を展開して表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-app
      template:
        metadata:
          labels:
            app: test-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/sample-app:v1-b070784-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      ports:
        - port: 8080
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: test-app
      type: ClusterIP

    次のコマンドを実行して、test-app アプリケーションとそれに対応するサービスを作成します。

    kubectl apply -f nginx1.yaml
  2. nginx2.yaml という名前のファイルを作成し、次の内容をコピーします。

    YAML の例を展開して表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/sample-app:v1-b070784-aliyun
            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: 80
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: sample-app
      type: ClusterIP

    次のコマンドを実行して、sample-app アプリケーションとそれに対応するサービスを作成します。

    kubectl apply -f nginx2.yaml

ステップ 2: Ingress の作成

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

    YAML の例を展開して表示

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
        - host: test.example.com
          http:
            paths:
              - backend:
                  service:
                    name: sample-app
                    port:
                      number: 80
                path: /
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: test-app
                    port:
                      number: 8080
                path: /home
                pathType: ImplementationSpecific
    • host: サービスにアクセスするためのドメイン名です。この例では test.example.com を使用します。

    • path: アクセス用の URL パスです。リクエストが到着すると、ルーティングルールに基づいて対応するサービスと照合されます。その後、リクエストはサービスを介して対応する Pod に送信されます。

    • backend: サービス名とサービスポートで構成されます。現在の path がリクエストを転送するサービスを指定します。

    次のコマンドを実行して Ingress リソースをデプロイします。

    kubectl apply -f ingress.yaml
  2. 次のコマンドを実行して Ingress リソースを取得します。

    kubectl get ingress -o wide

    期待される出力:

    NAME           CLASS   HOSTS              ADDRESS       PORTS   AGE                                                  
    test-ingress   nginx   test.example.com   10.XX.XX.10   80      55s

    デプロイが成功すると、//home パスを使用してホストにアクセスできます。NGINX Ingress コントローラーは、リクエストパスに基づいてリクエストを sample-app および test-app アプリケーションに自動的にルーティングします。Alibaba Cloud Prometheusnginx_ingress_controller_requests メトリックをクエリして、各アプリケーションへのリクエストに関する情報を取得できます。

ステップ 3: Prometheus メトリックを HPA 互換のメトリックに変換する

adapter-config ファイルの変更

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

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

  3. Helm ページで、ack-alibaba-cloud-metrics-adapter をクリックします。[リソース] セクションで adapter-config をクリックし、ページの右上隅にある [YAML の編集] をクリックします。

  4. 対応するフィールドの値を次のコードの値に置き換えます。次に、ページの下部にある [OK] をクリックします。

    詳細については、「Alibaba Cloud Prometheus メトリックに基づく水平ポッド自動スケーリング」をご参照ください。
    rules:
    - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m]))
      name:
        as: ${1}_per_second
        matches: ^(.*)_requests
      resources:
        namespaced: false  
      seriesQuery: nginx_ingress_controller_requests

    image

メトリック出力の表示

次のコマンドを実行して、メトリック出力を表示します。

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .

クエリ結果は次のとおりです。

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "nginx_ingress_controller_per_second",
      "metricLabels": {},
      "timestamp": "2025-07-25T07:56:04Z",
      "value": "0"
    }
  ]
}

ステップ 4: HPA の作成

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

    YAML の例を展開して表示

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # このフィールドを使用してメトリックをフィルターできます。ここで設定されたフィールドは、adapter.config の <<.LabelMatchers>> ラベルに渡されます。
                  service: sample-app
    # 外部メトリックタイプは、Value および AverageValue ターゲットタイプのみをサポートします。
            target:
              type: AverageValue
              averageValue: 30
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: test-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: test-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # このフィールドを使用してメトリックをフィルターできます。ここで設定されたフィールドは、adapter.config の <<.LabelMatchers>> ラベルに渡されます。
                  service: test-app
    # 外部メトリックタイプは、Value および AverageValue ターゲットタイプのみをサポートします。
            target:
              type: AverageValue
              averageValue: 30

    次のコマンドを実行して、sample-app および test-app アプリケーション用の HPA をデプロイします。

    kubectl apply -f hpa.yaml
  2. 次のコマンドを実行して、HPA のデプロイメントステータスを確認します。

    kubectl get hpa

    期待される出力:

    NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)   1         10        1          74s
    test-hpa     Deployment/test-app     0/30 (avg)   1         10        1          59m

ステップ 5: 結果の検証

HPA がデプロイされた後、Apache Benchmark ツールを使用してストレステストを実行します。リクエスト数が増加するにつれてアプリケーションがスケールアウトするかどうかを観察します。

  1. 次のコマンドを実行して、ホストの /home パスにストレステストを実行します。

    ab -c 50 -n 5000 test.example.com/home
  2. 次のコマンドを実行して HPA のステータスを確認します。

    kubectl get hpa

    期待される出力:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)        1         10        1          22m
    test-hpa     Deployment/test-app     22096m/30 (avg)   1         10        3          80m
  3. 次のコマンドを実行して、ホストのルートパスにストレステストを実行します。

    ab -c 50 -n 5000 test.example.com/
  4. 次のコマンドを実行して HPA のステータスを確認します。

    kubectl get hpa

    期待される出力:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   27778m/30 (avg)   1         10        2          38m
    test-hpa     Deployment/test-app     0/30 (avg)        1         10        1          96m

    この結果は、リクエスト量がしきい値を超えたときにアプリケーションが正常にスケールアウトしたことを示しています。

関連ドキュメント

  • マルチゾーンバランシングは、高可用性シナリオにおけるデータ集約型サービスの一般的なデプロイメント方法です。ワークロードが増加すると、マルチゾーンのバランスの取れたスケジューリングポリシーを使用するアプリケーションは、クラスターのスケジューリング要求を満たすために、複数のゾーンにわたってインスタンスを自動的にスケールアウトする必要があります。詳細については、「複数のゾーンにわたる迅速かつ同時の弾性スケーリングの実装」をご参照ください。

  • カスタムオペレーティングシステムイメージをビルドして、複雑なシナリオでの弾性スケーリングを簡素化できます。詳細については、「カスタムイメージによる弾性的な最適化」をご参照ください。