アプリケーションコンテナーに対して Horizontal Pod Autoscaler (HPA) 機能を有効にすることで、CPU 使用率、メモリ使用率、またはその他のカスタムメトリックに基づいて Pod を自動的にスケーリングできます。HPA は、急なワークロードのスパイクに対応するために Pod レプリカを自動的にスケールアウトし、ワークロードが減少したときにはリソースを節約するために Pod レプリカをスケールインします。このプロセスは完全に自動化されています。HPA は、eコマース、オンライン教育、金融サービスなど、ワークロードの変動が大きく、頻繁なスケーリングが必要なサービスに最適です。
事前準備
HPA 機能を使用する前に、Kubernetes の公式ドキュメント Horizontal Pod Autoscaling をお読みになり、その基本原則、アルゴリズムの詳細、設定可能なスケーリング動作について理解することを推奨します。
Container Service for Kubernetes (ACK) クラスターは、さまざまなワークロードスケーリング (スケジューリングレイヤーの弾力性) およびノードスケーリング (リソースレイヤーの弾力性) ソリューションを提供します。先に進む前に、「Auto Scaling」をお読みになり、各ソリューションのユースケースと制限事項を理解してください。
前提条件
ACK マネージドクラスターまたはACK 専用クラスターが作成されていること。詳細については、「クラスターの作成」をご参照ください。
kubectl コマンドを使用して HPA を実装する場合は、kubectl クライアントを Kubernetes クラスターに接続する必要があります。詳細については、「クラスターの KubeConfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
コンソールでの HPA アプリケーションの作成
Container Service for Kubernetes (ACK) は HPA と統合されており、ACK コンソールで HPA アプリケーションを作成できます。アプリケーションの作成時に HPA を有効にすることも、既存のアプリケーションに対して有効にすることもできます。各ワークロードに対しては、1つの HPA のみを作成することを推奨します。
アプリケーション作成時の HPA の作成
以下の手順では、ステートレスな Deployment を例に、アプリケーションで HPA を有効にする方法を説明します。他の種類のワークロードの手順も同様です。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ステートレス] ページで、[イメージから作成] をクリックします。
[作成] ページで、アプリケーションの基本情報、コンテナー、サービス、スケーリングの設定を行い、Horizontal Pod Autoscaler (HPA) をサポートする Deployment を作成します。
手順とパラメーターの詳細については、「ステートレスワークロード (Deployment) の作成」をご参照ください。以下に主要なパラメーターを説明します。
[基本情報]:アプリケーションの名前やレプリカ数などの基本設定を構成します。
[コンテナー設定]:コンテナーのイメージと、必要な CPU およびメモリリソースを構成します。
リソースプロファイル機能を使用して、過去のリソース使用量データを分析し、コンテナーのリクエストとリミットを設定するための推奨値を取得できます。詳細については、「リソースプロファイル」をご参照ください。
重要アプリケーションのリクエストリソースを設定する必要があります。設定しない場合、コンテナーの自動スケーリングは実行できません。
[詳細設定]:
[アクセス設定] セクションで、[サービス] の横にある [作成] をクリックしてサービスを構成します。
[スケーリング設定] セクションで、[メトリックベースのスケーリング] を [有効化] に設定し、スケーリングの条件とパラメーターを構成します。
[メトリック]:サポートされているメトリックは CPU とメモリです。メトリックタイプは、設定したリソースタイプと一致する必要があります。CPU とメモリの両方を指定した場合、いずれかのメトリックがしきい値に達すると HPA がスケーリングイベントをトリガーします。
[トリガー条件]:リソース使用率のパーセンテージを指定します。リソース使用量がこの値を超えると、アプリケーションはスケールアウトします。水平ポッド自動スケーリングのアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
[最大レプリカ数]:Deployment がスケールアウトできるレプリカの最大数です。この値は、最小レプリカ数より大きい必要があります。
[最小レプリカ数]:Deployment のレプリカの最小数で、1 以上の整数である必要があります。
Deployment が作成された後、[Deployment] ページで表示できます。Deployment 名をクリックし、[Pod スケーリング] タブをクリックします。このタブでは、CPU やメモリの使用率、レプリカの最大数・最小数など、Horizontal Pod Autoscaler (HPA) のアクティビティに関連するメトリックを表示できます。また、HPA の構成の更新や無効化など、HPA の管理も行えます。
既存アプリケーションに対する HPA の作成
以下の手順では、ステートレスな Deployment を例に、既存のアプリケーションで HPA を有効にする方法を説明します。他の種類のワークロードの手順も同様です。
ワークロードページ
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ステートレス] ページで、対象のアプリケーション名をクリックし、[コンテナースケーリング] タブをクリックして、HPA エリアで [作成] をクリックします。
[作成] ダイアログボックスで、スケーリング設定を構成します。
[名前]:HPA ポリシーの名前を指定します。
[メトリック] については、[追加] をクリックします。
[メトリック]:サポートされているメトリックは CPU とメモリです。メトリックタイプは、設定したリソースタイプと一致する必要があります。CPU とメモリの両方を指定した場合、いずれかのメトリックがしきい値に達すると HPA がスケーリングイベントをトリガーします。
[しきい値]:リソース使用率のパーセンテージです。リソース使用量がこの値を超えると、コンテナーはスケールアウトします。水平ポッド自動スケーリングのアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
[最大レプリカ数]:Deployment がスケールアウトできるレプリカの最大数です。この値は、最小レプリカ数より大きい必要があります。
[最小レプリカ数]:Deployment のレプリカの最小数で、1 以上の整数である必要があります。
構成が完了したら、[Deployment] ページで Deployment 名をクリックし、[Pod スケーリング] タブをクリックします。このタブでは、CPU やメモリの使用率、レプリカの最小数・最大数など、Horizontal Pod Autoscaler (HPA) のメトリックを表示できます。また、HPA の構成の更新や無効化など、HPA の管理も行えます。
ワークロードスケーリングページ
このページはホワイトリストのユーザーのみが利用できます。利用するには、チケットを送信してください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のペインで、[ワークロードスケーリング] をクリックします。
右上隅にある [自動スケーリングの作成] をクリックし、[HPA と CronHPA] タブをクリックします。対象のワークロードを選択します。[スケーリングポリシーの設定] セクションで、[メトリックベースの自動スケーリング HPA] を選択し、HPA ポリシーを構成します。
[ポリシー名]:HPA ポリシーの名前です。
[最小レプリカ数]:ワークロードのレプリカの最小数です。値は 1 以上である必要があります。
[最大レプリカ数]:ワークロードがスケールアウトできるレプリカの最大数です。この値は、最小レプリカ数より大きい必要があります。
[メトリック名]:サポートされているメトリックには、CPU、GPU、メモリ、Nginx Ingress リクエスト、カスタムメトリックが含まれます。メトリックタイプは、指定されたリソースタイプと一致する必要があります。複数のリソースタイプを指定した場合、いずれかのメトリックがしきい値に達すると HPA がスケーリングイベントをトリガーします。
[しきい値]:コンテナーのスケールアウトをトリガーするリソース使用率のパーセンテージです。水平ポッド自動スケーリングのアルゴリズムの詳細については、「アルゴリズムの詳細」をご参照ください。
HPA が作成された後、[ワークロードスケーリング] ページで HPA のリストを表示できます。[操作] 列で、リソース使用率やレプリカの最小数・最大数など、HPA のメトリックを表示できます。また、構成の更新や無効化など、HPA の管理も行えます。
結果の検証
クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のペインで、[ワークロードスケーリング] をクリックします。
[水平スケーリング] タブをクリックし、[HPA] を選択して、スケーリングのステータスとタスクリストを表示します。
本番環境では、アプリケーションは Pod のペイロードに基づいてスケーリングします。ステージング環境で Pod に負荷テストを実施して、水平スケーリングの動作を検証することもできます。
kubectl を使用した HPA アプリケーションの作成
オーケストレーションテンプレートから手動で HPA を作成し、スケーリングしたい Deployment オブジェクトにバインドすることもできます。その後、kubectl コマンドを使用してコンテナーの自動スケーリングを構成できます。各ワークロードに対しては、1つの HPA のみを作成することを推奨します。以下の手順では、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 # Deployment のレプリカの最小数。値は 1 以上の整数である必要があります。 maxReplicas: 10 # Deployment のレプリカの最大数。値は 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 コンポーネントメトリックに基づく水平ポッド自動スケーリング」をご参照ください。
Prometheus メトリックを HPA が水平ポッド自動スケーリングに使用できるメトリックに変換する方法については、「Alibaba Cloud Prometheus メトリックに基づく水平ポッド自動スケーリング」をご参照ください。
自動スケーリングの問題のトラブルシューティングについては、「ノードの自動スケーリングに関するよくある質問」をご参照ください。
CronHPA と HPA を連携させるには、「CronHPA と HPA の連携」をご参照ください。
その他の ワークロードスケーリングソリューション
アプリケーションのリソース使用量に周期的な変化があり、Crontab ポリシーのようにスケジュールに基づいて Pod をスケーリングする必要がある場合は、「CronHPA を使用したスケジュールに基づく水平ポッドスケーリング」をご参照ください。
アプリケーションのリソース使用量に周期的な変化があり、ルールで定義するのが難しい場合は、AHPA を使用して過去のメトリックからビジネスサイクルを自動的に識別し、それに応じて Pod をスケーリングできます。詳細については、「予測型自動スケーリング (AHPA)」をご参照ください。
Pod のリソース使用量に基づいてリソースリミットを自動的に設定し、Pod が十分な計算リソースを持つようにするには、「Vertical Pod Autoscaling (VPA) の使用」をご参照ください。
メッセージキュー、スケジュールされたポリシー、カスタムメトリックなどの Kubernetes イベントに基づいて Pod のスケーリングポリシーを柔軟にカスタマイズするには、「イベント駆動型自動スケーリング」をご参照ください。
組み合わせソリューション
HPA をノードの自動スケーリング機能と組み合わせて使用することで、クラスターのリソースが不足した場合にノードを自動的にスケーリングできます。詳細については、「ノードの自動スケーリングの有効化」をご参照ください。