CPU 使用率、メモリ使用率、またはその他のカスタムメトリックに基づいて Pod を自動的にスケーリングする場合は、アプリケーションコンテナーに対して Horizontal Pod Autoscaler (HPA) 機能を有効にできます。HPA は、急なワークロードの急増に対応するために Pod レプリカを迅速にスケールアウトし、ワークロードが減少したときにはリソースを節約するために Pod をスケールインできます。このプロセスは自動化されており、手動での介入は不要です。HPA は、E コマース、オンライン教育、金融など、サービスの変動が大きく、頻繁なスケーリングが必要なシナリオに適しています。
事前準備
HPA 機能をより効果的に使用するために、Kubernetes の公式ドキュメント Horizontal Pod Autoscaling を読み、その基本原則、アルゴリズムの詳細、および設定可能なスケーリング動作を理解してください。
さらに、Container Service for Kubernetes (ACK) クラスターは、さまざまなワークロードスケーリング (スケジューリング層の伸縮性) およびノードスケーリング (リソース層の伸縮性) ソリューションを提供します。先に進む前に、Auto Scaling を読み、各ソリューションのユースケースと制限事項を理解してください。
前提条件
ACK マネージドクラスターまたはACK 専用クラスターを作成済みであること。詳細については、「クラスターの作成」をご参照ください。
kubectl コマンドを使用して HPA を実装する場合は、kubectl を使用して Kubernetes クラスターに接続します。詳細については、「kubectl を使用した ACK クラスターへの接続」をご参照ください。
コンソールでの HPA アプリケーションの作成
Container Service for Kubernetes (ACK) は HPA と統合されており、ACK コンソールで HPA ポリシーを作成できます。アプリケーションの作成時に HPA ポリシーを作成するか、既存のアプリケーションに対して HPA を有効にすることができます。各ワークロードに対して作成する HPA ポリシーは 1 つだけにすることを推奨します。
アプリケーション作成時の HPA の作成
次の例では、ステートレスな Deployment に対して Horizontal Pod Autoscaler (HPA) を有効にする方法を説明します。他のタイプのワークロードでも手順は同様です。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[ステートレス] ページで、[イメージから作成] をクリックします。
[作成] ページで、アプリケーションの基本情報、コンテナー、Service、およびスケーリング設定を構成して、HPA をサポートする Deployment を作成します。
手順と設定項目の詳細については、「ステートレスワークロード (Deployment) の作成」をご参照ください。以下に主要な設定項目のみを説明します。
[基本情報]:アプリケーション名、レプリカ数、その他の情報を設定します。
[コンテナー設定]:イメージと必要な CPU およびメモリリソースを設定します。
リソースプロファイル機能を使用して、過去のリソース使用量データを分析し、コンテナーのリクエストとリミットを設定するための推奨事項を取得できます。詳細については、「リソースプロファイル」をご参照ください。
重要アプリケーションのリソースリクエストを設定する必要があります。設定しない場合、HPA を有効にすることはできません。
高度な設定:
[スケーリング設定] セクションで、[メトリックベースのスケーリング] の [有効化] を選択し、スケーリングの条件とパラメーターを設定します。
[メトリック]:CPU とメモリがサポートされています。メトリックタイプは、リクエストを設定したリソースタイプと一致する必要があります。CPU とメモリの両方を指定した場合、HPA はいずれかのメトリックがしきい値に達したことを検出するとスケーリング操作をトリガーします。
[トリガー条件]:リソース使用率のパーセンテージ。指定された使用率を超えると、アプリケーションはスケールアウトを開始します。水平 Pod 自動スケーリングアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
[最大レプリカ数]:Deployment がスケールアウトできるレプリカの最大数。この値は、レプリカの最小数より大きい必要があります。
[最小レプリカ数]:Deployment がスケールインできるレプリカの最小数。この値は 1 以上の整数である必要があります。
Deployment が作成された後、[Deployments] ページで表示できます。Deployment 名をクリックし、[Pod スケーリング] タブをクリックします。このタブでは、CPU やメモリの使用率、レプリカの最大数や最小数など、HPA 関連のメトリックを表示できます。また、構成の更新や無効化など、HPA ポリシーを管理することもできます。
既存アプリケーションに対する HPA の作成
以下の手順では、既存のステートレスアプリケーション (Deployment) に対して HPA を有効にする方法を説明します。他のワークロードタイプでも手順は同様です。
ワークロードページ
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[ステートレス] ページで、ターゲットアプリケーションをクリックします。[コンテナースケーリング] タブで、HPA エリアの [作成] をクリックします。
[作成] ダイアログボックスで、スケーリング設定を行います。
[名前]:HPA ポリシーの名前。
メトリック:[追加] をクリックします。
[メトリック]:CPU とメモリがサポートされています。メトリックタイプは、リクエストを設定したリソースタイプと一致する必要があります。CPU とメモリの両方を指定した場合、HPA はいずれかのメトリックがしきい値に達したことを検出するとスケーリング操作をトリガーします。
[しきい値]:リソース使用率のパーセンテージ。指定された使用率を超えると、アプリケーションはスケールアウトを開始します。水平 Pod 自動スケーリングアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
[最大コンテナー数]:Deployment がスケールアウトできるレプリカの最大数。この値は、レプリカの最小数より大きい必要があります。
[最小コンテナー数]:Deployment がスケールインできるレプリカの最小数。この値は 1 以上の整数である必要があります。
設定が完了したら、[Deployments] ページで Deployment 名をクリックし、[Pod スケーリング] タブをクリックします。このタブでは、CPU やメモリの使用率、レプリカの最大数や最小数など、HPA 関連のメトリックを表示できます。また、構成の更新や無効化など、HPA ポリシーを管理することもできます。
ワークロードスケーリングページ
このページはホワイトリストに登録されているユーザーのみが利用できます。利用するには、チケットを送信してください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロードスケーリング] をクリックします。
ページの右上隅にある [自動スケーリングの作成] をクリックし、[HPA と CronHPA] タブをクリックします。ターゲットワークロードを選択します。[スケーリングポリシーの設定] セクションで、[メトリックベースの自動スケーリング (HPA)] チェックボックスを選択し、HPA ポリシーを設定します。
[ポリシー名]:HPA ポリシーの名前。
[最小コンテナー数]:ワークロードがスケールインできるレプリカの最小数。この値は 1 以上の整数である必要があります。
[最大コンテナー数]:ワークロードがスケールアウトできるレプリカの最大数。この値は、レプリカの最小数より大きい必要があります。
[メトリック]:CPU、GPU、メモリ、Nginx Ingress リクエスト、およびカスタムメトリックがサポートされています。メトリックタイプは、リクエストを設定したリソースタイプと一致する必要があります。複数のリソースタイプを指定した場合、HPA はいずれかのメトリックがしきい値に達したことを検出するとスケーリング操作をトリガーします。
[しきい値]:リソース使用率のパーセンテージ。指定された使用率を超えると、アプリケーションはスケールアウトを開始します。水平 Pod 自動スケーリングアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
HPA ポリシーが作成された後、[ワークロードスケーリング] ページで表示できます。[アクション] 列で、リソース使用率やレプリカの最大数・最小数など、HPA 関連のメトリックを表示できます。また、構成の更新や無効化など、HPA ポリシーを管理することもできます。
結果の検証
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロードスケーリング] をクリックします。
[水平スケーリング] タブをクリックし、[HPA] をクリックしてスケーリングステータスとタスクのリストを表示します。
本番環境では、アプリケーションは Pod の負荷に基づいてスケーリングします。ステージング環境で Pod のストレステストを実行して、水平スケーリングの動作を検証することもできます。
kubectl を使用した HPA アプリケーションの作成
オーケストレーションテンプレートから手動で HPA を作成し、スケーリングしたい Deployment オブジェクトにアタッチすることもできます。その後、kubectl コマンドを使用してアプリケーションの自動スケーリングを設定できます。各ワークロードに対して HPA は 1 つだけ作成することを推奨します。次の例では、HPA をサポートする Nginx アプリケーションをデプロイする方法を示します。
nginx.yml という名前のファイルを作成し、次の内容をコピーします。
重要HPA を実装する場合、Pod の
requestリソースを設定する必要があります。そうしないと、HPA は実行できません。リソースプロファイル機能を使用して、過去のリソース使用量データを分析し、コンテナーのリクエストとリミットを設定するための推奨事項を取得できます。詳細については、「リソースプロファイル」をご参照ください。次のコマンドを実行して、Nginx アプリケーションを作成します。
kubectl apply -f nginx.ymlhpa.yml という名前のファイルを作成し、次の内容をコピーして HPA を作成します。
scaleTargetRefを使用して、HPA がアタッチされるオブジェクトを指定します。この例では、HPA はnginxという名前の Deployment にアタッチされます。すべての Pod 内のすべてのコンテナーの平均 CPU 使用率が 50% に達すると、スケーリング操作がトリガーされます。1.24 以降
apiVersion: autoscaling/v2 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 # リソースのターゲット平均使用率。これは、平均リソース使用量と要求リソース量の比率です。バージョン 1.24 以前
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 # 1 以上の整数である必要があります。 maxReplicas: 10 # レプリカの最小数より大きい必要があります。 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50CPU とメモリの両方のメトリックを指定するには、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_name>を実行します。この例では、HPA 名は nginx-hpa です。予期される警告メッセージは、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-75675f5HPA が作成され、Pod がスケーリング条件を満たすのを待ちます。この例では、Nginx Pod の CPU 使用率が 50% を超えると条件が満たされます。その後、再度
kubectl describe hpa <HPA_name>コマンドを実行して、水平スケーリングのステータスを確認します。期待される出力は、HPA が正常に実行されていることを示します。
Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 5m6s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
関連操作
デフォルトのスケーリング動作がビジネス要件を満たさない場合は、behavior フィールドを使用して、スケールイン (scaleDown) とスケールアウト (scaleUp) の動作をより細かい粒度で設定できます。詳細については、「設定可能なスケーリング動作」をご参照ください。
behavior がサポートする典型的なシナリオには、以下が含まれますが、これらに限定されません:
突然のトラフィック急増時の迅速なスケールアウトの実現。
負荷変動が頻繁なシナリオでの迅速なスケールアウトと緩やかなスケールインの実装。
状態に敏感なアプリケーションのスケールインの無効化。
リソースが限られている、またはコストに敏感なシナリオで、安定化ウィンドウ
stabilizationWindowSecondsを使用してスケールアウト速度を制限し、一時的な変動による頻繁な調整を減らす。
behavior の設定と設定例の詳細については、「HPA のスケーリング感度の調整」をご参照ください。
よくある質問
関連ドキュメント
その他の関連ドキュメント
Kubernetes の外部メトリック機能を使用して Alibaba Cloud コンポーネントのメトリックで HPA を実装する方法については、「Alibaba Cloud メトリックを使用した Pod の水平スケーリング」をご参照ください。
Prometheus メトリックを HPA 互換のメトリックに変換して HPA を実装する方法の詳細については、「Prometheus メトリックに基づく水平 Pod 自動スケーリング」をご参照ください。
HPA の使用中に問題が発生した場合は、トラブルシューティング情報について「ノード自動スケーリングに関するよくある質問」をご参照ください。
CronHPA と HPA を連携させるには、「CronHPA と HPA の連携」をご参照ください。
その他のワークロードスケーリングソリューション
アプリケーションのリソース使用量が定期的に変化し、Crontab のようなポリシーに基づいて Pod をスケーリングする必要がある場合は、「CronHPA を使用したスケジュールに基づく水平スケーリング」をご参照ください。
アプリケーションのリソース使用量が定期的に変化するものの、ルールで定義するのが難しい場合は、Advanced Horizontal Pod Autoscaling (AHPA) を使用できます。AHPA は、過去のメトリックに基づいてビジネスサイクルを自動的に識別し、Pod をスケーリングします。詳細については、「予測スケーリング (AHPA)」をご参照ください。
Pod のリソース使用量に基づいてリソースリミットを自動的に設定し、十分な計算リソースを受け取れるようにするには、「Vertical Pod Autoscaling (VPA) の使用」をご参照ください。
メッセージキュー、スケジュールされたポリシー、カスタムメトリックなどの Kubernetes イベントに基づいて Pod のスケーリングポリシーを柔軟にカスタマイズするには、「イベント駆動型自動スケーリング」をご参照ください。
組み合わせソリューション
HPA をノード自動スケーリング機能と組み合わせて使用することで、クラスターノードのリソースが不足した場合にノードを自動的にスケーリングできます。詳細については、「ノード自動スケーリングの有効化」をご参照ください。