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

Container Service for Kubernetes:Alibaba Cloud メトリックに基づく水平ポッド自動スケーリングの実装

最終更新日:Mar 15, 2025

ビジネスの急増に対応する場合、より正確なスケーリングを行うことで応答速度を向上させ、クラスタリソース使用効率をさらに向上させることができます。このトピックでは、HTTP リクエストレートや Ingress クエリ/秒 (QPS) などの Kubernetes でサポートされている外部メトリックを構成して、自動スケーリングポリシーを実装する方法について説明します。

この例では、NGINX という名前の Deployment、Service、および Ingress を作成して、Horizontal Pod Autoscaler (HPA) を構成します。これにより、Simple Log Service (SLS) の Ingress の QPS に基づいて水平自動スケーリングを実装できます。

手順 1:ack-alibaba-cloud-metrics-adapter コンポーネントをインストールする

ack-alibaba-cloud-metrics-adapter コンポーネントを使用すると、Kubernetes は External Metrics API を使用して、Elastic Compute Service (ECS)、Server Load Balancer (SLB)、ApsaraDB RDS などの Alibaba Cloud サービスのモニタリングデータを取得できます。これにより、クラスタのモニタリング機能と自動スケーリング機能が強化されます。

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

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

  3. [helm] ページで、[デプロイ] をクリックします。[基本情報] 手順で、パラメータを構成し、ack-alibaba-cloud-metrics-adapter を選択します。次に、[次へ] をクリックします。次の表にパラメータを示します。

  4. [パラメータ] 手順で、[チャートバージョン] パラメータを構成し、[OK] をクリックします。

手順 2: アプリケーションとサービスを作成する

  1. nginx-test.yaml という名前のファイルを作成します。

    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. 次のコマンドを実行して、Deployment と Service を作成します。

    kubectl apply -f nginx-test.yaml

手順 3:Ingress を作成する

  1. 左側のナビゲーションウィンドウで、[ネットワーク] > [ingress] を選択します。[ingress] ページの左上隅にある [ingress の作成] をクリックします。

  2. [ingress の作成] ダイアログボックスで、パラメータを構成し、[OK] をクリックします。Ingress を作成すると、[ingress] ページが表示されます。

  3. [名前] 列で、新しく作成した Ingress の名前を見つけてクリックし、Ingress に関する情報を表示します。Ingress の詳細については、「Ingress 管理」をご参照ください。

手順 4:HPA を構成する

sls_ingress_qps メトリックと sls_ingress_latency_p9999 メトリックなど、HPA で SLS プロジェクトをスケーリングするための 2 つのメトリックを構成できます。

  • sls_ingress_qps メトリックを AverageValue に設定します。これは、メトリック値が合計 QPS をポッド数で割った結果であることを指定します。

  • sls_ingress_latency_p9999 メトリックを Value に設定します。これは、レイテンシがポッド数で除算されないことを指定します。

  1. ingress-hpa.yaml という名前のファイルを作成し、次の内容をファイルに追加します。

    YAML の例を表示する

    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: "***" # 使用する SLS プロジェクトを指定します。
                  sls.logstore: "nginx-ingress"
                  sls.ingress.route: "default-nginx-80"
            target:
              type: AverageValue
              averageValue: 10
        - type: External
          external:
            metric:
              name: sls_ingress_latency_p9999
              selector:
                matchLabels:
                  # デフォルトの ingress ログプロジェクトは k8s-log-clusterId です
                  sls.project: "***"
                  # デフォルトの ingress ログストアは nginx-ingress です
                  sls.logstore: "nginx-ingress"
                  # 名前空間-svc-ポート
                  sls.ingress.route: "default-nginx-80"
                  # sls vpc エンドポイント、デフォルトは true
                  # sls.internal.endpoint:true
            target:
              type: Value
              # sls_ingress_latency_p9999>10ms は、値が 10 ミリ秒を超えた場合に HPA が nginx-deployment-basic ポッドの数を自動的に増やすことを指定します。
              value: 10

    次の表に、HPA の構成に使用されるパラメータを示します。

    パラメータ

    必須

    説明

    sls.ingress.route

    はい

    パラメータ形式:<名前空間>-<svc>-<ポート><名前空間> は、Ingress が属する名前空間を指定します。<svc> は、Ingress の作成時に選択した Service の名前を指定します。<ポート> は、Service のポートを指定します。例:default-nginx-80

    sls.logstore

    はい

    SLS の Logstore の名前。sls.logstore のデフォルト値は nginx-ingress です。

    sls.project

    はい

    SLS のプロジェクトの名前。sls.project のデフォルト値は k8s-log-クラスタ ID です。

    sls.internal.endpoint

    いいえ

    SLS に内部ネットワーク経由でアクセスするかどうかを指定します。デフォルト値:true

    • true:内部ネットワーク経由で SLS にアクセスします。

    • false:インターネット経由で SLS にアクセスします。

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

    kubectl apply -f ingress-hpa.yml

手順 5:構成の確認

  1. HPA を構成した後、次のコマンドを実行してストレステストを実行します。

    ab -t 300 -c 10 <Ingress のドメイン名> # Apache ベンチマークを使用して、Ingress によって公開されているサービスにリクエストを送信します。テストの完了には 300 秒かかり、1 秒あたり 10 件の同時リクエストが送信されます。
  2. HPA が想定どおりに動作するかどうかを確認します。

    1. ACK コンソールの左側のナビゲーションウィンドウで、[クラスタ] をクリックします。[クラスタ] ページで、管理するクラスタを見つけて、[その他] > [cloud Shell を開く][アクション] 列で を選択します。

    2. 次のコマンドを実行して、HPA のステータスを確認します。

      kubectl get hpa ingress-hpa

      予期される出力:

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

      REPLICAS パラメータの値が MAXPODS パラメータの値と同じであれば、HPA は想定どおりにアプリケーションをスケールアウトしました。

FAQ

CLI を使用して CLI を使用して取得するにはどうすればよいですかsls_ingress_qps QPS メトリックのデータを取得するにはどうすればよいですか?

次のコマンドを実行してデータをクエリします。この例では、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}} は、ACK クラスタで使用される SLS プロジェクトの名前です。ACK クラスタで使用される SLS プロジェクトのデフォルト名は k8s-log-{{ClusterId}} です。{{ClusterId}} はクラスタの ID です。

予期される出力:

Error from server: {
    "httpCode": 400,
    "errorCode": "ParameterInvalid",
    "errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is  in your log,please wrap : with quotation mark \"",
    "requestID": "xxxxxxx"
}

コマンド出力は、Application Load Balancer (ALB) Ingress が作成されていないため、sls_alb_ingress_qps メトリックのデータが返されないことを示しています。sls_alb_ingress_qps メトリックはデータクエリに使用されます。

予期される出力:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "sls_ingress_qps",
      "timestamp": "2025-02-26T16:45:00Z",
      "value": "50", # QPS の値。
      "metricLabels": {
        "sls.project": "your-sls-project-name",
        "sls.logstore": "nginx-ingress"
      }
    }
  ]
}

コマンド出力は、QPS メトリックが存在し、value が QPS 値であることを示しています。

target 列が <unknown> と表示されるのはなぜですか? kubectl get hpa コマンドを実行した後ですか? コマンドを実行した後に 列が になっている場合はどうすればよいですか?

この問題を解決するには、次の手順を実行します。

  1. kubectl describe hpa <hpa_name> コマンドを実行して、HPA が想定どおりに動作しない理由を特定します。

    • AbleToScale の値が Conditions フィールドで False の場合は、Deployment が正常に作成されたかどうかを確認します。

    • ScalingActive の値が Conditions フィールドで False の場合は、次の手順に進みます。

  2. kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" コマンドを実行します。Error from server (NotFound): the server could not find the requested resource というエラーメッセージが表示された場合は、alibaba-cloud-metrics-adapter コンポーネントのステータスを確認します。

    alibaba-cloud-metrics-adapter コンポーネントのステータスが正常な場合は、HPA メトリックが Ingress に関連しているかどうかを確認します。HPA メトリックが Ingress に関連している場合は、ack-alibaba-cloud-metrics-adapter をインストールする前に SLS コンポーネントをインストールしていることを確認してください。詳細については、「nginx-ingress のアクセスログを分析およびモニタリングする」をご参照ください。

  3. HPA メトリックの値が有効であることを確認します。sls.ingress.route の値は <名前空間>-<svc>-<ポート> 形式である必要があります。

    • 名前空間 は、Ingress が属する名前空間を指定します。

    • svc は、Ingress の作成時に選択した Service の名前を指定します。

    • ポート は、Service のポートを指定します。

HPA でサポートされているメトリックを見つけるにはどうすればよいですか?HPA でサポートされているメトリックをどのように確認できますか?

HPA でサポートされているメトリックの詳細については、「Alibaba Cloud metrics adapter」をご参照ください。次の表に、一般的に使用されるメトリックを示します。

メトリック

説明

追加パラメータ

sls_ingress_qps

特定のルーティングルールに基づいて Ingress が 1 秒あたりに処理できるリクエストの数。

sls.ingress.route

sls_alb_ingress_qps

特定のルーティングルールに基づいて ALB Ingress が 1 秒あたりに処理できるリクエストの数。

sls.ingress.route

sls_ingress_latency_avg

すべてのリクエストの平均レイテンシ。

sls.ingress.route

sls_ingress_latency_p50

すべてのリクエストのうち最速の 50% の最大レイテンシ。

sls.ingress.route

sls_ingress_latency_p95

すべてのリクエストのうち最速の 95% の最大レイテンシ。

sls.ingress.route

sls_ingress_latency_p99

すべてのリクエストのうち最速の 99% の最大レイテンシ。

sls.ingress.route

sls_ingress_latency_p9999

すべてのリクエストのうち最速の 99.99% の最大レイテンシ。

sls.ingress.route

sls_ingress_inflow

Ingress のインバウンド帯域幅。

sls.ingress.route

NGINX Ingress ログの形式を変更した後、水平自動スケーリングを構成するにはどうすればよいですか?NGINX Ingress ログのフォーマットを変更した後、水平自動スケーリングを構成するにはどうすればよいですか?

このトピックでは、SLS によって収集された Ingress メトリックに基づいて水平ポッド自動スケーリングが実行されます。SLS が NGINX Ingress ログを収集するように構成する必要があります。

ACK クラスタを作成すると、デフォルトでクラスタに対して SLS が有効になります。デフォルトのログ収集設定を使用する場合は、クラスタの作成後に SLS コンソールで NGINX Ingress のログ分析レポートとリアルタイムステータスを表示できます。

ACK クラスタの作成時に SLS を無効にした場合、SLS によって収集された Ingress メトリックに基づいて水平ポッド自動スケーリングを実行することはできません。水平ポッド自動スケーリングを実行する前に、クラスタに対して SLS を有効にする必要があります。詳細については、「nginx-ingress-controller のアクセスログを分析およびモニタリングする」をご参照ください。

SLS を初めて有効にしたときに生成される AliyunLogConfig は、ACK が Ingress コントローラ用に定義したデフォルトのログ形式にのみ適用されます。ログ形式を変更した場合は、AliyunLogConfig の processor_regex 設定を変更する必要があります。詳細については、「Simple Log Service コンソールを使用して DaemonSet モードでコンテナテキストログを収集する」をご参照ください。

参考資料