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

Container Service for Kubernetes:QPS データに基づく HPA を使用したアプリケーションの弾性スケーリングの実装

最終更新日:Mar 07, 2026

アプリケーションのリクエスト数に応じて計算リソースを動的に調整する必要がある場合、Application Load Balancer (ALB) インスタンスから取得したクエリ/秒(QPS)データを活用して、アプリケーションの Pod の弾性スケーリングを構成します。

事前準備

開始する前に、「ALB Ingress を作成してサービスを公開する」を参照し、ALB Ingress の基本的な使い方を確認してください。

仕組み

クエリ/秒(QPS)とは、1 秒間に受信されるリクエスト数のことです。Application Load Balancer (ALB) インスタンスは、Simple Log Service (SLS) を使用してクライアントのアクセスデータを記録します。Horizontal Pod Autoscaler (HPA) は、これらの記録からサービスの QPS データを監視し、デプロイメントや StatefulSet などの対応するワークロードをスケーリングします。

前提条件

手順 1:AlbConfig の作成と Simple Log Service プロジェクトの関連付け

  1. クラスターに関連付けられた Simple Log Service プロジェクトを確認します。

    1. Container Service Management Console にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。

    3. 基本情報 タブで、Log Service プロジェクト リソースを確認し、右側に表示されるプロジェクト名を記録します。

  2. AlbConfig を作成します。

    1. ファイル名を `alb-qps.yaml` として作成し、以下の内容をコピーして貼り付け、`accessLogConfig` フィールドに Simple Log Service プロジェクト情報を入力します。

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-qps
      spec:
        config:
          name: alb-qps
          addressType: Internet
          zoneMappings:
          - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # vSwitch の ID
          - vSwitchId: vsw-uf6nun9tql5t8nh15****
          accessLogConfig:
            logProject: <LOG_PROJECT> # クラスターに関連付けられた Simple Log Service プロジェクトの名称
            logStore: <LOG_STORE> # カスタム Logstore 名。先頭は "alb_" で始める必要があります。
        listeners:
          - port: 80
            protocol: HTTP

      次の表にフィールドの説明を示します。

    2. 以下のコマンドを実行して AlbConfig を作成します。

       kubectl apply -f alb-qps.yaml

      期待される出力:

      albconfig.alibabacloud.com/alb-qps created

手順 2:サンプルリソースの作成

AlbConfig に加えて、ALB Ingress はデプロイメント、サービス、IngressClass、および Ingress の 4 つのリソースを必要とします。以下の手順に従って、これらのリソースをすばやく作成します。

  1. 以下の内容で `qps-quickstart.yaml` というファイルを作成します。

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: qps-ingressclass
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb-qps # AlbConfig の名前と一致させる必要があります。
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: qps-ingress
    spec:
      ingressClassName: qps-ingressclass # IngressClass の名前と一致させる必要があります。
      rules:
       - host: demo.alb.ingress.top # ご自身のドメイン名に置き換えてください。
         http:
          paths:
          - path: /qps
            pathType: Prefix
            backend:
              service:
                name: qps-svc
                port:
                  number: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: qps-svc
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: qps-deploy
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: qps-deploy
      labels:
        app: qps-deploy
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: qps-deploy
      template:
        metadata:
          labels:
            app: qps-deploy
        spec:
          containers:
          - name: qps-container
            image: nginx:1.7.9
            ports:
            - containerPort: 80
  2. 以下のコマンドを実行してサンプルリソースを作成します。

    kubectl apply -f qps-quickstart.yaml

手順 3:HPA の作成

  1. 以下の内容で `qps-hpa.yaml` というファイルを作成・保存します。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: qps-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: qps-deploy # HPA によって制御されるワークロードの名前
      minReplicas: 2 # 最小 Pod 数
      maxReplicas: 10 # 最大 Pod 数
      metrics:
        - type: External   # 外部メトリック(Kubernetes 組み込みメトリック以外)を使用
          external:
            metric:
              name: sls_alb_ingress_qps # Alibaba Cloud ALB Ingress の QPS メトリック名。この値は変更しないでください。
              selector:
                matchLabels:
                  sls.project: <LOG_PROJECT> # Simple Log Service プロジェクト名。実際のプロジェクト名に置き換えてください。
                  sls.logstore: <LOG_STORE> # Logstore 名。実際の Logstore 名に置き換えてください。
                  sls.ingress.route: default-qps-svc-80 # サービスのパス。形式は <namespace>-<svc>-<port> です。
            target:
              type: AverageValue  # 対象メトリックの種類(平均値)
              averageValue: "2"     # 対象メトリックの目標値。本例では、すべての Pod の平均 QPS が 2 になります。

    次の表にフィールドの説明を示します。

    フィールド

    説明

    scaleTargetRef

    アプリケーションで使用されるワークロード。本例では、手順 1 で作成したデプロイメント `qps-deploy` を使用します。

    minReplicas

    スケールイン可能な最小 Pod 数。この値は 1 以上の整数である必要があります。

    maxRaplicas

    スケールアウト可能な最大 Pod 数。この値は最小 Pod 数より大きい必要があります。

    external.metric.name

    HPA が使用する QPS データのメトリック名。この値は変更しないでください。

    sls.project

    メトリックデータを提供する Simple Log Service プロジェクト。これは AlbConfig で指定したプロジェクトと同一である必要があります。

    sls.logstore

    メトリックデータを提供する Logstore。これは AlbConfig で指定した Logstore と同一である必要があります。

    sls.ingress.route

    サービスのパス(形式:`<namespace>-<svc>-<port>`)。本例では、手順 1 で作成した `qps-svc` サービスです。

    external.target

    メトリックの目標値。本例では、すべての Pod の平均 QPS が 2 です。HPA は、QPS が目標値にできるだけ近くなるよう、Pod 数を調整します。

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

    kubectl apply -f qps-hpa.yaml
  3. 以下のコマンドを実行して HPA のデプロイ状態を確認します。

    kubectl get hpa

    期待される出力:

    NAME      REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    qps-hpa   Deployment/qps-deploy   0/2 (avg)   2         10        2          5m41s
  4. 以下のコマンドを実行して HPA の構成詳細を確認します。

    kubectl describe hpa qps-hpa

    期待される出力:

    Name:                                            qps-hpa
    Namespace:                                       default
    Labels:                                          <none>
    Annotations:                                     <none>
    CreationTimestamp:                               ******** # HPA のタイムスタンプ。無視して構いません。
    Reference:                                       Deployment/qps-deploy
    Metrics:                                         ( current / target )
      "sls_alb_ingress_qps" (target average value):  0 / 2
    Min replicas:                                    2
    Max replicas:                                    10
    Deployment pods:                                 2 current / 2 desired

(任意)手順 4:結果の検証

  1. アプリケーションのスケールアウトを検証します。

    1. 以下のコマンドを実行して Ingress 情報を確認します。

      kubectl get ingress

      期待される出力:

      NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
      qps-ingress     qps-ingressclass     demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80        10m31s

      後続の手順で使用するため、`HOSTS` および `ADDRESS` の値を記録します。

    2. 以下のコマンドを実行してアプリケーションに対してストレステストを行います。

      前の手順で記録した値に合わせ、`demo.alb.ingress.top` および `alb-********.alb.aliyuncs.com` を置き換えます。

      ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
    3. 以下のコマンドを実行してアプリケーションのスケーリング状態を確認します。

      kubectl get hpa

      期待される出力:

      NAME      REFERENCE               TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
      qps-hpa   Deployment/qps-deploy   14375m/2 (avg)   2         10        10         15m

      出力の `REPLICAS` 値は 10 です。これは、QPS の増加に伴い、`MAXPODS` で指定された最大 10 個の Pod までアプリケーションがスケールアウトしたことを示しています。

  2. アプリケーションのスケールインを検証します。

    ストレステストが完了した後、以下のコマンドを実行してアプリケーションのスケーリング状態を確認します。

    kubectl get hpa

    期待される出力:

    NAME      REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    qps-hpa   Deployment/qps-deploy   0/2 (avg)   2         10        2          28m

    出力の `REPLICAS` 値は 2 です。これは、QPS が 0 に低下した後、`MINPODS` で指定された最小 2 個の Pod までアプリケーションがスケールインしたことを示しています。

参考文献