水平 Pod 自動スケーリングの構成

このページでは、水平ポッド オートスケーラー(HPA)を使用して、さまざまなタイプの指標で Deployment を自動スケーリングする方法について説明します。同じガイドラインに従って、任意のスケーラブルなデプロイメント オブジェクト用の HPA を構成できます。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. デフォルトの 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

  1. Cloud Console で GKE の [ワークロード] メニューに移動します。

    GKE の [ワークロード] メニューに移動

  2. nginx Deployment の名前をクリックします。

  3. [操作] メニューを展開し、[自動スケーリング] を選択します。

  4. 次の値を指定します。

    • ポッドの最小数: 1
    • ポッドの最大数: 10
    • ターゲット CPU 使用率(%): 50
  5. [自動スケーリング] をクリックします。

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

  1. Cloud Console で GKE の [ワークロード] メニューに移動します。

    GKE の [ワークロード] メニューに移動

  2. nginx Deployment の名前をクリックします。

  3. ページの [オートスケーラー] セクションに HPA の構成が表示されます。

  4. 自動スケーリング イベントの詳細を [イベント] タブで確認できます。

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 を削除するには:

  1. Cloud Console で GKE の [ワークロード] メニューに移動します。

    GKE の [ワークロード] メニューに移動

  2. nginx Deployment の名前をクリックします。

  3. [操作] メニューを展開し、[自動スケーリング] を選択します。

  4. [オートスケーラーを無効にする] を選択します。

kubectl delete

nginx HPA を削除するには、次のコマンドを使用します。

kubectl delete hpa nginx

HPA を削除した場合、Deployment(または他のデプロイメント オブジェクト)は既存のスケールのままになります。Deployment の元のマニフェストのレプリカ数には戻りません。手動で Deployment を再び 3 つのポッドにスケーリングするには、kubectl scale コマンドを使用できます。

kubectl scale deployment nginx --replicas=3

クリーンアップ

  1. HPA をまだ削除していない場合は、削除します。

    kubectl delete hpa nginx
    
  2. nginx Deployment を削除します。

    kubectl delete deployment nginx
    
  3. 必要であれば、クラスタを削除します。

次のステップ