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

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

最終更新日:Jan 01, 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. クラスターに関連付けられている SLS プロジェクトを表示します。

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

    2. [基本情報] タブで、[Simple Log Service プロジェクト] リソースを見つけ、プロジェクト名を記録します。

  2. AlbConfig を作成します。

    1. alb-qps.yaml という名前のファイルを作成し、次の内容をファイルにコピーしてから、accessLogConfig フィールドに SLS プロジェクトの詳細を指定します。

      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> # クラスターに関連付けられている SLS プロジェクトの名前。
            logStore: <LOG_STORE> # カスタム Logstore の名前。名前は「alb_」で始まる必要があります。
        listeners:
          - port: 80
            protocol: HTTP

      各フィールドの説明は次のとおりです:

      フィールド

      タイプ

      説明

      logProject

      string

      Simple Log Service (SLS) プロジェクトの名前。

      デフォルト値: ""

      logStore

      string

      SLS Logstore の名前。名前は alb_ で始まる必要があります。Logstore が存在しない場合は、自動的に作成されます。SLS Logstore の設定例については、「アクセスログの有効化」をご参照ください。

      デフォルト値: "alb_****"

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

       kubectl apply -f alb-qps.yaml

      期待される出力:

      albconfig.alibabacloud.com/alb-qps created

ステップ 2: サンプルリソースの作成

AlbConfig に加えて、ALB Ingress が機能するには、デプロイメント、サービス、IngressClass、および Ingress が必要です。次の手順に従って、これらのリソースを迅速に作成します。

  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> # SLS プロジェクトの名前。これを実際のプロジェクト名に置き換えてください。
                  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

    アプリケーションのワークロード。この例では、ステップ 2 で作成された qps-deploy という名前のデプロイメントを指します。

    minReplicas

    デプロイメントがスケールインできる Pod の最小数。この値は 1 以上の整数である必要があります。

    maxReplicas

    デプロイメントがスケールアウトできる Pod の最大数。この値はレプリカの最小数より大きい必要があります。

    external.metric.name

    QPS データに基づいており、HPA によって使用されるメトリック。この値は変更しないでください。

    sls.project

    メトリックの基になる SLS プロジェクト。値は AlbConfig で指定されたものと同じである必要があります。

    sls.logstore

    メトリックの基になる Logstore。値は AlbConfig で指定されたものと同じである必要があります。

    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

      後続のステップのために、HOSTSADDRESS の値を記録します。

    2. 次のコマンドを実行して、アプリケーションのストレステストを実行します。

      前のステップで記録した値で demo.alb.ingress.topalb-********.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 が増加するにつれて、アプリケーション Pod の数が MAXPODS の値である 10 にスケールアウトすることを示します。

  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 に低下した後、アプリケーション Pod の数が MINPODS の値である 2 にスケールインすることを示します。

関連ドキュメント