リソースの利用効率を向上させ、コストを削減するため、Container Compute Service (ACS) では、`ack-kubernetes-cronhpa-controller` コンポーネントを用いた Cron 定時スケーリングをサポートしています。この機能は「Cron Horizontal Pod Autoscaler(CronHPA)」と呼ばれ、リソースの無駄を削減します。本トピックでは、ACS クラスターにおける Cron 定時コンテナー スケーリングの実装方法と、CronHPA が Horizontal Pod Autoscaler(HPA)と互換性を持つ仕組みについて説明します。
前提条件
あなたはACS クラスターを作成済みです。
kubectl を使用して Kubernetes クラスターに接続済みである必要があります。
背景情報
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 を設定します。 |
jobs | 単一の
|
CronHPA コンポーネントのインストール
以下のように `ack-kubernetes-cronhpa-controller` コンポーネントをインストールできます。
ACS コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。
[アドオン] ページで、[アプリケーション管理] タブをクリックします。ack-kubernetes-cronhpa-controller を見つけ、[インストール] をクリックします。表示されたダイアログボックスで、[OK] をクリックします。
Cron 定時コンテナー スケーリングを今後使用しない場合は、CronHPA コンポーネントを削除できます。「アドオンの管理」をご参照ください。
CronHPA の定期タスクの作成
CronHPA をアプリケーションに適用して実行する前に、クラスター内の CronHPA コンポーネントが正常に動作していること、およびアプリケーションに HPA オブジェクトが 1 つだけ存在することを確認してください。CronHPA と HPA の互換性ポリシーの詳細については、「CronHPA と HPA の互換性」をご参照ください。CronHPA タスクは、以下のいずれかの方法で作成できます。
方法 1:アプリケーション作成時に CronHPA タスクを作成
アプリケーションを作成する際、[詳細設定] ページに移動します。スケーリング設定 セクションで、[有効化] を [Cron 定時スケーリング] の横に選択し、アプリケーション向けの定期スケーリングタスクを作成します。アプリケーションの作成方法については、「ステートレスワークロード(Deployment)の作成」または「ステートフルワークロード(StatefulSet)の作成」をご参照ください。

ACS コンソールは、自動的に CronHPA コンポーネントがインストール済みかどうかを確認します。未インストールの場合は、[クリックしてインストール] というメッセージが表示されます。CronHPA コンポーネントをインストールした後、定期スケーリングタスクの設定項目が表示されます。以下の表に、各パラメーターを示します。
設定項目 | 説明 |
定期タスク名 | 定期タスクの名前を定義します。各タスクの名前は一意である必要があります。 |
ターゲットレプリカ | スケジュールされた時刻に、アプリケーションのレプリカ数がこの値に自動的にスケールされます。 |
スケジューリング周期 | スケジューリング周期を設定します。 定期スケーリングタスクのスケジューリング周期の設定方法については、「predefined-schedules」をご参照ください。 |
方法 2:既存のアプリケーション向けに CronHPA タスクを作成
以下に、既存のステートレスアプリケーション向けに CronHPA タスクを作成する手順を示します。
ACS コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[Workloads] > [Deployments] を選択します。
[ステートレス] ページで、アプリケーションの [操作] 列から [詳細] をクリックします。
[コンテナー スケーリング] タブをクリックし、定期スケーリングタスクを設定します。
CronHPA コンポーネントがインストールされていない場合、[クリックしてインストール] というメッセージが表示されます。[クリックしてインストール] をクリックし、その後の手順に進んでください。
CronHPA コンポーネントがすでにインストール済みの場合は、直ちに次の手順に進んでください。
[作成] を [Cron 定時スケーリング(CronHPA)] の横にクリックします。表示された [作成] ダイアログボックスで、定期スケーリングタスクのパラメーターを設定します。

以下の表に、設定項目を示します。
設定項目
説明
タスク名
定期タスクの名前を定義します。各タスクの名前は一意である必要があります。
ターゲットレプリカ数
スケジュールされた時刻に、アプリケーションのレプリカ数がこの値に自動的にスケールされます。
スケジューリング周期
スケジューリング周期を設定します。定期スケーリングタスクのスケジューリング周期の設定方法については、「predefined-schedules」をご参照ください。
定期スケーリングタスクの追加または変更
[CronHPA の定期タスクの作成] の手順に従い、[コンテナー スケーリング] ページに移動します。
[コンテナー スケーリング] タブの [Cron 定時スケーリング(CronHPA)] セクションで、対象のタスクを見つけ、[タスクの追加または編集] を [操作] 列からクリックします。
[編集] ダイアログボックスで、[タスクの追加] をクリックして新しいタスクを作成するか、既存の CronHPA タスクをクリックして編集します。その後、[OK] をクリックします。
説明CronHPA タスクは、以下の図に示すように削除できます。[編集] ダイアログボックスで、タスク名の右上隅にある削除アイコンをクリックし、その後 [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 は、デプロイメントや 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 を検索し、その状態に基づいてワークロードオブジェクトを調整します。これにより、上書きが防止され、スケーリング操作が一貫性と予測可能性を保証されます。
以下は、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.minReplicas、spec.maxReplicas、および status.desiredReplicas の値を読み取ることができます。また、HPA の spec.scaleTargetRef における現在のレプリカ数も把握できます。CronHPA は、HPA を調整することで HPA と連携します。CronHPA は、自身のターゲットレプリカ数と現在のレプリカ数を比較し、大きい方の値を採用してスケールアウトまたは HPA の上限を変更するかを判断します。また、CronHPA は自身のターゲットレプリカ数と HPA の設定を比較し、小さい方の値を採用して HPA の下限を変更するかを判断します。
以下の表では、さまざまなシナリオにおける CronHPA と HPA の互換性ルールを説明します。
HPA(最小/最大) | CronHPA | デプロイメント | スケーリング結果 | 互換性ルールの説明 |
1/10 | 5 | 5 |
| CronHPA のターゲットレプリカ数が現在のレプリカ数と等しい場合、HPA の最小/最大レプリカ数およびアプリケーションの現在のレプリカ数は変更されません。 |
1/10 | 4 | 5 |
| CronHPA のターゲットレプリカ数が現在のレプリカ数より小さい場合、現在のレプリカ数が維持されます。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
以下の表では、各パラメーターを説明します。
HPA(最小/最大):HPA で定義された最小および最大レプリカ数。
CronHPA:CronHPA で設定されたレプリカ数。
デプロイメント:アプリケーションがスケールされる前のレプリカ数。
上記のとおり、CronHPA はデプロイメントのレプリカ数を直接調整しません。代わりに、HPA を介してデプロイメントを操作します。これにより、HPA と CronHPA の間の競合が回避されます。