HPA (Pod の水平オートスケーリング) を設定して、CPU、メモリ、またはその他のメトリクスに基づいて Pod レプリカを自動的にスケーリングします。
HPA は、需要の変動が激しいサービス、頻繁なスケーリングが必要なサービス、または多数のワークロードを持つサービスに適しており、eコマース、オンライン教育、金融サービスなどの分野で一般的に使用されています。
仕組み
HPA はコントロールループとして動作します。15 秒ごとに、コントローラーは Metrics API にクエリを実行し、使用率を目標値と比較します。Metrics API は 60 秒ごとに kubelet からデータを取得するため、HPA は実質的に 60 秒サイクルでメトリクスを評価します。
コアとなるスケーリング計算式は次のとおりです。
desiredReplicas = ceil(currentReplicas * (currentMetricValue / desiredMetricValue))
例えば、現在の CPU 使用率が 80% で目標が 50% の場合、HPA は ceil(currentReplicas * 80/50) を計算して Deployment をスケールします。10% の許容範囲がスラッシングを防ぎます。HPA は、比率が 1.0 との差が 0.1 以内である場合はスケールしません。
| 動作 | 詳細 |
|---|---|
| スケールアウト | 即座に実行されます。メトリクスが目標値 (許容範囲を含む) を超えると、HPA は直ちにレプリカ数を増やします。 |
| スケールイン | デフォルトで 5 分間のクールダウン期間があり、一時的な低下時の早期スケールインを防ぎます。 |
| 複数メトリクス | HPA は、指定されたいずれかのメトリクスがしきい値を超えた場合にスケーリングを実行します。 |
| リソースリクエストが必須 | currentUsage / requestsHPA は使用率を として計算します。リソースリクエストがない場合、HPA は使用率を計算できません。 |
詳細については、「アルゴリズムの詳細」をご参照ください。
前提条件
-
Metrics Server は、ACK コンソールの[アドオン] ページからインストールします。
ACK コンソールでの HPA 対応アプリケーションの作成
-
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター]をクリックします。
-
[クラスター] ページで、目的のクラスターを探してその名前をクリックするか、[アクション] 列の [詳細] をクリックします。
-
左側のナビゲーションペインで、[ワークロード] > [デプロイメント] を選択します。
-
[デプロイメント] ページで、[イメージから作成] をクリックします。
-
[作成] ページで、以下のセクションを設定します。
-
[基本情報]:アプリケーション名とレプリカ数を設定します。
-
[コンテナ]: イメージを選択し、CPU とメモリリソースを指定します。 > 重要: リソースリクエストを設定しないと、HPA は有効になりません。
-
[Advanced]:
-
In the [Access Control] section, click [Create] next to [Services] to configure the Service.
-
In the [Scaling] section, set [HPA] to [Enable] and configure the scaling parameters: | Parameter | Description | |-----------|-------------| | [Metrics] | Select [CPU Usage] or [Memory Usage]. Must match the resource type in [Required Resources]. If both specified, HPA scales when either exceeds its threshold. | | [Condition] | The resource usage threshold that triggers scaling. | | [Max. Replicas] | Maximum replica count. Must exceed the minimum. | | [Min. Replicas] | Minimum replica count. Integer, at least 1. |
-
-
詳細については、「イメージからステートレスアプリケーションを作成する」をご参照ください。
kubectl を使用した HPA 対応アプリケーションの作成
このセクションでは、NGINX Deployment を使用して、kubectl による HPA の設定方法を説明します。ワークロードごとに HPA は 1 つのみ作成してください。
ステップ 1:Deployment の作成
ファイル nginx.yml を作成します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9 # 実際の image_name:tag に置き換えてください。
ports:
- containerPort: 80
resources:
requests: # HPA が使用率を計算するために必要です。
cpu: 500m
コンテナには resources.requests を定義してください。HPA は、使用率を currentUsage / requests として計算します。リクエストがない場合、使用率を判断できず、スケールしません。
Deployment を適用します。
kubectl apply -f nginx.yml
ステップ 2:HPA の作成
hpa.yml という名前のファイルを作成します。 HPA は scaleTargetRef を使用して nginx デプロイメントを対象とし、平均 CPU 使用率が 50% を超えるとスケーリングします。
Kubernetes 1.24 以降 (推奨: autoscaling/v2 を使用):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx # ターゲット Deployment 名。
minReplicas: 1 # 最小レプリカ数。整数で 1 以上。
maxReplicas: 10 # 最大レプリカ数。minReplicas を超える必要があります。
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 目標平均 CPU 使用率 (リクエストに対する割合)。
Kubernetes 1.24 より前のバージョンの場合 (レガシー)
代わりに autoscaling/v2beta2 を使用してください:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50autoscaling/v2beta2は Kubernetes 1.23 で非推奨となり、1.26 で削除されます。可能な場合はautoscaling/v2にアップグレードしてください。
HPA を適用します。
kubectl apply -f hpa.yml
(オプション) 複数メトリクスの使用
CPU とメモリの両方に基づいてスケールするには、単一の HPA の metrics フィールドで両方のリソースタイプを指定し、各メトリックに対して個別の HPA を作成しないでください。HPA は、いずれかのメトリックがしきい値を超えた場合にスケールします。
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 50
HPA ステータスの確認
HPA を適用した後、最初のメトリクス収集には少し時間がかかります。この間、kubectl describe hpa は次のような警告を表示することがあります。
Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7
Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
これらの警告は、HPA がまだ初期化中であり、メトリクスがまだ利用できないことを示しています。
HPA のステータスを確認します。
kubectl get hpa
スケーリングイベントを確認します。
kubectl describe hpa nginx-hpa
HPA が正しく動作している場合、Events セクションには次のような出力が表示されます。
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 5m6s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
クリーンアップ
このチュートリアルで作成したリソースを削除するには、次のコマンドを実行してください。
kubectl delete hpa nginx-hpa
kubectl delete deployment nginx