コンテナ定時スケーリング (CronHPA) と Horizontal Pod Autoscaler (HPA) は互いを認識しません。 アプリケーションに CronHPA と HPA の両方が構成されている場合、CronHPA と HPA はアプリケーションを個別にスケーリングします。 この場合、後のスケーリングアクティビティは前のスケーリングアクティビティを上書きします。 この問題を解決するために、Container Service for Kubernetes (ACK) は、CronHPA が HPA と競合なく対話するためのソリューションを提供します。 ACK は、CronHPA と HPA の両方がデプロイされていることを検出すると、HPA を CronHPA のスケーリングオブジェクトとして設定します。 CronHPA は、スケジュールされた時間に HPA によってスケーリングされるオブジェクト (デプロイメントなど) をスケーリングするように HPA をトリガーします。
[ACK コンソール] で HPA と CronHPA をデプロイする場合は、このトピックで説明されている手順を省略できます。 この場合、ACK は CronHPA と HPA を互換にするための操作を自動的に実行します。
CronHPA テンプレートのサンプルと HPA テンプレートのサンプルの比較
CronHPA テンプレートのサンプル | HPA テンプレートのサンプル |
| |
上記のテンプレートは、以下の情報を示しています。
scaleTargetRefフィールドは、CronHPA と HPA の両方の構成で使用され、スケーリング対象のオブジェクトを指定します。CronHPA 構成の
jobsセクションの crontab ルールは、スケジュールされた時間にポッドがスケーリングされる数を指定します。HPA は、リソース使用量に基づいてスケーリングアクティビティをトリガーします。
CronHPA と HPA の両方がデプロイされている場合、CronHPA と HPA は scaleTargetRef で指定された同じアプリケーションをスケーリングする可能性があります。 この問題を解決するには、CronHPA が HPA のステータスを検出できるようにするだけで済みます。
ソリューション
メカニズム
ACK は、CronHPA と HPA の両方がデプロイされていることを検出すると、HPA を CronHPA のスケーリングオブジェクトとして設定します。 HPA テンプレートのサンプルでは、scaleTargetRef は HPA によって管理されるデプロイメントを指定します。 デプロイメントはレプリカセットに関連付けられています。 HPA がデプロイメントをスケーリングすると、レプリカセットはポッドを目的の数にスケーリングします。
CronHPA の scaleTargetRef パラメーターを HPA に設定すると、CronHPA は HPA の minReplicas、maxReplicas、desiredReplicas パラメーターの値、および HPA の scaleTargetRef パラメーターで指定されたアプリケーションを実行しているポッドの現在の数を認識できます。 これにより、CronHPA は上記の値を CronHPA ジョブで必要なポッドの数と比較して、アプリケーションでスケーリングをどのように実装するかを決定します。
CronHPA は、デプロイメントのポッドの数を直接変更しません。 CronHPA は、ポッドをスケーリングするように HPA をトリガーします。 これにより、CronHPA と HPA の競合を防ぎます。
サンプル構成
CronHPA の scaleTargetRef パラメーターを HPA に設定します。 例:
元の構成 | 変更後の構成 |
| |
hpa-sample という名前の HPA リソースを作成して、毎日 09:00 (UTC + 08:00) から 17:00 (UTC + 08:00) までのワークロードの変動を処理するとします。 この場合、HPA リソースをスケーリングする CronHPA ジョブを作成できます。 たとえば、毎日 09:00 (UTC + 08:00) にアプリケーションをスケールアウトし、毎日 17:00 (UTC + 08:00) にアプリケーションをスケールインする CronHPA ジョブを構成できます。
次のサンプルコードブロックは、HPA と互換性のある CronHPA テンプレートの例を示しています。
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
spec:
scaleTargetRef: # HPA リソースに関する情報を指定します。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
name: hpa-sample
jobs:
- name: "scale-up-9am" // 午前9時にスケールアップ
schedule: "0 0 9 * * * "
targetSize: 20
runOnce: false
- name: "scale-down-5pm" // 午後5時にスケールダウン
schedule: "0 0 17 * * *"
targetSize: 3
runOnce: false互換性ルール
次の表は、CronHPA と HPA が競合なく対話できるようにする互換性ルールを示しています。
次のリストは、テーブルヘッダーについて説明しています。
HPA (min/max): HPA の minReplicas パラメーターと maxReplicas パラメーターの比率。
CronHPA で必要なポッドレプリカの数: CronHPA で必要なポッドレプリカの数。
ポッドレプリカの現在の数: アプリケーションを実行しているポッドレプリカの現在の数。
ポッドレプリカの最終的な数: アプリケーションがスケーリングされるポッドレプリカの数。
スケーリング条件 | スケーリング結果 | 説明 | ||
HPA (min/max) | CronHPA で必要なポッドレプリカの数 | ポッドレプリカの現在の数 | ||
1/10 | 5 | 5 |
| CronHPA で必要なポッドの数がポッドの現在の数と同じ場合、CronHPA は HPA の minReplicas パラメーターと maxReplicas パラメーターの値を変更しません。 また、スケーリングアクティビティはトリガーされません。 |
1/10 | 4 | 5 |
| CronHPA で必要なポッドの数がポッドの現在の数よりも少ない場合、スケーリングアクティビティはトリガーされません。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
関連ドキュメント
HPA と CronHPA の詳細については、「Horizontal Pod Autoscaler (HPA) を実装する」および「スケジュールされた水平スケーリングに CronHPA を使用する」をご参照ください。