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

Container Compute Service:Cron-based container scaling (CronHPA)

最終更新日:Feb 18, 2026

リソースの利用効率を向上させ、コストを削減するため、Container Compute Service (ACS) では、`ack-kubernetes-cronhpa-controller` コンポーネントを用いた Cron 定時スケーリングをサポートしています。この機能は「Cron Horizontal Pod Autoscaler(CronHPA)」と呼ばれ、リソースの無駄を削減します。本トピックでは、ACS クラスターにおける Cron 定時コンテナー スケーリングの実装方法と、CronHPA が Horizontal Pod Autoscaler(HPA)と互換性を持つ仕組みについて説明します。

前提条件

背景情報

ack-kubernetes-cronhpa-controller は、crontab と同様に、スケジュールされた時間にクラスターのリソースをスケールする Kubernetes HPA コントローラーです。CronHPA は、scale サブリソースをサポートする任意の Kubernetes オブジェクト(デプロイメントや StatefulSet など)で使用できます。詳細については、「kubernetes-cronhpa-controller」をご参照ください。

以下の例では、CronHPA の構成ファイル内の各フィールドについて説明します。

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
  namespace: default 
spec:
   scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: nginx-deployment-basic
   excludeDates:
   # 11 月 15 日を除外
   - "* * * 15 11 *"
   # 毎週金曜日を除外
   - "* * * * * 5"
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: false

フィールド

説明

scaleTargetRef

scaleTargetRef フィールドは、スケール対象のオブジェクトを指定します。CronHPA は、Scale サブリソースをサポートするすべてのオブジェクトに対応しています。

excludeDates

excludeDates フィールドは日付の配列です。excludeDates に一致する日付には、タスクがスキップされます。

説明

最小単位はです。

フォーマット "* * * * * *" は、「<秒> <分> <時> <月の日> <月> <曜日>」を表します。

たとえば、11 月 15 日にタスクが実行されないようにするには、次の例のように excludeDates を設定します。

excludeDates:
  - "* * * 15 11 *"

jobs

単一の spec 内で複数の CronHPA タスクを定義できます。各 CronHPA タスクには、以下のフィールドを設定できます。

  • name:CronHPA オブジェクト内で一意である必要があります。これにより、異なるタスクを name で区別できます。

  • schedule:ポリシーは crontab と類似しています。ack-kubernetes-cronhpa-controller は、より多くの式ルールをサポートする強力な Golang ライブラリ(go-cron)を使用します。以下のフォーマットに厳密に従ってスケジュールを設定してください。それ以外の場合、作成に失敗します。

    cron 式のフォーマットは以下のとおりです。

    フィールド名       | 必須? | 許容値           | 許容される特殊文字
      --------------   | ------ | ---------------- | ------------------
      秒               | はい   | 0–59             | * / , -
      分               | はい   | 0–59             | * / , -
      時               | はい   | 0–23             | * / , -
      月の日           | はい   | 1–31             | * / , - ?
      月               | はい   | 1–12 または JAN–DEC | * / , -
      曜日             | はい   | 0–6 または SUN–SAT | * / , - ?
  • targetSize:スケジュールされた時刻にスケールする Pod 数を設定します。

  • runOncerunOncetrue に設定すると、タスクは 1 回のみ実行され、その後終了します。

CronHPA コンポーネントのインストール

以下のように `ack-kubernetes-cronhpa-controller` コンポーネントをインストールできます。

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

  2. [クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。

  3. [アドオン] ページで、[アプリケーション管理] タブをクリックします。ack-kubernetes-cronhpa-controller を見つけ、[インストール] をクリックします。表示されたダイアログボックスで、[OK] をクリックします。

説明

Cron 定時コンテナー スケーリングを今後使用しない場合は、CronHPA コンポーネントを削除できます。「アドオンの管理」をご参照ください。

CronHPA の定期タスクの作成

CronHPA をアプリケーションに適用して実行する前に、クラスター内の CronHPA コンポーネントが正常に動作していること、およびアプリケーションに HPA オブジェクトが 1 つだけ存在することを確認してください。CronHPA と HPA の互換性ポリシーの詳細については、「CronHPA と HPA の互換性」をご参照ください。CronHPA タスクは、以下のいずれかの方法で作成できます。

方法 1:アプリケーション作成時に CronHPA タスクを作成

アプリケーションを作成する際、[詳細設定] ページに移動します。スケーリング設定 セクションで、[有効化] を [Cron 定時スケーリング] の横に選択し、アプリケーション向けの定期スケーリングタスクを作成します。アプリケーションの作成方法については、「ステートレスワークロード(Deployment)の作成」または「ステートフルワークロード(StatefulSet)の作成」をご参照ください。

image.png

ACS コンソールは、自動的に CronHPA コンポーネントがインストール済みかどうかを確認します。未インストールの場合は、[クリックしてインストール] というメッセージが表示されます。CronHPA コンポーネントをインストールした後、定期スケーリングタスクの設定項目が表示されます。以下の表に、各パラメーターを示します。

設定項目

説明

定期タスク名

定期タスクの名前を定義します。各タスクの名前は一意である必要があります。

ターゲットレプリカ

スケジュールされた時刻に、アプリケーションのレプリカ数がこの値に自動的にスケールされます。

スケジューリング周期

スケジューリング周期を設定します。

定期スケーリングタスクのスケジューリング周期の設定方法については、「predefined-schedules」をご参照ください。

方法 2:既存のアプリケーション向けに CronHPA タスクを作成

以下に、既存のステートレスアプリケーション向けに CronHPA タスクを作成する手順を示します。

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

  2. [クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[Workloads] > [Deployments] を選択します。

  3. [ステートレス] ページで、アプリケーションの [操作] 列から [詳細] をクリックします。

  4. [コンテナー スケーリング] タブをクリックし、定期スケーリングタスクを設定します。

    • CronHPA コンポーネントがインストールされていない場合、[クリックしてインストール] というメッセージが表示されます。[クリックしてインストール] をクリックし、その後の手順に進んでください。

    • CronHPA コンポーネントがすでにインストール済みの場合は、直ちに次の手順に進んでください。

  5. [作成] を [Cron 定時スケーリング(CronHPA)] の横にクリックします。表示された [作成] ダイアログボックスで、定期スケーリングタスクのパラメーターを設定します。

    create

    以下の表に、設定項目を示します。

    設定項目

    説明

    タスク名

    定期タスクの名前を定義します。各タスクの名前は一意である必要があります。

    ターゲットレプリカ数

    スケジュールされた時刻に、アプリケーションのレプリカ数がこの値に自動的にスケールされます。

    スケジューリング周期

    スケジューリング周期を設定します。定期スケーリングタスクのスケジューリング周期の設定方法については、「predefined-schedules」をご参照ください。

定期スケーリングタスクの追加または変更

  1. [CronHPA の定期タスクの作成] の手順に従い、[コンテナー スケーリング] ページに移動します。

  2. [コンテナー スケーリング] タブの [Cron 定時スケーリング(CronHPA)] セクションで、対象のタスクを見つけ、[タスクの追加または編集] を [操作] 列からクリックします。

  3. [編集] ダイアログボックスで、[タスクの追加] をクリックして新しいタスクを作成するか、既存の CronHPA タスクをクリックして編集します。その後、[OK] をクリックします。

    modify

    説明

    CronHPA タスクは、以下の図に示すように削除できます。[編集] ダイアログボックスで、タスク名の右上隅にある削除アイコンをクリックし、その後 [OK] をクリックします。delete

CronHPA および HPA の定義テンプレート

CronHPA

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: nginx-deployment-basic
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 11	
	

HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deployment-basic-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment-basic
  minReplicas: 4
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50	
	

CronHPA と HPA の互換性

CronHPA および HPA は、デプロイメントや StatefulSet などのワークロードに対して作用します。同一のワークロードに両方を設定すると、競合が発生する可能性があります。この問題を解決するため、CronHPA は HPA オブジェクト自体をスケーリング対象として指定できるようになっており、これにより、HPA の元来の機能との互換性が確保されます。

CronHPA および HPA の定義テンプレートを比較すると、以下の点がわかります。

  • CronHPA および HPA は、どちらも spec.scaleTargetRef フィールドを使用してスケーリング対象オブジェクトを取得します。

  • CronHPA は、spec.jobs 内の crontab ルールを使用して、スケジュールされた時刻にレプリカ数をスケールします。

  • HPA は、リソース使用率に基づいてスケーリングを決定します。

CronHPA および HPA の両方を設定した場合、両者が同時に同じ scaleTargetRef を操作しようとする可能性があります。CronHPA および HPA は独立しており、相互を認識しないため、それぞれが個別に動作し、後から実行された操作が先に実行された操作を上書きします。

CronHPA と HPA の互換性に関する解決策

競合は、CronHPA が HPA の現在の状態を認識できれば解消されます。これを実現するために、ACS では CronHPA の scaleTargetRef を最終的なワークロードオブジェクトではなく、HPA オブジェクト自体に設定します。CronHPA がスケーリング操作を実行する際には、まず HPA オブジェクトを通じて実際の scaleTargetRef を検索し、その状態に基づいてワークロードオブジェクトを調整します。これにより、上書きが防止され、スケーリング操作が一貫性と予測可能性を保証されます。

image

以下は、HPA と互換性のある CronHPA 定義のテンプレートです。

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: autoscaling/v1
      kind: HorizontalPodAutoscaler
      name:  nginx-deployment-basic-hpa
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
     runOnce: false
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: false

上記の CronHPA 定義により、CronHPA は HPA の spec.minReplicasspec.maxReplicas、および status.desiredReplicas の値を読み取ることができます。また、HPA の spec.scaleTargetRef における現在のレプリカ数も把握できます。CronHPA は、HPA を調整することで HPA と連携します。CronHPA は、自身のターゲットレプリカ数と現在のレプリカ数を比較し、大きい方の値を採用してスケールアウトまたは HPA の上限を変更するかを判断します。また、CronHPA は自身のターゲットレプリカ数と HPA の設定を比較し、小さい方の値を採用して HPA の下限を変更するかを判断します。

以下の表では、さまざまなシナリオにおける CronHPA と HPA の互換性ルールを説明します。

HPA(最小/最大)

CronHPA

デプロイメント

スケーリング結果

互換性ルールの説明

1/10

5

5

  • HPA(最小/最大):1/10

  • デプロイメント:5

CronHPA のターゲットレプリカ数が現在のレプリカ数と等しい場合、HPA の最小/最大レプリカ数およびアプリケーションの現在のレプリカ数は変更されません。

1/10

4

5

  • HPA(最小/最大):1/10

  • デプロイメント:5

CronHPA のターゲットレプリカ数が現在のレプリカ数より小さい場合、現在のレプリカ数が維持されます。

1/10

6

5

  • HPA(最小/最大):6/10

  • デプロイメント:6

  • CronHPA のターゲットレプリカ数が現在のレプリカ数より大きい場合、CronHPA のターゲットレプリカ数が使用されます。

  • CronHPA のターゲットレプリカ数が HPA の最小レプリカ数(minReplicas)より大きい場合、HPA の最小レプリカ数が更新されます。

5/10

4

5

  • HPA(最小/最大):4/10

  • デプロイメント:5

  • CronHPA のターゲットレプリカ数が現在のレプリカ数より小さい場合、アプリケーションの現在のレプリカ数が維持されます。

  • CronHPA のターゲットレプリカ数が HPA の最小レプリカ数(minReplicas)より小さい場合、HPA の最小レプリカ数が更新されます。

5/10

11

5

  • HPA(最小/最大):11/11

  • デプロイメント:11

  • CronHPA のターゲットレプリカ数が現在のレプリカ数より大きい場合、CronHPA のターゲットレプリカ数が使用されます。

  • CronHPA のターゲットレプリカ数が HPA の最大レプリカ数(maxReplicas)より大きい場合、HPA の最大レプリカ数が更新されます。

以下の表では、各パラメーターを説明します。

  • HPA(最小/最大):HPA で定義された最小および最大レプリカ数。

  • CronHPA:CronHPA で設定されたレプリカ数。

  • デプロイメント:アプリケーションがスケールされる前のレプリカ数。

上記のとおり、CronHPA はデプロイメントのレプリカ数を直接調整しません。代わりに、HPA を介してデプロイメントを操作します。これにより、HPA と CronHPA の間の競合が回避されます。