水平ポッド オートスケーラーの構成

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

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Enable Google Kubernetes Engine API を有効にする
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト 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/v2beta1 API が使用されます。

kubectl を使用して HPA に関する情報を作成または表示する際には、autoscaling/v1 API または autoscaling/v2beta1 API を指定できます。

  • apiVersion: autoscaling/v1 はデフォルトであり、CPU 使用率のみに基づく自動スケーリングを可能にします。他の指標に基づいて自動スケーリングするには、apiVersion: autoscaling/v2beta1 の使用をおすすめします。Deployment の構成の例では apiVersion: autoscaling/v1 を使用しています。

  • 新しい HPA オブジェクトを作成するには、apiVersion: autoscaling/v2beta1 をおすすめします。これを使用すると、カスタム指標や外部指標を含む複数の指標に基づく自動スケーリングが可能になります。このトピックのその他の例では、apiVersion: autoscaling/v2beta1 を使用しています。

サポートされている API バージョンを確認するには、kubectl api-versions コマンドを使用します。

apiVersion: autoscaling/v2beta1 を使用する 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
horizontalpodautoscaler.autoscaling/nginx created

kubectl autoscale

平均 CPU 使用率のみをターゲットとする HPA オブジェクトを作成するには、kubectl autoscale コマンドを使用できます。

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

クラスタ内の HPA オブジェクトのリストを取得するには、kubectl get 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/v2beta1 が必要です。使用可能な API の詳細については、HPA オブジェクト用の API バージョンをご覧ください。

この YAML マニフェストを nginx-multiple.yaml という名前のファイルとして保存します。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
  - type: Resource
    resource:
      name: memory
      targetAverageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metricName: packets_per_second
  #     targetAverageValue: 100

次のようにして YAML マニフェストを適用します。

kubectl apply -f nginx-multiple.yaml
horizontalpodautoscaler.autoscaling/nginx created

HPA が作成されると、HPA は nginx Deployment の平均 CPU 使用率、平均メモリ使用率、およびカスタム指標 packets_per_second(コメント解除した場合)をモニタリングします。より大規模な自動スケーリング イベントを生じさせる値を持つ指標に基づいて、HPA は Deployment を自動スケーリングします。

HPA に関する詳細情報の表示

HPA の構成と統計情報を表示するには、kubectl describe hpa <var>[HPA-NAME]</var> を使用します。HPA で apiVersion: autoscaling/v2beta1 を使用している場合は、代わりに kubectl describe hpa.v2beta1.autoscaling <var>[HPA-NAME]</var> を使用してください。

各 HPA の現在のステータスが Conditions フィールドに表示され、自動スケーリング イベントが Events フィールドにリストされます。

kubectl describe hpa nginx

apiVersion: autoscaling/v2beta1 を使用する、複数の指標に基づく HPA の場合、kubectl describe hpa コマンドによって CPU の指標のみが表示されます。すべての指標を表示するには、代わりに kubectl describe hpa.v2beta1.autoscaling コマンドを使用してください。

kubectl describe hpa.v2beta1.autoscaling nginx
Name:                     nginx
Namespace:                default
Labels:                   <none>
Annotations:              autoscaling.alpha.kubernetes.io/conditions:
                            [{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T21:15:22Z","reason":"ReadyForNewScale","message":"recommended size...
                          autoscaling.alpha.kubernetes.io/current-metrics:
                            [{"type":"Resource","resource":{"name":"memory","currentAverageValue":"1998848"}},{"type":"Resource","resource":{"name":"cpu","currentAver...
                          autoscaling.alpha.kubernetes.io/metrics: [{"type":"Resource","resource":{"name":"memory","targetAverageValue":"100Mi"}}]
                          kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:        Wed, 30 Oct 2019 14:15:13 -0700
Reference:                Deployment/nginx
Target CPU utilization:   50%
Current CPU utilization:  0%
Min replicas:             1
Max replicas:             10
Deployment pods:          1 current / 1 desired
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 コマンドを使用します。

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. 必要であれば、クラスタを削除します。

次のステップ