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

Container Compute Service:スケジュールされたスケーリング (CronHPA)

最終更新日:Jun 21, 2026

リソース使用率の向上、リソースコストの削減、およびリソースの浪費を回避するために、Container Compute Service (ACS) は、事前定義されたスケジュールに基づいてリソースを自動的にスケーリングする ack-kubernetes-cronhpa-controller コンポーネントを提供します。このトピックでは、CronHorizontalPodAutoscaler (CronHPA) を使用して、スケジュールに基づいて ACK クラスター内のワークロードをスケーリングする方法について説明します。また、CronHPA と HorizontalPodAutoscaler (HPA) が競合なく連携できるようにする方法についても説明します。

前提条件

背景情報

ack-kubernetes-cronhpa-controller は、cron のようなスケジュールに基づいてクラスター内のワークロードをスケーリングする Kubernetes コントローラーです。CronHPA は、Deployment や StatefulSet など、scale サブリソースをサポートする任意の Kubernetes オブジェクトで使用できます。詳細については、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 を有効にできます。

excludeDates

excludeDates の値には、日付の配列を指定します。スケーリングジョブは、excludeDates で指定された日付には実行されません。

説明

除外できる最小時間単位は[]です。

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

たとえば、11月15日にスケーリングジョブを実行したくない場合は、excludeDates を次の値に設定します。

excludeDates:
  - "* * * 15 11 *"

jobs

1つの spec 内に複数の CronHPA ジョブを定義できます。各ジョブは、次のフィールドで設定できます。

  • name:名前は CronHPA ジョブを区別するために使用されます。したがって、各 CronHPA ジョブの name は、CronHPA 設定内で一意にする必要があります。

  • schedule:スケーリングスケジュール。crontab に似ています。kubernetes-cronhpa-controller は Golang ライブラリを使用してさまざまなルールをサポートします。詳細については、go-cron をご参照ください。cron 式のフォーマットは、次のルールに準拠する必要があります。準拠していない場合、cron 式を作成できません。

    次のルールに基づいて cron 式を作成します。

    フィールド名 | 必須 | 許容値        | 使用可能な特殊文字
      ----------   | ---- | --------------  | --------------------------
      秒           | はい | 0-59            | * / , -
      分           | はい | 0-59            | * / , -
      時           | はい | 0-23            | * / , -
      日           | はい | 1-31            | * / , - ?
      月           | はい | 1-12 or JAN-DEC | * / , -
      曜日         | はい | 0-6 or SUN-SAT  | * / , - ?
  • targetSize:スケジュールされた時刻にスケールする Pod の目標数です。

  • runOncerunOncetrue に設定すると、ジョブは 1 回だけ実行されます。ジョブは 1 回実行されると終了します。

CronHPA コントローラーのインストール

次のいずれかの方法で、CronHPA コントローラー ack-kubernetes-cronhpa-controller をインストールできます。

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

  2. クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。

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

説明

CronHPA を使用しなくなった場合は、CronHPA コントローラーをアンインストールできます。ack-kubernetes-cronhpa-controller のアンインストール方法の詳細については、「アドオンの管理」をご参照ください。

CronHPA ジョブの作成

アプリケーション用に CronHPA ジョブを作成して実行する前に、CronHPA コントローラーがクラスターで正常に動作していること、およびアプリケーションに対して HPA タスクが 1 つだけ作成されていることを確認してください。CronHPA と HPA を競合なく連携させる方法の詳細については、「CronHPA と HPA の競合を回避した連携」をご参照ください。次のいずれかの方法で CronHPA ジョブを作成できます。

方法1:アプリケーション作成時のジョブ作成

アプリケーション作成ウィザードの 上級 ページの スケーリング セクションで、有効にする の横にある CronHPA を選択します。アプリケーションの作成に関する詳細な手順については、「ステートレスワークロード (Deployment) の作成」または「ステートフルワークロード (StatefulSet) の作成」をご参照ください。

ack-kubernetes-cronhpa-controller コンポーネントがインストールされていないというプロンプトが表示された場合は、[Install] をクリックしてインストールします。

ACK コンソールでは、CronHPA コンポーネントがインストールされているかどうかが自動的にチェックされます。インストールされていない場合は、インストール ボタンが表示されます。CronHPA コンポーネントをインストールすると、スケジュールされたスケーリングジョブの設定が表示されます。次の表に、パラメーターを示します。

パラメーター

説明

[Job Name]

CronHPA ジョブの名前を入力します。各 CronHPA ジョブの名前は一意である必要があります。

[必要なレプリカの数量]

Pod のレプリカは、スケジュールされた時刻に目標のレプリカ数までスケーリングされます。

[スケーリングスケジュール]

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

CronHPA ジョブのスケーリングスケジュールの設定方法の詳細については、predefined-schedules をご参照ください。

方法2:既存のアプリケーションに対するジョブの作成

次の例では、既存のアプリケーションに対して CronHPA ジョブを作成する方法を示します。この例では、ステートレスアプリケーションを使用します。

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

  2. クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、ワークロード > デプロイメント を選択します。

  3. 展開 ページでアプリケーションを探して、詳細 列の アクション をクリックします。

  4. ポッドのスケーリング タブをクリックし、スケジュールされたスケーリングジョブを設定します。

    • CronHPA コンポーネントがインストールされていない場合は、インストール ボタンが表示されます。インストール をクリックし、次の手順に進みます。

    • CronHPA コントローラーがインストールされている場合は、次の手順を実行します。

  5. 作成する の右側にある CronHPA をクリックします。作成する ダイアログボックスで、ジョブのパラメーターを設定します。

    次の表に、パラメーターを示します。

    パラメーター

    説明

    [ジョブ名]

    CronHPA ジョブの名前を入力します。各 CronHPA ジョブの名前は一意である必要があります。

    [必要なレプリカの数量]

    Pod のレプリカは、スケジュールされた時刻に目標のレプリカ数までスケーリングされます。

    [スケーリングスケジュール]

    スケーリングスケジュールを設定します。CronHPA ジョブのスケーリングスケジュールの設定方法の詳細については、predefined-schedules をご参照ください。

CronHPA ジョブの作成または変更

  1. CronHPA ジョブの作成」の手順に従って、ポッドのスケーリング ページに移動します。

  2. ポッドのスケーリング タブの CronHPA セクションで、対象のジョブを探して、ジョブの追加または変更 列の アクション をクリックします。

  3. 編集 ダイアログボックスで、タスクを追加する をクリックして新しいジョブを作成するか、既存のジョブをクリックして変更します。完了したら、OK をクリックします。

    ジョブ設定フォームには、ジョブ名目標レプリカ数、および スケーリングスケジュール (5つの方法をサポート:[By Hour][By Day][By Week][By Month]、または [cron expression]) のフィールドが含まれています。[cron expression] を選択した場合は、入力ボックスに Seconds Minutes Hours Day-of-month Month Day-of-week の形式で式を入力します (例:1 2 3 4 * * は毎月 4 日の 03:02:01 を意味します)。

    説明

    CronHPA ジョブは削除できます。編集 ダイアログボックスでは、既存のジョブがタグとして表示されます。ジョブ名の横にある削除アイコンをクリックすると、ジョブを削除できます。新しいジョブを追加するには、[Job Name] 入力ボックスに名前を入力し、[Add Job] をクリックします。変更が完了したら、OK をクリックします。

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 は、Deployment や StatefulSet などのワークロードに適用されます。CronHPA と HPA を同時に使用してワークロードをスケーリングすると、競合が発生する可能性があります。この競合を解決するために、CronHPA では HPA をスケーリング対象のオブジェクトとして使用でき、HPA の機能と互換性があります。

CronHPA と HPA の設定から、以下のことがわかります。

  • CronHPA と HPA はどちらも spec.scaleTargetRef フィールドを使用してスケーリングターゲットを識別します。

  • CronHPA は、spec.jobs 内の crontab ルールを使用してレプリカのスケーリングをスケジュールします。

  • HPA はリソース使用量に基づいてスケーリングアクティビティをトリガーします。

scaleTargetRef で指定された同じアプリケーションに対して CronHPA と HPA の両方がデプロイされている場合、CronHPA と HPA が Pod をスケーリングする可能性があります。CronHPA と HPA は独立しており、互いを認識しません。そのため、CronHPA コントローラーと HPA コントローラーは、アプリケーションの Pod を個別にスケーリングします。後のスケーリング操作が、先の操作を上書きしてしまいます。

CronHPA と HPA の互換性ソリューション

前述のように、CronHPA が HPA の現在の状態を認識できれば、この競合は解決できます。これを実現するために、ACK は CronHPA の scaleTargetRef を、最終的なワークロードオブジェクトではなく、HPA オブジェクト自体を指すように設定します。スケーリング操作を実行する際、CronHPA はまず HPA オブジェクトを介して実際の scaleTargetRef を見つけ出し、この状態に基づいてワークロードオブジェクトを調整します。これにより、コントローラー間の上書きを防ぎ、スケーリングの一貫性と予測可能性を確保します。

image

次の YAML テンプレートは、CronHPA と HPA が競合なく連携できるようにするための設定を示しています。

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 の値を決定できます。また、spec.scaleTargetRef で指定されたワークロードの現在のレプリカ数も認識します。CronHPA は HPA を調整することによって連携します。CronHPA は、ターゲットレプリカ数と現在のレプリカ数のうち大きい方の値を使用して、ワークロードをスケーリングするか、HPA の上限を増やすかを決定します。ターゲットレプリカ数と HPA の設定のうち小さい方の値を使用して、HPA の下限を変更するかどうかを決定します。

次の表に、CronHPA と HPA が競合せずに連携するためのルールを示します。

HPA (min/max)

CronHPA

Deployment

スケーリング結果

説明

1/10

5

5

  • HPA (min/max): 1/10

  • Deployment: 5

CronHPA の目標 Pod 数が現在の Pod 数と等しい場合、CronHPA は HPA 設定の Pod の最大数と最小数を変更しません。また、スケーリング操作はトリガーされません。

1/10

4

5

  • HPA (min/max): 1/10

  • Deployment: 5

CronHPA の目標 Pod 数が現在の Pod 数より少ない場合、スケーリング操作はトリガーされません。

1/10

6

5

  • HPA (min/max): 6/10

  • Deployment: 6

  • CronHPA の目標 Pod 数が現在の Pod 数より多い場合、CronHPA は目標数に達するまで Pod を追加します。

  • CronHPA の目標 Pod 数が HPA 設定の minReplicas の値より大きい場合、CronHPA は minReplicas の値を変更します。

5/10

4

5

  • HPA (min/max): 4/10

  • Deployment: 5

  • CronHPA の目標 Pod 数が現在の Pod 数より少ない場合、スケーリング操作はトリガーされません。

  • CronHPA の目標 Pod 数が HPA 設定の minReplicas の値より少ない場合、CronHPA は minReplicas の値を変更します。

5/10

11

5

  • HPA (min/max): 11/11

  • Deployment: 11

  • CronHPA の目標 Pod 数が現在の Pod 数より多い場合、CronHPA は目標数に達するまで Pod を追加します。

  • CronHPA の目標 Pod 数が HPA 設定の maxReplicas の値より大きい場合、CronHPA は maxReplicas の値を変更します。

次のリストは、表内のパラメーターを説明しています。

  • HPA (min/max):HPA 設定で指定された Pod の最小数と最大数。

  • CronHPA:CronHPA 設定で指定された目標 Pod 数。

  • Deployment:スケーリング前のアプリケーションのレプリカ数。

CronHPA は Deployment の Pod 数を直接変更しません。代わりに、CronHPA は HPA をトリガーして Pod をスケーリングします。これにより、CronHPA と HPA の間の競合が解決されます。