アプリケーションのスケーリング


このページでは、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 は、deploymentsstatefulsets、または別のコントローラ オブジェクト タイプに置き換えます。

たとえば、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 が異常だと思われる場合は、次のことを行います。

  1. Pod の一覧を取得し、異常状態の Pod を確認します。

    kubectl get pods
    
  2. 次のようにして異常状態の Pod を削除します。

    kubectl delete POD_NAME
    

異常状態の StatefulSet をスケーリングしようとすると、使用不能になります。

アプリケーションのスケーリング

以降のセクションでは、アプリケーションのスケーリングに使用できるメソッドについて説明します。kubectl scale メソッドは、最も速くスケーリングする方法です。ただし、構成ファイルを更新する場合やインプレース修正を行う場合など、状況によっては別の方法を使用した方が適切な場合があります。

kubectl scale

kubectl scale コマンドを使用すると、アプリケーションを実行するレプリカの数を即座に変更できます。

kubectl scale を使用するには、--replicas フラグを設定して新しいレプリカ数を指定します。たとえば、my-appを 4 つのレプリカにスケーリングするには、次のコマンドを実行します。CONTROLLER は、deploymentstatefulset、または別のコントローラ オブジェクト タイプに置き換えます。

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 コンソールでワークロードをスケールする手順は次のとおりです。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、スケールするワークロードの名前をクリックします。

  3. [アクション] > [スケール] > [レプリカの編集] をクリック

  4. ワークロードの新しいレプリカ数を入力します。

  5. [スケール] をクリックします。

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 を自動スケーリングする手順は次のとおりです。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、自動スケーリングする Deployment の名前をクリックします。

  3. [アクション] > [自動スケーリング] をクリックします。

  4. Deployment の [レプリカの最大数] と、必要に応じて [レプリカの最小数] を入力します。

  5. [自動スケーリング指標] で、必要に応じて指標を選択して構成します。

  6. [自動スケーリング] をクリックします。

カスタム指標による自動スケーリング

Cloud Monitoring からエクスポートされたカスタム指標に基づいて Deployment をスケーリングできます。

カスタム指標を使用して Deployment を自動スケーリングする方法については、カスタム指標を使用した Deployment の自動スケーリングのチュートリアルを参照してください。

次のステップ