このページでは、水平ポッド オートスケーラー(HPA)を使用して、さまざまなタイプの指標で Deployment を自動スケーリングする方法について説明します。同じガイドラインに従って、任意のスケーラブルなデプロイメント オブジェクト用の HPA を構成できます。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API が有効になっていることを確認します。 Google Kubernetes Engine API の有効化
- Cloud SDK がインストール済みであることを確認します。
次のいずれかの方法で gcloud
のデフォルトの設定を指定します。
gcloud init
。デフォルトの設定全般を確認する場合に使用します。gcloud config
。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。
gcloud init の使用
エラー One of [--zone, --region] must be supplied: Please specify
location
を受信した場合は、このセクションの内容を実施します。
-
gcloud init
を実行して、次の操作を行います。gcloud init
リモート サーバーで SSH を使用している場合は、
--console-only
フラグを指定して、コマンドがブラウザを起動しないようにします。gcloud init --console-only
- 手順に従って
gcloud
を承認し、Google Cloud アカウントを使用します。 - 新しい構成を作成するか、既存の構成を選択します。
- Google Cloud プロジェクトを選択します。
- デフォルトの Compute Engine ゾーンを選択します。
gcloud config の使用
- デフォルトのプロジェクト ID を設定します。
gcloud config set project project-id
- ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
gcloud config set compute/zone compute-zone
- リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
gcloud config set compute/region compute-region
gcloud
を最新バージョンに更新します。gcloud components update
HPA オブジェクト用の API バージョン
Google Cloud Console を使用する場合、HPA オブジェクトの作成には autoscaling/v2beta2
API が使用されます。
kubectl
を使用して HPA に関する情報を作成または表示する際には、autoscaling/v1
API または autoscaling/v2beta2
API を指定できます。
apiVersion: autoscaling/v1
はデフォルトであり、CPU 使用率のみに基づく自動スケーリングを可能にします。他の指標に基づいて自動スケーリングするには、apiVersion: autoscaling/v2beta2
の使用をおすすめします。Deployment の構成の例ではapiVersion: autoscaling/v1
を使用しています。新しい HPA オブジェクトを作成するには、
apiVersion: autoscaling/v2beta2
をおすすめします。これを使用すると、カスタム指標や外部指標を含む複数の指標に基づく自動スケーリングが可能になります。このトピックのその他の例では、apiVersion: autoscaling/v2beta2
を使用しています。
サポートされている API バージョンを確認するには、kubectl api-versions
コマンドを使用します。
apiVersion: autoscaling/v2beta2
を使用する HPA の詳細情報を表示するときに、どの API を使用するかを指定できます。
サンプル Deployment の作成
HPA を作成するには、その前に、モニタリングの対象となるワークロードを作成する必要があります。このトピックの例では、下記の nginx
Deployment にさまざまな HPA 構成を適用します。それぞれの例で、リソース使用率に基づく HPA、カスタム指標または外部指標に基づく HPA、複数の指標に基づく HPA を紹介します。
以下の行を nginx.yaml
という名前のファイルに保存します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
このマニフェストは CPU リクエストの値を指定しています。リソース使用量のパーセンテージに基づいて自動スケーリングを行うには、そのリソースに対するリクエストを指定する必要があります。リクエストを指定しない場合は、リソース使用量の絶対値(CPU 使用量を表すミリ CPU など)のみに基づいて自動スケーリングを実行できます。
Deployment を作成するには、次のようにして nginx.yaml
マニフェストを適用します。
kubectl apply -f nginx.yaml
Deployment の spec.replicas
を 3 に設定しているので、3 つのポッドがデプロイされます。これを確認するには、kubectl get deployment nginx
コマンドを実行します。
このトピックの例では、それぞれ異なる HPA をサンプル nginx Deployment に適用します。
リソース使用率に基づく自動スケーリング
この例では、CPU 使用率が 50% を超えたときに nginx
Deployment を自動スケーリングする HPA オブジェクトを作成して、レプリカが常に最低 1 個、最大で 10 個存在するようにします。
CPU をターゲットとする HPA を作成するには、Cloud Console、kubectl apply
コマンド、または kubectl autoscale
コマンド(平均 CPU 使用率のみの場合)を使用できます。
Console
Cloud Console で GKE の [ワークロード] メニューに移動します。
nginx
Deployment の名前をクリックします。[操作] メニューを展開し、[自動スケーリング] を選択します。
次の値を指定します。
- ポッドの最小数: 1
- ポッドの最大数: 10
- ターゲット CPU 使用率(%): 50
[自動スケーリング] をクリックします。
kubectl apply
次の YAML マニフェストを nginx-hpa.yaml
という名前のファイルとして保存します。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
HPA を作成するには、次のコマンドを使用してマニフェストを適用します。
kubectl apply -f nginx-hpa.yaml
kubectl autoscale
平均 CPU 使用率のみをターゲットとする HPA オブジェクトを作成するには、kubectl autoscale
コマンドを使用できます。
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
クラスタ内の HPA オブジェクトのリストを取得するには、次のコマンドを使用します。
kubectl get hpa
出力は次のようになります。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 3 61s
HPA の詳細を確認するには、Cloud Console または kubectl
コマンドを使用します。
Console
Cloud Console で GKE の [ワークロード] メニューに移動します。
nginx
Deployment の名前をクリックします。ページの [オートスケーラー] セクションに HPA の構成が表示されます。
自動スケーリング イベントの詳細を [イベント] タブで確認できます。
kubectl get
HPA の詳細を確認するには、-o yaml
フラグを指定して kubectl get hpa
を実行します。status
フィールドに、現在のレプリカ数と最近の自動スケーリング イベントに関する情報が表示されます。
kubectl get hpa nginx -o yaml
出力は次のようになります。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
HPA was able to successfully calculate a replica count from cpu resource utilization
(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
desired count is within the acceptable range"}]'
autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
creationTimestamp: "2019-10-30T19:42:43Z"
name: nginx
namespace: default
resourceVersion: "220050"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 50
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 3
desiredReplicas: 3
このトピックの残りの例を実行する前に、次のようにして HPA を削除してください。
kubectl delete hpa nginx
HPA を削除しても、Deployment のレプリカの数は同じままです。Deployment は、HPA 適用前の状態に自動的に戻ることはありません。
詳細については、HPA の削除をご覧ください。
カスタム指標または外部指標に基づく自動スケーリング
カスタム指標と外部指標に基づく HPA を作成するための段階的なチュートリアルに従うことができます。
複数の指標に基づく自動スケーリング
この例では、CPU 使用率およびカスタム指標 packets_per_second
に基づいて自動スケーリングを行う HPA を作成します。
前の例で作成した nginx
という名前の HPA がまだ残っている場合は、次の例を実行する前にそれを削除してください。
この例では apiVersion: autoscaling/v2beta2
が必要です。使用可能な API の詳細については、HPA オブジェクト用の API バージョンをご覧ください。
この YAML マニフェストを nginx-multiple.yaml
という名前のファイルとして保存します。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 100Mi
# Uncomment these lines if you create the custom packets_per_second metric and
# configure your app to export the metric.
# - type: Pods
# pods:
# metric:
# name: packets_per_second
# target:
# type: AverageValue
# averageValue: 100
次のようにして YAML マニフェストを適用します。
kubectl apply -f nginx-multiple.yaml
HPA が作成されると、HPA は nginx
Deployment の平均 CPU 使用率、平均メモリ使用率、およびカスタム指標 packets_per_second
(コメント解除した場合)をモニタリングします。より大規模な自動スケーリング イベントを生じさせる値を持つ指標に基づいて、HPA は Deployment を自動スケーリングします。
HPA に関する詳細情報の表示
HPA の構成と統計情報を表示するには、次のコマンドを使用します。
kubectl describe hpa hpa-name
hpa-name は、HorizontalPodAutoscaler オブジェクトの名前に置き換えます。
apiVersion: autoscaling/v2beta2
を使用し、複数の指標に基づく HPA の場合、kubectl describe hpa
コマンドによって CPU の指標のみが表示されます。すべての指標を表示するには、代わりに次のコマンドを使用します。
kubectl describe hpa.v2beta2.autoscaling hpa-name
hpa-name は、HorizontalPodAutoscaler オブジェクトの名前に置き換えます。
各 HPA の現在のステータスが Conditions
フィールドに表示され、自動スケーリング イベントが Events
フィールドにリストされます。
出力は次のようになります。
Name: nginx
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp: Tue, 05 May 2020 20:07:11 +0000
Reference: Deployment/nginx
Metrics: ( current / target )
resource memory on pods: 2220032 / 100Mi
resource cpu on pods (as a percentage of request): 0% (0) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
HPA の削除
Cloud Console または kubectl delete
コマンドを使用して HPA を削除できます。
Console
nginx
HPA を削除するには:
Cloud Console で GKE の [ワークロード] メニューに移動します。
nginx
Deployment の名前をクリックします。[操作] メニューを展開し、[自動スケーリング] を選択します。
[オートスケーラーを無効にする] を選択します。
kubectl delete
nginx
HPA を削除するには、次のコマンドを使用します。
kubectl delete hpa nginx
HPA を削除した場合、Deployment(または他のデプロイメント オブジェクト)は既存のスケールのままになります。Deployment の元のマニフェストのレプリカ数には戻りません。手動で Deployment を再び 3 つのポッドにスケーリングするには、kubectl scale
コマンドを使用できます。
kubectl scale deployment nginx --replicas=3
クリーンアップ
HPA をまだ削除していない場合は、削除します。
kubectl delete hpa nginx
nginx
Deployment を削除します。kubectl delete deployment nginx
必要であれば、クラスタを削除します。
次のステップ
- 水平ポッド自動スケーリングの詳細を学ぶ。
- 垂直ポッドの自動スケーリングの詳細を学ぶ。
- 多次元ポッド自動スケーリングの詳細を学ぶ。
- カスタム指標に基づく Deployment の自動スケーリングの詳細を学ぶ。
- コンテナとポッドに CPU リソースを割り当てる方法を学習する。
- コンテナ リソースと Pod にメモリリソースを割り当てる方法を学習する。