リソース使用率を向上させ、リソースコストを削減し、リソースの無駄を避けるために、Container Compute Service (ACS)は、事前定義されたスケジュールに基づいてリソースを自動的にスケーリングするack-kubernetes-cronhpa-controllerコンポーネントを提供します。このトピックでは、Cron Horizontal Pod Autoscaler(CronHPA)を使用して、スケジュールに基づいてACSクラスタ内のワークロードをスケーリングする方法について説明します。また、CronHPAとHorizontal Pod Autoscaler(HPA)を競合なく連携させる方法についても説明します。
前提条件
ACSクラスタが作成されていること。詳細については、ACSクラスタの作成を参照してください。
kubectlクライアントがクラスタに接続されていること。詳細については、クラスタのkubeconfigファイルを取得し、kubectlを使用してクラスタに接続するを参照してください。
背景情報
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を次の値に設定します。
|
jobs |
|
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ジョブを作成する
スケーリングセクションの詳細設定ウィザードページで、CronHPAの右側にある有効にするを選択して、アプリケーションのCronHPAジョブを作成します。 アプリケーションの作成方法の詳細については、Deploymentを使用してステートレスアプリケーションを作成するまたはStatefulSetを使用してステートフルアプリケーションを作成するを参照してください。
ACSコンソールは、CronHPAコントローラがクラスタにインストールされているかどうかを自動的にチェックします。 CronHPAコントローラがインストールされていない場合、ページにインストールボタンが表示されます。 CronHPAコントローラがインストールされると、ページにCronHPAパラメータが表示されます。 次の表に、パラメータを示します。
パラメータ | 説明 |
ジョブ名 | CronHPAジョブの名前を入力します。 各CronHPAジョブの名前は一意である必要があります。 |
必要なレプリカ数 | スケジュールされた時刻に、複製されたPodが目的の数にスケーリングされます。 |
スケーリングスケジュール | スケーリングスケジュールを設定します。 CronHPAジョブのスケーリングスケジュールを設定する方法の詳細については、事前定義されたスケジュールを参照してください。 |
方法2:既存のアプリケーションのcronhpaジョブを作成する
次の例は、既存のアプリケーションのCronHPAジョブを作成する方法を示しています。 この例では、ステートレスアプリケーションを使用します。
ACSコンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけて、そのIDをクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。Deploymentページで、管理するアプリケーションを見つけて、詳細アクション列のをクリックします。
Podスケーリングタブをクリックし、CronHPAジョブを設定します。
CronHPAコントローラがインストールされていない場合、ページにインストールボタンが表示されます。 インストールをクリックし、次の手順を実行します。
CronHPAコントローラがインストールされている場合は、次の手順を実行します。
作成の右側にあるCronHPAをクリックします。 作成ダイアログボックスで、CronHPAジョブのパラメータを設定します。
次の表に、パラメータを示します。
パラメータ
説明
ジョブ名
CronHPAジョブの名前を入力します。 各CronHPAジョブの名前は一意である必要があります。
必要なレプリカ数
スケジュールされた時刻に、複製されたPodが目的の数にスケーリングされます。
スケーリングスケジュール
スケーリングスケジュールを設定します。 CronHPAジョブのスケーリングスケジュールを設定する方法の詳細については、事前定義されたスケジュールを参照してください。
CronHPAジョブを作成または変更する
前のポッドスケーリングCronHPAジョブを作成するセクションで説明されている手順を実行して、タブに移動します。
Podスケーリングタブで、CronHPAセクションで作成したCronHPAジョブを見つけて、ジョブの追加または変更アクション列のをクリックします。
編集ダイアログボックスで、ジョブを追加をクリックして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/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.minReplicas
、spec.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 |
| 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(最小/最大):HPA構成で指定されたPodの最小数と最大数。
CronHPA:CronHPA構成で指定された必要なPod数。
Deployment:アプリケーションにプロビジョニングされている現在のPod数。
CronHPAは、DeploymentのPod数を直接変更しません。 代わりに、CronHPAはHPAをトリガーしてPodをスケーリングします。 これにより、CronHPAとHPAの競合が解決されます。