CronHPA が Deployment を直接スケーリングする代わりに、HPA の minReplicas と maxReplicas を調整するように設定します。
Container Service for Kubernetes (ACK) コンソールを介して HPA と CronHPA をデプロイする場合、ACK が自動的に設定を行うため、このトピックを参照する必要はありません。
仕組み
デフォルトでは、CronHPA と HPA はどちらも scaleTargetRef を同じ Deployment に設定します。最後に動作した方が、もう一方の結果を上書きします。
この問題を解決するには、CronHPA の scaleTargetRef を Deployment ではなく HPA リソースに設定します。この設定により、次のようになります。
-
CronHPA は、動作する前に HPA の
minReplicas、maxReplicas、およびdesiredReplicasを読み取ります。 -
CronHPA は、スケジュールされた
targetSizeに基づいて、HPA のminReplicasまたはmaxReplicasを調整します。 -
HPA は、Deployment とその ReplicaSet を介して Pod をスケーリングします。
CronHPA は Pod 数を直接変更しないため、競合が解消されます。
HPA をターゲットとする CronHPA の設定
典型的なセットアップでは、CronHPA と HPA はどちらも同じ Deployment を参照します。
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: hpa-sample
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 マニフェストの scaleTargetRef を変更して、HPA リソースを参照するようにします。
| フィールド | 変更前 | 変更後 |
|---|---|---|
apiVersion |
apps/v1 |
autoscaling/v2 |
kind |
Deployment |
HorizontalPodAutoscaler |
name |
nginx-deployment-basic |
hpa-sample |
例:業務時間中のトラフィックをスケーリングするように設定された CronHPA
hpa-sample が 09:00 から 17:00 (UTC+8) までのトラフィックを管理すると仮定します。09:00 にスケールアウトし、17:00 にスケールインするように CronHPA を設定します。
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
spec:
scaleTargetRef:
apiVersion: autoscaling/v2
# リソースタイプを HPA に設定します。
kind: HorizontalPodAutoscaler
# HPA リソースの名前を指定します。
name: hpa-sample
jobs:
- name: "scale-up-9am"
schedule: "0 0 9 * * * "
targetSize: 20
runOnce: false
- name: "scale-down-5pm"
schedule: "0 0 17 * * *"
targetSize: 3
runOnce: false
互換性ルール
CronHPA が HPA をターゲットにすると、レプリカ数の動的な下限として機能します。つまり、Pod 数を直接設定するのではなく、minReplicas を引き上げてスケールアウトし、minReplicas を引き下げてスケールインします。HPA は、メトリクスに基づいてこれらの境界内でスケーリングを行います。
次の表は、各スケーリング条件下で CronHPA と HPA がどのように相互作用するかを示しています。
テーブルヘッダー:
-
HPA (min/max): HPA の
minReplicas/maxReplicas。 -
CronHPA の desired: CronHPA Job の
targetSize。 -
現在のレプリカ数: 実行中の Pod 数。
-
最終的なレプリカ数: スケーリング後の Pod 数。
| HPA (min/max) | CronHPA の desired | 現在のレプリカ数 | 最終的なレプリカ数 | 動作 |
|---|---|---|---|---|
| 1/10 | 5 | 5 | 5 | desired が現在値と等しい。minReplicas と maxReplicas は変更されません。スケーリングは行われません。 |
| 1/10 | 4 | 5 | 5 | desired が現在値より小さい。スケーリングは行われません。CronHPA は minReplicas を 4 に設定します。新しい HPA (min/max):4/10。 |
| 1/10 | 6 | 5 | 6 | desired が現在値を超えます。CronHPA は minReplicas を 6 に設定します。HPA は 6 にスケーリングします。新しい HPA (min/max):6/10。 |
| 5/10 | 4 | 5 | 5 | desired が現在値より小さい。スケーリングは行われません。CronHPA は minReplicas を 4 に設定します。新しい HPA (min/max):4/10。 |
| 5/10 | 11 | 5 | 11 | desired が maxReplicas を超えます。CronHPA は minReplicas と maxReplicas の両方を 11 に設定します。HPA は 11 にスケーリングします。新しい HPA (min/max):11/11。 |