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

Container Service for Kubernetes:水平ポッド自動スケーリングの実装

最終更新日:Mar 05, 2025

Horizontal Pod Autoscaler (HPA) 機能を有効にして、CPU 使用率、メモリ使用量、またはその他のメトリックに基づいてポッドを自動的にスケーリングできます。 HPA は、ワークロードが急増したときに負荷の高いストレスを処理するためにレプリケートされたポッドを迅速にスケールアウトし、ワークロードが減少したときにリソースを節約するために適切にスケールインできます。 プロセス全体が自動化されており、人為的な介入は必要ありません。 E コマースサービス、オンライン教育、金融サービスなど、サービスの変動が大きく、サービス数が多い、スケーリング要件が頻繁にあるビジネスに最適です。

始める前に

HPA 機能をより適切に使用するために、このトピックを読む前に、Kubernetes 公式ドキュメントの Horizontal Pod Autoscaling を読んで、HPA の基本原則、アルゴリズムの詳細、およびスケーリング設定を理解することをお勧めします。

さらに、Container Service for Kubernetes (ACK) クラスタは、スケジューリングレイヤーの弾力性のためのさまざまな ワークロードスケーリング ソリューションと、リソースレイヤーの弾力性のための ノードスケーリング ソリューションを提供します。 HPA 機能を使用する前に、自動スケーリング を読んで、さまざまなソリューションの適用可能なシナリオと使用制限を理解することをお勧めします。

前提条件

ACK コンソールで HPA が有効になっているアプリケーションを作成する

ACK は HPA と統合されています。 ACK コンソールで HPA が有効になっているアプリケーションを作成できます。 アプリケーションの作成時または既存のアプリケーションに対して HPA を有効にできます。 ワークロードに対して HPA が有効になっているアプリケーションは 1 つだけ作成することをお勧めします。

アプリケーションの作成時に HPA を有効にする

以下では、Deployment アプリケーションを例として、アプリケーションの作成時に HPA を有効にする方法について説明します。 その他のワークロードタイプの手順も同様です。

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

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイメント] を選択します。

  3. [デプロイメント] ページで、[イメージから作成] をクリックします。

  4. [作成] ページで、プロンプトに従って基本情報、コンテナ設定、サービス設定、およびスケーリング設定を入力して、HPA をサポートする Deployment を作成します。

    具体的な手順と設定パラメータの詳細については、「デプロイメントを使用してステートレスアプリケーションを作成する」をご参照ください。 以下に主要なパラメータを示します。

    • [基本情報]: アプリケーションの名前、レプリカ数などの情報を設定します。

    • [コンテナ]: イメージと必要な CPU およびメモリリソースを選択します。

      リソースプロファイリング機能を使用して、リソース使用量の履歴データを分析し、コンテナのリクエストと制限の設定に関する推奨事項を取得できます。 詳細については、「リソースプロファイリング」をご参照ください。

      重要

      アプリケーションに必要な request リソースを設定する必要があります。 そうしないと、HPA を有効にできません。

    • [詳細設定]:

      • [アクセス制御] セクションで、[サービス] の右側にある [作成] をクリックしてパラメータを設定します。

      • [スケーリング] セクションで、[HPA][有効化] を選択し、スケーリングしきい値と関連パラメータを設定します。

        • [メトリック]: [CPU 使用率] または [メモリ使用量] を選択します。これは、[必要なリソース] フィールドで指定したものと同じである必要があります。 [CPU 使用率] と [メモリ使用量] の両方が指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。

        • [条件]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。

        • [最大レプリカ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。

        • [最小レプリカ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。

    作成後、[デプロイメント] ページで新しい Deployment を表示できます。 デプロイメント名をクリックし、[基本情報] ページの [ポッドスケーリング] タブをクリックします。 [HPA] セクションでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。

既存のアプリケーションに対して HPA を有効にする

以下では、Deployment アプリケーションを例として、既存のアプリケーションに対して HPA を有効にする方法について説明します。 その他のワークロードタイプの手順も同様です。

ワークロードページを使用する

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

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイメント] を選択します。

  3. [デプロイメント] ページで、ターゲットアプリケーション名をクリックし、[ポッドスケーリング] タブをクリックし、[HPA] の右側にある [作成] をクリックします。

  4. [作成] ダイアログボックスで、プロンプトに従って HPA 設定を構成します。

    • [名前]: HPA ポリシーの名前を入力します。

    • [メトリック]: [CPU 使用率] または [メモリ使用量] を選択します。これは、[必要なリソース] フィールドで指定したものと同じである必要があります。 [CPU 使用率] と [メモリ使用量] の両方が指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。

    • [しきい値]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。

    • [最大コンテナ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。

    • [最小コンテナ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。

作成後、[デプロイメント] ページで Deployment 名をクリックできます。 [基本情報] ページで、[ポッドスケーリング] タブをクリックします。 [HPA] セクションでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。

ワークロードスケーリングページを使用する

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

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、[自動スケーリング] > [ワークロードスケーリング] を選択します。

  3. ページの右上隅にある [自動スケーリングの作成] をクリックし、ターゲットワークロードを選択し、[HPA と Cronhpa] タブの下の [HPA] オプションをオンにして、プロンプトに従って HPA ポリシーを構成します。

    • [スケーリングポリシー名]: HPA ポリシーの名前を入力します。

    • [最小コンテナ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。

    • [最大コンテナ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。

    • [スケーリングメトリック]: CPU とメモリをサポートします。これは、設定されている必要なリソースタイプと同じである必要があります。 CPU とメモリの両方のリソースタイプが指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。

    • [しきい値]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。

作成後、[ワークロードスケーリング] ページで HPA リストを表示できます。 新しい HPA タスクの [アクション] 列の [詳細] をクリックします。 詳細ページでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。

結果の検証

  1. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、[自動スケーリング] > [ワークロードスケーリング] を選択します。

  2. [水平スケーリング] タブをクリックし、[HPA] を選択して、スケーリングステータスとタスクリストを表示します。

説明

アプリケーションの実行が開始されると、コンテナリソースはポッド間の負荷に基づいて自動的にスケーリングされます。 また、アプリケーションのポッドで CPU ストレステストを実行することにより、ステージング環境で HPA が有効になっているかどうかを確認することもできます。

kubectl を使用して HPA が有効になっているアプリケーションを作成する

オーケストレーションテンプレートを使用して HPA を作成し、HPA を有効にする Deployment と HPA を関連付けることもできます。 その後、kubectl コマンドを実行して HPA を有効にできます。 ワークロードに対して HPA が有効になっているアプリケーションは 1 つだけ作成することをお勧めします。 次の例では、NGINX アプリケーションに対して HPA が有効になっています。

  1. nginx.yml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。

    重要

    アプリケーションに必要な request リソースを設定する必要があります。 そうしないと、HPA を有効にできません。 リソースプロファイリング機能を使用して、リソース使用量の履歴データを分析し、コンテナのリクエストと制限の設定に関する推奨事項を取得できます。 詳細については、「リソースプロファイリング」をご参照ください。

    展開して YAML テンプレートを表示する

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx  
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 # 実際の <image_name:tags> に置き換えます。
            ports:
            - containerPort: 80
            resources:
              requests:       # このパラメータは HPA メトリックの計算に必要です。 そうしないと、HPA は不明なステータスを表示します。
                cpu: 500m
  2. 次のコマンドを実行して、NGINX アプリケーションを作成します。

    kubectl apply -f nginx.yml
  3. hpa.yml という名前のファイルを作成し、次のコンテンツをファイルにコピーして HPA を作成します。

    scaleTargetRef パラメータを使用して、HPA を nginx Deployment に関連付け、ポッド内のすべてのコンテナの平均 CPU 使用率が 50% に達したときにスケーリング操作をトリガーします。

    Kubernetes バージョンが 1.24 以降のクラスター用の YAML テンプレート

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      minReplicas: 1  # Deployment に対して実行する必要があるコンテナの最小数。 このパラメータの値は、1 以上の整数である必要があります。
      maxReplicas: 10  # Deployment をスケーリングできるコンテナの最大数。 このパラメータの値は、minReplicas よりも大きい必要があります。
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50 # ターゲットリソースの平均使用率。これは、リソース使用量の平均値とそのリクエスト量の比率です。
                   

    Kubernetes バージョンが 1.24 より前のクラスター用の YAML テンプレート

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      minReplicas: 1  # 1 以上の整数である必要があります。
      maxReplicas: 10  # minReplicas よりも大きい必要があります。
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
                   

    CPU とメモリの両方のメトリックを指定する必要がある場合は、2 つの HPA を作成する代わりに、metrics フィールドの下に cpumemory の両方のリソースタイプを指定できます。 HPA は、いずれかのメトリックがスケーリングしきい値に達したことを検出すると、スケーリング操作を実行します。

    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
      - type: Resource
        resource:
          name: memory
          target:
            type: Utilization
            averageUtilization: 50
  4. 次のコマンドを実行して、HPA を作成します。

    kubectl apply -f hpa.yml

    この時点で、kubectl describe hpa <HPA名> コマンドを実行すると、次の出力に類似した警告が返されます。これは、HPA がまだデプロイされていることを示しています。 この例の HPA 名は nginx-hpa です。 kubectl get hpa コマンドを実行して、HPA のステータスを確認できます。

    Warning  FailedGetResourceMetric       2m (x6 over 4m)  horizontal-pod-autoscaler  missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7
    
    Warning  FailedComputeMetricsReplicas  2m (x6 over 4m)  horizontal-pod-autoscaler  failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
  5. HPA が作成され、ポッドがスケーリング条件に達するまで待ちます。これは、この例では、NGINX のポッド CPU 使用率が 50% を超えたときです。 その後、kubectl describe hpa <HPA名> コマンドを再度実行して、水平スケーリングステータスを確認します。

    次の出力が返された場合、HPA は想定どおりに実行されています。

    Type    Reason             Age   From                       Message
      ----    ------             ----  ----                       -------
      Normal  SuccessfulRescale  5m6s  horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

関連操作

デフォルトのスケーリング動作がビジネス要件を満たしていない場合は、behavior パラメータの scaleUp フィールドと scaleDown フィールドを指定して、より詳細なスケールアウトとスケールインの設定を行うことができます。 詳細については、Configurable scaling behavior をご参照ください。

behavior でサポートされている一般的なシナリオは次のとおりです。

  • トラフィックの急増時に迅速なスケーリングを実現します。

  • 負荷の変動が頻繁に発生するシナリオで、迅速なスケールアップと低速なスケールダウンを実装します。

  • 状態に敏感なアプリケーションのスケールダウンを防ぎます。

  • リソースに制約のあるシナリオまたはコストに敏感なシナリオで安定化ウィンドウ stabilizationWindowSeconds を使用して、スケールアップの速度を制限し、一時的な変動によって引き起こされる頻繁な調整を減らします。

behavior パラメータと設定例の詳細については、「HPA のスケーリング動作を微調整する」をご参照ください。

よくある質問

参考資料

その他の関連ドキュメント

その他の ワークロードスケーリング ソリューション

  • アプリケーションリソースの使用量に定期的な変更があり、Crontab のような戦略に従ってポッドを定期的にスケーリングする必要がある場合は、「スケジュールされた水平スケーリングに CronHPA を使用する」をご参照ください。

  • アプリケーションリソースの使用量にルールで定義するのが難しい周期的な変更がある場合は、Advanced Horizontal Pod Autoscaling (AHPA) を使用して、リソース使用サイクルを自動的に識別し、履歴メトリックに基づいてポッドをスケーリングできます。 詳細については、「AHPA に基づく予測スケーリング」をご参照ください。

  • ポッドが十分な計算リソースを取得できるように、ポッドリソースの使用量に基づいてポッドのリソース制限を自動的に設定する必要がある場合は、「Vertical Pod Autoscaler (VPA)」をご参照ください。

  • メッセージキュー、タイミング戦略、カスタムメトリック、その他の Kubernetes イベントに基づいてポッドのスケーリングポリシーを柔軟にカスタマイズする必要がある場合は、「ACK KEDA」をご参照ください。

組み合わせソリューション

ノード自動スケーリング 機能と HPA を一緒に使用すると、クラスタノードリソースが不足している場合にノードを自動的にスケーリングできます。 詳細については、「ノードの自動スケーリングを有効にする」をご参照ください。