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

Container Service for Kubernetes:CronHPA を使用したスケジュールされた水平スケーリング

最終更新日:Nov 09, 2025

アプリケーションのリソース使用率が定期的に変化し、Crontab のようなスケジュールに基づいて Pod をスケーリングする必要がある場合は、Cron Horizontal Pod Autoscaler (CronHPA) を使用してスケジュールされたスケーリングを実現できます。CronHPA は、ビジネストラフィックに大きなピーク期間があるシナリオや、スケジュールされたタスクに適しています。

お読みになる前のヒント

ACK クラスターは、さまざまな ワークロードスケーリング (スケジューリングレイヤーの弾力性) と ノードスケーリング (リソースレイヤーの弾力性) のソリューションを提供します。このトピックをご利用になる前に、「Auto Scaling」をお読みいただき、さまざまなソリューションの適用シナリオと制限についてご理解いただくことをお勧めします。

CronHPA テンプレートとパラメーター

CronHPA は kubernetes-cronhpa-controller に基づいて実装されています。kubernetes-cronhpa-controller は、Crontab のような構文を使用してスケジュールされたスケーリングポリシーを設定する、時間ベースの Pod 水平スケーリングコントローラーであり、周期的なトラフィックパターンを持つシナリオでの動的なリソース調整を可能にします。CronHPA は、Deployment や StatefulSet など、スケーリングサブリソース (Scale Subresource) をサポートする任意の Kubernetes オブジェクトに適用できます。

例とパラメーターを展開して表示

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:                 # タスク除外日 (Cron フォーマット)、これらの日付ではスケーリングは実行されません
  - "* * * 15 11 *"             # 11月15日を除外
  - "* * * * * 5"               # 金曜日を除外
  jobs:
  - name: "scale-down"
    schedule: "30 */1 * * * *"  # 毎分 30 秒にトリガー (例: 08:00:30, 08:01:30)
    targetSize: 1               # ターゲットレプリカ数
    runOnce: false              # タスク実行モード (一度だけ実行するかどうか)、デフォルトは false
  - name: "scale-up"
    schedule: "0 */1 * * * *"  # 毎分 0 秒にトリガー (例: 08:00:00, 08:01:00)
    targetSize: 3              # ターゲットレプリカ数
    runOnce: false             

次の表に、CronHPA 構成のパラメーターを説明します。

パラメーター

説明

scaleTargetRef

スケーリングするオブジェクトを指定します。オブジェクトが スケーリングサブリソース (Scale Subresource) をサポートしている場合、CronHPA はそれをサポートできます。

excludeDates

日付の配列。タスクは、excludeDates の記述に一致する日付ではスキップされます。単位: 日。

"* * * * * *" は「<秒> <分> <時> <日> <月> <曜日>」を表します。

11月15日のタスクを除外したい場合は、次の例のように excludeDates を指定します。

excludeDates:
  - "* * * 15 11 *"

jobs

spec セクションで複数の CronHPA ジョブを設定できます。各 CronHPA ジョブは、次のフィールドで構成できます:

  • name: CronHPA ジョブの名前。

  • schedule: kubernetes-cronhpa-controller (go-cron ライブラリに基づく) の構文は標準の Crontab に似ていますが、より柔軟な式をサポートしています。以下のフォーマット記述に厳密に従って設定してください。

    Cron 式のフォーマットは次のとおりです:

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

  • runOnce: true に設定すると、タスクは一度だけ実行され、最初の実行後に終了します。

ステップ 1: CronHPA コンポーネントをインストールする

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

  2. クラスター ページで、管理したいクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. [アプリケーションの管理] タブをクリックし、[ack-kubernetes-cronhpa-controller] を見つけて、ページのプロンプトに従ってコンポーネントのインストールを完了します。

ステップ 2: CronHPA ジョブを作成する

アプリケーションの CronHPA ジョブを作成する前に、クラスター内の CronHPA コンポーネントが正常に実行されていること、および現在のアプリケーションに対して HPA タスクオブジェクトが 1 つしかないことを確認してください。次の例では、ステートレスアプリケーションに対して CronHPA ジョブを有効にする方法を示します。他の種類のワークロードの手順も同様です。

アプリケーション作成時に CronHPA ジョブを作成する

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

  2. クラスター ページで、管理したいクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、ワークロード > 展開 を選択します。

  3. [デプロイメント] ページで、[イメージから作成] をクリックします。

  4. [作成] ページで、ページのプロンプトに従って、基本的なアプリケーション情報の設定、コンテナーの設定、サービスの設定、およびスケジュールされたスケーリングの設定を完了し、CronHPA をサポートする Deployment を作成します。

    ステップとパラメーターの詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。次のリストに、主要なパラメーターを説明します。

    • 基本情報: アプリケーションの名前やレプリカ数などの基本情報を設定します。

    • コンテナー: コンテナーが必要とするイメージ、CPU、およびメモリリソースを設定します。

    • 詳細設定:

      • [アクセス制御] セクションで、[作成] に対応する [サービス] をクリックしてサービスを設定します。

      • [スケーリング] セクションで、[有効化][CronHPA] をチェックし、ページのプロンプトに従ってコンポーネントをインストールし (すでにインストールされている場合は無視)、スケジュールされたスケーリングの条件とパラメーターを設定します。

        • ジョブ名: CronHPA ジョブの名前。

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

        • スケーリングスケジュール: スケジューリング期間を設定します。詳細については、「Kubernetes CronHPA Controller」をご参照ください。

既存のアプリケーションに CronHPA ジョブを作成する

ワークロードページで作成

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

  2. クラスター ページで、管理したいクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、ワークロード > 展開 を選択します。

  3. ターゲットのワークロードをクリックし、[Pod スケーリング] タブをクリックします。[CronHPA] セクションで、[作成] をクリックして CronHPA を設定します。

    create

    パラメーター

    説明

    ジョブ名

    CronHPA ジョブの名前。

    希望するレプリカ数

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

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

    設定されたスケジューリング期間。CronHPA ジョブのスケジューリング期間の設定に関する詳細については、「AliyunContainerService/kubernetes-cronhpa-controller」をご参照ください。

ワークロードスケーリングページで作成

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

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[ワークロードスケーリング] をクリックします。

  3. ページの右上隅にある [Auto Scaling の作成] をクリックします。

  4. [HPA と CronHPA] タブをクリックし、[ターゲットワークロードの選択] をクリックします。[スケーリングポリシーの設定] セクションで、[CronHPA] をチェックします。

    複数の CronHPA ジョブを追加できます。ページのプロンプトに従って CronHPA ポリシー情報を設定し、[OK] をクリックします。

    • CronHPA 名: CronHPA の名前を入力します。

    • ジョブ名: CronHPA ジョブの名前を入力します。

    • 希望するレプリカ数: スケジュールされた時刻に達したときのターゲットレプリカ数を設定します。

    • スケーリングスケジュール: スケジューリング期間を設定します。詳細については、「Kubernetes CronHPA Controller」をご参照ください。

kubectl を使用する

  1. 次の内容を作成し、cronhpa.yaml ファイルにコピーします。

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      name: cronhpa-sample
      namespace: default 
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment-basic  
      excludeDates:                 
      - "* * * 15 11 *"
      - "* * * * * 5"
      jobs:
      - name: "scale-down"
        schedule: "30 */1 * * * *"  
        targetSize: 1  
        runOnce: false              
      - name: "scale-up"
        schedule: "0 */1 * * * *"  
        targetSize: 3              
        runOnce: true         
  2. 次のコマンドを実行して、既存のワークロードに対して CronHPA ジョブを作成します。

    kubectl apply -f cronhpa.yaml

    期待される結果:

    cronhorizontalpodautoscaler.autoscaling.alibabacloud.com/cronhpa-sample created

関連操作

CronHPA ジョブの表示、追加、または変更

CronHPA ジョブを作成した後、CronHPA リストで CronHPA ジョブのステータスとリストを表示できます。 次のエントリポイントから CronHPA ジョブを追加したり、既存の CronHPA 構成を変更したりできます。

  • Workload Scaling エントリポイント

    1. クラスター ページで、対象のクラスターを見つけてその名前をクリックします。 左側のナビゲーションウィンドウで、[Workload Scaling] をクリックします。

    2. [CronHPA] タブをクリックし、対象の CronHPA ジョブの [アクション] 列にある [編集] をクリックします。

  • Workloads エントリポイント (ステートレスアプリケーションを例として使用します。他のタイプのワークロードの手順も同様です)

    1. クラスター ページで、管理するクラスターを見つけてその名前をクリックします。 左側のナビゲーションウィンドウで、ワークロード > 展開 を選択します。

    2. [デプロイメント] ページで、対象の Deployment の [アクション] 列にある [詳細] をクリックします。 次に、[Pod スケーリング] タブをクリックします。 CronHPA セクションで、[アクション] 列にある [ジョブの追加または編集] をクリックします。

CronHPA と HPA 間の連携の実装

Cron Horizontal Pod Autoscaler (HPA) と Horizontal Pod Autoscaler (HPA) は互いを認識しません。 アプリケーションに CronHPA と HPA の両方が設定されている場合、CronHPA と HPA はアプリケーションを個別にスケーリングします。 この場合、後のスケーリングアクティビティが前のスケーリングアクティビティを上書きします。 この問題を解決するために、Container Service for Kubernetes (ACK) は、CronHPA が競合することなく HPA と連携するためのソリューションを提供します。 ACK が CronHPA と HPA の両方がデプロイされていることを検出すると、ACK は HPA を CronHPA のスケーリングオブジェクトとして設定します。 CronHPA は、スケジュールされた時間に HPA をトリガーして、HPA によってスケーリングされるオブジェクト (Deployment など) をスケーリングします。

詳細については、「CronHPA と HPA 間の連携の実装」をご参照ください。