Horizontal Pod Autoscaler (HPA) 機能を有効にして、CPU 使用率、メモリ使用量、またはその他のメトリックに基づいてポッドを自動的にスケーリングできます。 HPA は、ワークロードが急増したときに負荷の高いストレスを処理するためにレプリケートされたポッドを迅速にスケールアウトし、ワークロードが減少したときにリソースを節約するために適切にスケールインできます。 プロセス全体が自動化されており、人為的な介入は必要ありません。 E コマースサービス、オンライン教育、金融サービスなど、サービスの変動が大きく、サービス数が多い、スケーリング要件が頻繁にあるビジネスに最適です。
始める前に
HPA 機能をより適切に使用するために、このトピックを読む前に、Kubernetes 公式ドキュメントの Horizontal Pod Autoscaling を読んで、HPA の基本原則、アルゴリズムの詳細、およびスケーリング設定を理解することをお勧めします。
さらに、Container Service for Kubernetes (ACK) クラスタは、スケジューリングレイヤーの弾力性のためのさまざまな ワークロードスケーリング ソリューションと、リソースレイヤーの弾力性のための ノードスケーリング ソリューションを提供します。 HPA 機能を使用する前に、自動スケーリング を読んで、さまざまなソリューションの適用可能なシナリオと使用制限を理解することをお勧めします。
前提条件
ACK マネージドクラスター または ACK 専用クラスター が作成されていること。 詳細については、「クラスターを作成する」をご参照ください。
kubectl コマンドを使用して HPA を実装する場合は、kubectl クライアントが Kubernetes クラスタに接続されていることを確認する必要があります。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ACK コンソールで HPA が有効になっているアプリケーションを作成する
ACK は HPA と統合されています。 ACK コンソールで HPA が有効になっているアプリケーションを作成できます。 アプリケーションの作成時または既存のアプリケーションに対して HPA を有効にできます。 ワークロードに対して HPA が有効になっているアプリケーションは 1 つだけ作成することをお勧めします。
アプリケーションの作成時に HPA を有効にする
以下では、Deployment アプリケーションを例として、アプリケーションの作成時に HPA を有効にする方法について説明します。 その他のワークロードタイプの手順も同様です。
ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイメント] ページで、[イメージから作成] をクリックします。
[作成] ページで、プロンプトに従って基本情報、コンテナ設定、サービス設定、およびスケーリング設定を入力して、HPA をサポートする Deployment を作成します。
具体的な手順と設定パラメータの詳細については、「デプロイメントを使用してステートレスアプリケーションを作成する」をご参照ください。 以下に主要なパラメータを示します。
[基本情報]: アプリケーションの名前、レプリカ数などの情報を設定します。
[コンテナ]: イメージと必要な CPU およびメモリリソースを選択します。
リソースプロファイリング機能を使用して、リソース使用量の履歴データを分析し、コンテナのリクエストと制限の設定に関する推奨事項を取得できます。 詳細については、「リソースプロファイリング」をご参照ください。
重要アプリケーションに必要な
request
リソースを設定する必要があります。 そうしないと、HPA を有効にできません。[詳細設定]:
[アクセス制御] セクションで、[サービス] の右側にある [作成] をクリックしてパラメータを設定します。
[スケーリング] セクションで、[HPA] の [有効化] を選択し、スケーリングしきい値と関連パラメータを設定します。
[メトリック]: [CPU 使用率] または [メモリ使用量] を選択します。これは、[必要なリソース] フィールドで指定したものと同じである必要があります。 [CPU 使用率] と [メモリ使用量] の両方が指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。
[条件]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。
[最大レプリカ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。
[最小レプリカ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。
作成後、[デプロイメント] ページで新しい Deployment を表示できます。 デプロイメント名をクリックし、[基本情報] ページの [ポッドスケーリング] タブをクリックします。 [HPA] セクションでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。
既存のアプリケーションに対して HPA を有効にする
以下では、Deployment アプリケーションを例として、既存のアプリケーションに対して HPA を有効にする方法について説明します。 その他のワークロードタイプの手順も同様です。
ワークロードページを使用する
ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイメント] ページで、ターゲットアプリケーション名をクリックし、[ポッドスケーリング] タブをクリックし、[HPA] の右側にある [作成] をクリックします。
[作成] ダイアログボックスで、プロンプトに従って HPA 設定を構成します。
[名前]: HPA ポリシーの名前を入力します。
[メトリック]: [CPU 使用率] または [メモリ使用量] を選択します。これは、[必要なリソース] フィールドで指定したものと同じである必要があります。 [CPU 使用率] と [メモリ使用量] の両方が指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。
[しきい値]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。
[最大コンテナ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。
[最小コンテナ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。
作成後、[デプロイメント] ページで Deployment 名をクリックできます。 [基本情報] ページで、[ポッドスケーリング] タブをクリックします。 [HPA] セクションでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。
ワークロードスケーリングページを使用する
ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、
を選択します。ページの右上隅にある [自動スケーリングの作成] をクリックし、ターゲットワークロードを選択し、[HPA と Cronhpa] タブの下の [HPA] オプションをオンにして、プロンプトに従って HPA ポリシーを構成します。
[スケーリングポリシー名]: HPA ポリシーの名前を入力します。
[最小コンテナ数]: Deployment に対して実行する必要があるポッドの最小数を指定します。 このパラメータの値は、1 以上の整数である必要があります。
[最大コンテナ数]: Deployment をスケーリングできるポッドの最大数を指定します。 このパラメータの値は、レプリケートされたポッドの最小数よりも大きい必要があります。
[スケーリングメトリック]: CPU とメモリをサポートします。これは、設定されている必要なリソースタイプと同じである必要があります。 CPU とメモリの両方のリソースタイプが指定されている場合、HPA は、いずれかのメトリックがスケーリングしきい値に達すると、スケーリング操作を実行します。
[しきい値]: リソース使用量のしきい値を指定します。 HPA は、しきい値を超えるとスケーリングイベントをトリガーします。 水平ポッド自動スケーリングの実行に使用されるアルゴリズムの詳細については、アルゴリズムの詳細 をご参照ください。
作成後、[ワークロードスケーリング] ページで HPA リストを表示できます。 新しい HPA タスクの [アクション] 列の [詳細] をクリックします。 詳細ページでは、CPU とメモリ使用量、レプリカの最大数と最小数など、HPA アクティビティに関連するメトリックを監視できます。 また、このセクションでは、設定の更新や無効化など、HPA を管理することもできます。
結果の検証
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のウィンドウで、
を選択します。[水平スケーリング] タブをクリックし、[HPA] を選択して、スケーリングステータスとタスクリストを表示します。
アプリケーションの実行が開始されると、コンテナリソースはポッド間の負荷に基づいて自動的にスケーリングされます。 また、アプリケーションのポッドで CPU ストレステストを実行することにより、ステージング環境で HPA が有効になっているかどうかを確認することもできます。
kubectl を使用して HPA が有効になっているアプリケーションを作成する
オーケストレーションテンプレートを使用して HPA を作成し、HPA を有効にする Deployment と HPA を関連付けることもできます。 その後、kubectl コマンドを実行して HPA を有効にできます。 ワークロードに対して HPA が有効になっているアプリケーションは 1 つだけ作成することをお勧めします。 次の例では、NGINX アプリケーションに対して HPA が有効になっています。
nginx.yml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
重要アプリケーションに必要な
request
リソースを設定する必要があります。 そうしないと、HPA を有効にできません。 リソースプロファイリング機能を使用して、リソース使用量の履歴データを分析し、コンテナのリクエストと制限の設定に関する推奨事項を取得できます。 詳細については、「リソースプロファイリング」をご参照ください。次のコマンドを実行して、NGINX アプリケーションを作成します。
kubectl apply -f nginx.yml
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
フィールドの下にcpu
とmemory
の両方のリソースタイプを指定できます。 HPA は、いずれかのメトリックがスケーリングしきい値に達したことを検出すると、スケーリング操作を実行します。metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 50
次のコマンドを実行して、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
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 のスケーリング動作を微調整する」をご参照ください。
よくある質問
参考資料
その他の関連ドキュメント
Alibaba Cloud メトリックに基づいて HPA を実装するために、Kubernetes でサポートされている外部メトリックを構成する方法の詳細については、「Alibaba Cloud メトリックに基づいて水平自動スケーリングを実装する」をご参照ください。
HPA を実装するために、Managed Service for Prometheus メトリックを HPA でサポートされているメトリックに変換する方法の詳細については、「Prometheus メトリックに基づいて水平自動スケーリングを実装する」をご参照ください。
HPA の使用時に発生する可能性のあるよくある質問については、トラブルシューティングのために、「ノード自動スケーリングに関するよくある質問」をご参照ください。
CronHPA と HPA が競合なく相互作用できるようにする方法の詳細については、「CronHPA を HPA と互換性を持たせる」をご参照ください。
その他の ワークロードスケーリング ソリューション
アプリケーションリソースの使用量に定期的な変更があり、Crontab のような戦略に従ってポッドを定期的にスケーリングする必要がある場合は、「スケジュールされた水平スケーリングに CronHPA を使用する」をご参照ください。
アプリケーションリソースの使用量にルールで定義するのが難しい周期的な変更がある場合は、Advanced Horizontal Pod Autoscaling (AHPA) を使用して、リソース使用サイクルを自動的に識別し、履歴メトリックに基づいてポッドをスケーリングできます。 詳細については、「AHPA に基づく予測スケーリング」をご参照ください。
ポッドが十分な計算リソースを取得できるように、ポッドリソースの使用量に基づいてポッドのリソース制限を自動的に設定する必要がある場合は、「Vertical Pod Autoscaler (VPA)」をご参照ください。
メッセージキュー、タイミング戦略、カスタムメトリック、その他の Kubernetes イベントに基づいてポッドのスケーリングポリシーを柔軟にカスタマイズする必要がある場合は、「ACK KEDA」をご参照ください。
組み合わせソリューション
ノード自動スケーリング 機能と HPA を一緒に使用すると、クラスタノードリソースが不足している場合にノードを自動的にスケーリングできます。 詳細については、「ノードの自動スケーリングを有効にする」をご参照ください。