このページでは、Google Kubernetes Engine(GKE)でデプロイされたアプリケーションをスケーリングする方法について説明します。
概要
GKE でアプリケーションをデプロイするときには、実行する予定のアプリケーション レプリカの数を定義します。アプリケーションをスケールすると、レプリカの数は増減します。
アプリケーションの各レプリカは、アプリケーションのコンテナをカプセル化する Kubernetes ポッドを表します。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
アプリケーションを検査する
アプリケーションのスケーリングの前に、アプリケーションを検査し、正常であることを確認する必要があります。
クラスタにデプロイされたすべてのアプリケーションを表示するには、次のコマンドを実行します。
kubectl get CONTROLLER
CONTROLLER
は、deployments
、statefulsets
、または別のコントローラ オブジェクト タイプに置き換えます。
たとえば、Deployment を 1 つだけ作成済みの場合、kubectl get deployments
を実行すると、コマンドの出力は次のようになります。
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
my-app 1 1 1 1 10m
このコマンドの出力はすべてのオブジェクトで類似していますが、若干異なる場合があります。Deployment の場合、出力は次の 6 つの列で構成されます。
NAME
には、クラスタ内の Deployment の名前が一覧表示されます。DESIRED
には、アプリケーションで想定される適切なレプリカ数、つまり望ましい状態が表示されます。この値は Deployment の作成時に定義されます。CURRENT
には、現在実行中のレプリカの数が表示されます。UP-TO-DATE
には、望ましい状態になるように更新されたレプリカの数が表示されます。AVAILABLE
には、ユーザーが使用できるアプリケーション レプリカの数が表示されます。AGE
には、クラスタ内でアプリケーションがこれまで実行された合計時間が表示されます。
この例では 1 つの Deployment my-app
だけが存在し、それにはレプリカが 1 つだけあります。これは、単一のレプリカが望ましい状態だからです。この望ましい状態は作成時に定義されますが、アプリケーションをスケーリングすることで、いつでもそれを変更できます。
StatefulSet を検査する
StatefulSet をスケーリングする前に、次のコマンドを実行して検査します。
kubectl describe statefulset my-app
このコマンドの出力で、[Pods Status] フィールドを調べます。Failed
の値が 0
より大きい場合は、スケーリングが失敗する可能性があります。
StatefulSet が異常だと思われる場合は、次のことを行います。
Pod の一覧を取得し、異常状態の Pod を確認します。
kubectl get pods
次のようにして異常状態の Pod を削除します。
kubectl delete POD_NAME
異常状態の StatefulSet をスケーリングしようとすると、使用不能になります。
アプリケーションのスケーリング
以降のセクションでは、アプリケーションのスケーリングに使用できるメソッドについて説明します。kubectl scale
メソッドは、最も速くスケーリングする方法です。ただし、構成ファイルを更新する場合やインプレース修正を行う場合など、状況によっては別の方法を使用した方が適切な場合があります。
kubectl scale
kubectl scale
コマンドを使用すると、アプリケーションを実行するレプリカの数を即座に変更できます。
kubectl scale
を使用するには、--replicas
フラグを設定して新しいレプリカ数を指定します。たとえば、my-app
を 4 つのレプリカにスケーリングするには、次のコマンドを実行します。CONTROLLER
は、deployment
、statefulset
、または別のコントローラ オブジェクト タイプに置き換えます。
kubectl scale CONTROLLER my-app --replicas 4
成功した場合は、このコマンドの出力が deployment
"my-app" scaled
のようになります。
続いて、次のコマンドを実行します。
kubectl get CONTROLLER my-app
出力は次のようになります。
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
my-app 4 4 4 4 15m
kubectl apply
kubectl apply
を使用すると、新しい構成ファイルを既存のコントローラ オブジェクトに適用できます。リソースに複数の変更を加えるには kubectl
apply
が便利です。特に、構成ファイルでリソースを管理するユーザーにとって役立つ可能性があります。
kubectl apply
を使用してスケーリングするには、提供する構成ファイルで、オブジェクト仕様の replicas
フィールドに新しいレプリカ数を含める必要があります。
例の my-app
オブジェクト用の構成ファイルを更新したバージョンを以下に示します。この例は Deployment を示していますが、他のタイプのコントローラ(StatefulSet など)を使用する場合には、kind
を適宜変更してください。この例は、少なくとも 3 つのノードを持つクラスタで最も効果を発揮します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: my-container
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
このファイルでは、replicas
フィールドの値が 3
になっています。この構成ファイルが適用されると、オブジェクト my-app
は 3 つのレプリカにスケーリングします。
更新された構成ファイルを適用するには、次のコマンドを実行します。
kubectl apply -f config.yaml
続いて、次のコマンドを実行します。
kubectl get CONTROLLER my-app
出力は次のようになります。
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
my-app 3 3 3 3 15m
Console
Google Cloud コンソールでワークロードをスケールする手順は次のとおりです。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [レプリカの編集] をクリック
ワークロードの新しいレプリカ数を入力します。
[スケール] をクリックします。
Deployment を自動スケーリングする
kubectl
autoscale
を使って Pod の CPU 使用状況に基づいて Deployment の自動スケーリングすることも、Google Cloud コンソールの GKE [ワークロード] メニューから自動スケーリングすることもできます。
kubectl autoscale
kubectl autoscale
によって作成される HorizontalPodAutoscaler
(HPA)オブジェクトは、指定されたリソース(スケール ターゲットという)を対象とし、必要に応じてそれをスケーリングします。HPA は、指定された平均 CPU 使用率と一致するように、スケール ターゲットのレプリカの数を定期的に調整します。
kubectl autoscale
を使用するときは、アプリケーションの最大レプリカ数と最小レプリカ数、CPU 使用率の目標を指定します。たとえば、レプリカの最大数を 6、最小数を 4 にして、CPU 使用率の目標を 50% に設定するには、次のコマンドを実行します。
kubectl autoscale deployment my-app --max 6 --min 4 --cpu-percent 50
このコマンドでは、--max
フラグが必要です。--cpu-percent
フラグは、すべてのポッドにわたる目標 CPU 使用率です。このコマンドは、システムの需要がない限り、即座に Deployment を 6 つのレプリカにスケーリングすることはありません。
kubectl autoscale
を実行すると、HorizontalPodAutoscaler
オブジェクトが作成され、アプリケーションが対象になります。負荷が変化すると、オブジェクトがアプリケーションのレプリカを増減します。
クラスタ内の HorizontalPodAutoscaler
オブジェクトの一覧を取得するには、次のコマンドを実行します。
kubectl get hpa
クラスタ内の特定の HorizontalPodAutoscaler
オブジェクトを表示するには、次のコマンドを実行します。
kubectl get hpa HPA_NAME
HPA_NAME
は実際の HorizontalPodAutoscaler
オブジェクトの名前に置き換えます。
HorizontalPodAutoscaler
構成を表示するには:
kubectl get hpa HPA_NAME -o yaml
このコマンドの出力は、次のようになります。
apiVersion: v1
items:
- apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
creationTimestamp: ...
name: HPA_NAME
namespace: default
resourceVersion: "664"
selfLink: ...
uid: ...
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: HPA_NAME
targetCPUUtilizationPercentage: 50
status:
currentReplicas: 0
desiredReplicas: 0
kind: List
metadata: {}
resourceVersion: ""
selfLink: ""
この例では、kubectl autoscale
の例から渡された 50
パーセント値が targetCPUUtilizationPercentage
フィールドに保持されています。
クラスタ内の特定の HorizontalPodAutoscaler
オブジェクトの詳細な説明を表示するには、次のようにします。
kubectl describe hpa HPA_NAME
HorizontalPodAutoscaler
を変更するには、kubectl apply
を使って新しい構成ファイルを適用するか、kubectl edit
を使用するか、または kubectl patch
を使用できます。
HorizontalPodAutoscaler
オブジェクトを削除するには、次のようにします。
kubectl delete hpa HPA_NAME
Console
Deployment を自動スケーリングする手順は次のとおりです。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、自動スケーリングする Deployment の名前をクリックします。
list [アクション] > [自動スケーリング] をクリックします。
Deployment の [レプリカの最大数] と、必要に応じて [レプリカの最小数] を入力します。
[自動スケーリング指標] で、必要に応じて指標を選択して構成します。
[自動スケーリング] をクリックします。
カスタム指標による自動スケーリング
Cloud Monitoring からエクスポートされたカスタム指標に基づいて Deployment をスケーリングできます。
カスタム指標を使用して Deployment を自動スケーリングする方法については、カスタム指標を使用した Deployment の自動スケーリングのチュートリアルを参照してください。