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

:HPAを使用してQPSに基づくアプリケーションの自動スケーリングを実現する

最終更新日:Nov 14, 2024

アプリケーションが単位時間あたりに受信したリクエスト数に基づいてコンピューティングリソースの総量を動的に調整する必要がある場合は、application Load Balancer (ALB) インスタンスによって収集されたQPSデータを使用して、アプリケーションのポッドの自動スケーリングを設定できます。

あなたが始める前に

開始する前に、「ALB Ingressの作成」を読んで、ALB Ingressの基本機能について確認することをお勧めします。

仕組み

1秒あたりのクエリ数 (QPS) は、1秒あたりに受信したリクエストの数です。 ALBインスタンスは、Simple Log Service (SLS) を介してクライアントアクセスデータを記録できます。 Horizontal Pod Autoscaler (HPA) は、これらのアクセスレコードに基づいてサービスのQPSデータを監視し、対応するワークロード (DeploymentやStatefulSetなど) をスケールできます。

前提条件

ステップ1: AlbConfigを作成し、SLSプロジェクトを関連付ける

  1. クラスターに関連付けられているSLSプロジェクトを確認します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。

    3. [クラスターリソース] タブで、[Log Service Project] リソースを見つけ、右側にSLSプロジェクトの名前を記録します。

  2. AlbConfigを作成します。

    1. 次のコンテンツを作成してalb-qps.yamlにコピーし、SLSプロジェクト情報をaccessLogConfigフィールドに入力します。

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-qps
      spec:
        config:
          name: alb-qps
          addressType: Internet
          zoneMappings:
          - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # ID of the virtual switch
          - vSwitchId: vsw-uf6nun9tql5t8nh15****
          accessLogConfig:
            logProject: <LOG_PROJECT> # Name of the log project associated with the cluster
            logStore: <LOG_STORE> # Custom logstore name, must start with "alb_"
        listeners:
          - port: 80
            protocol: HTTP

      次の表に、上記のコードブロックのフィールドを示します。

      項目

      タイプ

      説明

      logProject

      String

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

      デフォルト値: ""

      logStore

      String

      SLS Logstoreの名前。alb_ で始まる必要があります。 SLS Logstoreは、存在しない場合は自動的に作成されます。 詳細については、「Simple Log Serviceによるアクセスログの収集」をご参照ください。

      デフォルト値: ""

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

       kubectl apply -f alb-qps.yaml

      期待される出力:

      albconfig.alibabacloud.com/alb-qps created

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

ALB Ingressには、AlbConfigに加えて、Deployment、Service、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 # Same as the name of AlbConfig
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: qps-ingress
    spec:
      ingressClassName: qps-ingressclass # Same as the name of Ingress Class
      rules:
       - host: demo.alb.ingress.top # Replace with your domain name
         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 # Name of the workload controlled by HPA
      minReplicas: 2 # Minimum number of pods
      maxReplicas: 10 # Maximum number of pods
      metrics:
        - type: External
          external:
            metric:
              name: sls_alb_ingress_qps # Metric name for QPS data, do not modify
              selector:
                matchLabels:
                  sls.project: <LOG_PROJECT> # Name of the log project associated with the cluster
                  sls.logstore: <LOG_STORE> # Custom logstore name
                  sls.ingress.route: default-qps-svc-80 # Path of the service, parameter format is <namespace>-<svc>-<port>
            target:
              type: AverageType
              averageValue: 2 # Expected target for the metric, in this example, the average QPS for all pods is 2

    です。

    次の表に、上記のコードブロックのフィールドを示します。

    項目

    説明

    scaleTargetRef

    アプリケーションによって使用されるワークロード。 この例では、手順1で作成したqps-Deploymentという名前のdeploymentを使用します。

    minReplicas

    展開をスケーリングできるコンテナーの最小数。 この値は、1以上の整数に設定する必要がある。

    maxReplicas

    展開をスケーリングできるコンテナーの最大数。 この値は、レプリカの最小数より大きい必要があります。

    external.metric.name

    HPAのQPSベースのメトリック。 値を変更しないでください。

    sls.project

    メトリックのSLSプロジェクト。 AlbConfigで指定されたSLSプロジェクトに値を設定します。

    sls.logstore

    メトリックのLogstore。The Logstore for the metric. 値をAlbConfigで指定されたLogstoreに設定します。

    sls.ingress.route

    サービスのパス。 値を <namespace>-<svc>-<port> 形式で指定します。 この例では、手順1で作成したqps-svcサービスを使用します。

    external.tar get

    メトリックのターゲット値。 この例では、すべてのポッドの平均QPSは2です。 HPAは、QPSを可能な限り目標値に近づけるようにポッドの数を調整します。

  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:                               ******** # Timestamp of HPA, can be ignored
    Reference:                                       Deployment/qps-deployment
    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.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データが増加するにつれて、アプリケーションのポッドの数が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に落ちた後、アプリケーションが2ポッドにスケールインされることを示しています。

参照