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

Container Compute Service:CronHPA

最終更新日:Dec 27, 2024

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

前提条件

背景情報

kubernetes-cronhpa-controllerは、crontabに似たスケジュールに基づいてKubernetesクラスタ内のPodをスケーリングできるKubernetes HPAコントローラです。CronHPAは、DeploymentやStatefulSetなど、サブリソースをscaledできる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で指定された日付には、スケーリングジョブは実行されません。

説明

最小期間は1日です。

値の形式は"* * * * * *"で、「<秒> <分> <時> <日> <月> <曜日>」を表します。

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

excludeDates:
  - "* * * 15 11 *"

jobs

specセクションには、複数のCronHPAジョブを設定できます。各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 または JAN-DEC | * / , -
      曜日  | はい        | 0-6 または 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ジョブを作成する

スケーリングセクションの詳細設定ウィザードページで、CronHPAの右側にある有効にするを選択して、アプリケーションのCronHPAジョブを作成します。 アプリケーションの作成方法の詳細については、Deploymentを使用してステートレスアプリケーションを作成するまたはStatefulSetを使用してステートフルアプリケーションを作成するを参照してください。

image.png

ACSコンソールは、CronHPAコントローラがクラスタにインストールされているかどうかを自動的にチェックします。 CronHPAコントローラがインストールされていない場合、ページにインストールボタンが表示されます。 CronHPAコントローラがインストールされると、ページにCronHPAパラメータが表示されます。 次の表に、パラメータを示します。

パラメータ

説明

ジョブ名

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

必要なレプリカ数

スケジュールされた時刻に、複製されたPodが目的の数にスケーリングされます。

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

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

CronHPAジョブのスケーリングスケジュールを設定する方法の詳細については、事前定義されたスケジュールを参照してください。

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

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

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

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

  3. Deploymentページで、管理するアプリケーションを見つけて、詳細アクション列のをクリックします。

  4. Podスケーリングタブをクリックし、CronHPAジョブを設定します。

    • CronHPAコントローラがインストールされていない場合、ページにインストールボタンが表示されます。 インストールをクリックし、次の手順を実行します。

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

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

    create

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

    パラメータ

    説明

    ジョブ名

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

    必要なレプリカ数

    スケジュールされた時刻に、複製されたPodが目的の数にスケーリングされます。

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

    スケーリングスケジュールを設定します。 CronHPAジョブのスケーリングスケジュールを設定する方法の詳細については、事前定義されたスケジュールを参照してください。

CronHPAジョブを作成または変更する

  1. 前のポッドスケーリングCronHPAジョブを作成するセクションで説明されている手順を実行して、タブに移動します。

  2. Podスケーリングタブで、CronHPAセクションで作成したCronHPAジョブを見つけて、ジョブの追加または変更アクション列のをクリックします。

  3. 編集ダイアログボックスで、ジョブを追加をクリックしてCronHPAジョブを作成します。 既存の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/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
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の構成は、次の情報を示しています。

  • spec.scaleTargetRefフィールドは、CronHPAとHPAの両方の構成で使用され、スケーリング対象のオブジェクトを指定します。

  • CronHPA構成のspec.jobsセクションのcrontabルールは、スケジュールされた時刻にPodをスケーリングする数を指定します。

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

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

解決策

競合を避けるために、CronHPAはHPAの状態を検出するだけで済みます。 ACSは、ターゲットワークロードではなくHPAにscaleTargetRefを設定することにより、CronHPA構成を変更します。 CronHPAがスケーリング操作を実行する場合、最初にHPA構成でscaleTargetRefで指定されたアプリケーションを見つけ、次にワークロードを調整します。 これにより、構成の上書きが回避され、スケーリング操作の一貫性と予測可能性が確保されます。

次の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

上記のYAMLテンプレートをデプロイすると、CronHPAはHPA構成のspec.minReplicasspec.maxReplicas、およびstatus.desiredReplicasの値を認識します。 また、CronHPAは、HPA構成のspec.scaleTargetRefで指定されたReplicasの値も認識します。 CronHPAは、HPA構成を変更することでHPAの状態を検出できます。 CronHPAは、必要なPod数と現在のPod数を比較し、スケーリングアクティビティをトリガーしてHPA構成のPodの最大数を変更するかどうかを判断します。 また、CronHPAは、必要なPod数とHPA構成で指定されたPodの最大数と最小数を比較し、HPA構成のPodの最小数を変更するかどうかを判断します。

次の表に、CronHPAとHPAを競合なく連携させるルールを示します。

HPA(最小/最大)

CronHPA

Deployment

スケーリング結果

説明

1/10

5

5

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

  • Deployment:5

CronHPAが必要とするPod数が現在のPod数と同じ場合、CronHPAはHPA構成のPodの最大数と最小数を変更しません。 また、スケーリングアクティビティはトリガーされません。

1/10

4

5

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

  • Deployment:5

CronHPAが必要とするPod数が現在のPod数よりも少ない場合、スケーリングアクティビティはトリガーされません。

1/10

6

5

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

  • Deployment:6

  • CronHPAが必要とするPod数が現在のPod数よりも多い場合、CronHPAは必要な数に達するまでPodを追加します。

  • CronHPAが必要とするPod数がHPA構成のminReplicasの値よりも大きい場合、CronHPAはminReplicasの値を変更します。

5/10

4

5

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

  • Deployment:5

  • CronHPAが必要とするPod数が現在のPod数よりも少ない場合、スケーリングアクティビティはトリガーされません。

  • CronHPAが必要とするPod数がHPA構成のminReplicasの値よりも少ない場合、CronHPAはminReplicasの値を変更します。

5/10

11

5

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

  • Deployment:11

  • CronHPAが必要とするPod数が現在のPod数よりも多い場合、CronHPAは必要な数に達するまでPodを追加します。

  • CronHPAが必要とするPod数がHPA構成のmaxReplicasの値よりも大きい場合、CronHPAはmaxReplicasの値を変更します。

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

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

  • CronHPA:CronHPA構成で指定された必要なPod数。

  • Deployment:アプリケーションにプロビジョニングされている現在のPod数。

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