リソース使用率の向上、リソースコストの削減、およびリソースの浪費を回避するために、Container Compute Service (ACS) は、事前定義されたスケジュールに基づいてリソースを自動的にスケーリングする ack-kubernetes-cronhpa-controller コンポーネントを提供します。このトピックでは、CronHorizontalPodAutoscaler (CronHPA) を使用して、スケジュールに基づいて ACK クラスター内のワークロードをスケーリングする方法について説明します。また、CronHPA と HorizontalPodAutoscaler (HPA) が競合なく連携できるようにする方法についても説明します。
前提条件
-
ACS クラスターが作成されていること。詳細については、ACS クラスターを作成する を参照してください。
-
kubectl クライアントがクラスターに接続されていること。詳細については、クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する を参照してください。
背景情報
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 を次の値に設定します。
|
jobs |
1つの
|
CronHPA コントローラーのインストール
次のいずれかの方法で、CronHPA コントローラー ack-kubernetes-cronhpa-controller をインストールできます。
-
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
-
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
-
アドオン管理 ページで、アプリケーションの管理 タブをクリックします。[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 ジョブを作成する方法を示します。この例では、ステートレスアプリケーションを使用します。
-
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
-
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、 を選択します。
-
展開 ページでアプリケーションを探して、詳細 列の アクション をクリックします。
-
ポッドのスケーリング タブをクリックし、スケジュールされたスケーリングジョブを設定します。
-
CronHPA コンポーネントがインストールされていない場合は、インストール ボタンが表示されます。インストール をクリックし、次の手順に進みます。
CronHPA コントローラーがインストールされている場合は、次の手順を実行します。
-
-
作成する の右側にある CronHPA をクリックします。作成する ダイアログボックスで、ジョブのパラメーターを設定します。
次の表に、パラメーターを示します。
パラメーター
説明
[ジョブ名]
CronHPA ジョブの名前を入力します。各 CronHPA ジョブの名前は一意である必要があります。
[必要なレプリカの数量]
Pod のレプリカは、スケジュールされた時刻に目標のレプリカ数までスケーリングされます。
[スケーリングスケジュール]
スケーリングスケジュールを設定します。CronHPA ジョブのスケーリングスケジュールの設定方法の詳細については、predefined-schedules をご参照ください。
CronHPA ジョブの作成または変更
-
「CronHPA ジョブの作成」の手順に従って、ポッドのスケーリング ページに移動します。
-
ポッドのスケーリング タブの CronHPA セクションで、対象のジョブを探して、ジョブの追加または変更 列の アクション をクリックします。
-
編集 ダイアログボックスで、タスクを追加する をクリックして新しいジョブを作成するか、既存のジョブをクリックして変更します。完了したら、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 を見つけ出し、この状態に基づいてワークロードオブジェクトを調整します。これにより、コントローラー間の上書きを防ぎ、スケーリングの一貫性と予測可能性を確保します。
次の 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: falseCronHPA の定義に基づき、CronHPA オブジェクトは HPA の spec.minReplicas、spec.maxReplicas、および status.desiredReplicas の値を決定できます。また、spec.scaleTargetRef で指定されたワークロードの現在のレプリカ数も認識します。CronHPA は HPA を調整することによって連携します。CronHPA は、ターゲットレプリカ数と現在のレプリカ数のうち大きい方の値を使用して、ワークロードをスケーリングするか、HPA の上限を増やすかを決定します。ターゲットレプリカ数と HPA の設定のうち小さい方の値を使用して、HPA の下限を変更するかどうかを決定します。
次の表に、CronHPA と HPA が競合せずに連携するためのルールを示します。
HPA (min/max) | CronHPA | Deployment | スケーリング結果 | 説明 |
1/10 | 5 | 5 |
| CronHPA の目標 Pod 数が現在の Pod 数と等しい場合、CronHPA は HPA 設定の Pod の最大数と最小数を変更しません。また、スケーリング操作はトリガーされません。 |
1/10 | 4 | 5 |
| CronHPA の目標 Pod 数が現在の Pod 数より少ない場合、スケーリング操作はトリガーされません。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
次のリストは、表内のパラメーターを説明しています。
HPA (min/max):HPA 設定で指定された Pod の最小数と最大数。
CronHPA:CronHPA 設定で指定された目標 Pod 数。
-
Deployment:スケーリング前のアプリケーションのレプリカ数。
CronHPA は Deployment の Pod 数を直接変更しません。代わりに、CronHPA は HPA をトリガーして Pod をスケーリングします。これにより、CronHPA と HPA の間の競合が解決されます。