外部指標による Deployment の自動スケーリング

このチュートリアルでは、Stackdriver から取得できる指標に基づいて GKE ワークロードを自動的にスケーリングする方法を示します。

Kubernetes ワークロードによってエクスポートされた指標、またはポッドやノードなどの Kubernetes オブジェクトに関連付けられた指標に基づいて自動スケーリングする場合は、代わりにカスタム指標を使用した Deployment の自動スケーリングをご覧ください。

この例では、Cloud Pub/Sub サブスクリプションの未送信メッセージ数に基づいた自動スケーリングを示していますが、この手順は Stackdriver で使用可能なすべての指標に適用できます。

目標

このチュートリアルでは、次の手順について説明します。

  1. カスタム指標 Stackdriver アダプタをデプロイする方法。
  2. HorizontalPodAutoscaler(HPA)リソースをデプロイして、別の Google Cloud Platform サービスの Stackdriver 指標に基づいて Deployment をスケーリングする方法。

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で [Kubernetes Engine] ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。gcloudGoogle Cloud SDK に含まれています。
  • kubectl は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes を管理するために使用されます。gcloud を使用して kubectl をインストールできます。
    gcloud components install kubectl

gcloud コマンドライン ツールのデフォルトを設定する

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

クラスタを作成する

Kubernetes バージョン 1.10 以降を実行する GKE クラスタを作成します。

Pub/Sub サブスクライバー アプリケーションをデプロイする

Cloud Pub/Sub を使用してアプリケーションを実行するには、Google Cloud サービス アカウントを作成し、アプリケーションに認証情報を提供する必要があります。これについては、サービス アカウントを使用した Cloud Platform への認証チュートリアルで説明しています。

以降の手順では、サービス アカウントを使用した Cloud Platform への認証で作成した Deployment を自動スケールする方法を示します。次に進む前に、このチュートリアルの手順 1〜6 を完了する必要があります。

ステップ 1: カスタム指標 Stackdriver アダプタをデプロイする

Stackdriver に格納されている指標へのアクセスを GKE オブジェクトに許可するには、カスタム指標 Stackdriver アダプタをデプロイする必要があります。カスタム指標アダプタを実行するには、次の Kubernetes コマンドを実行して、必要な承認の役割を作成する権限をユーザーに付与する必要があります。

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

クラスタでアダプタをデプロイするには、次のコマンドを実行します。

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

ステップ 2: HorizontalPodAutoscaler オブジェクトを作成する

カスタム指標 Stackdriver アダプタをデプロイしたら、次に HorizontalPodAutoscaler をデプロイすることで、Deployment を自動スケーリングできます。

次のマニフェスト ファイルは、Pub/Sub サブスクリプションの未確認メッセージ数に基づくターゲット値に基づいて Deployment をスケーリングする HorizontalPodAutoscaler オブジェクトを記述しています。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

このマニフェストをデプロイするには、マニフェストを hpa.yaml というファイル名でマシンにダウンロードしてから、次のコマンドを実行します。

kubectl apply -f hpa.yaml

ステップ 3: 負荷を生成する

この例でデプロイされたサンプル アプリケーションは、数秒ごとに 1 つのメッセージを処理します。継続的に公開することで、メッセージがキューに入れられて、自動スケーリングをトリガーできます。次のコマンドを使用すると、200 件のメッセージを Pub/Sub トピックに公開できます。

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

ステップ 4: HPA によるアプリケーションの追加レプリカの作成を観測する

Deployment の現在のレプリカの数を確認するには、次のコマンドを実行します。

kubectl get deployment pubsub

また、HPA の状態と最近のアクティビティを調べるには、次のコマンドを実行します。

kubectl describe hpa pubsub
出力:
Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

[Metrics] セクションには、HPA によって観測された指標の最終値が表示されます。小数値はミリ単位で表されます。たとえば、上記の出力では、アプリケーションのレプリカが 4 つあり、Pub/Sub サブスクリプションの現在の未確認メッセージ数は 9 です。したがって、レプリカあたりの平均メッセージ数は 2.25、つまり 2250 m です。

[Conditions] セクションは、HorizontalPodAutoscaler をスケーリングできるかどうかを示します。上記の例では、ScalingLimited 条件は、レプリカの数が最大許容値であり、HPA がそれ以上増やさないことを示しています。

最後に、HPA はアプリケーションのレプリカ数を変更するたびにイベントを作成します(上記の [Events] セクションを参照)。上記の例では、確認応答されていないメッセージの数が目標数を超えたため、レプリカの数は 4 に変更されました。

別の指標を使用する

Stackdriver で使用可能な指標は、metricTypeINT64 または DOUBLE である限り、自動スケーリングに使用できます。使用可能な指標を参照するには、Metrics Explorer または GCP 指標リストを使用します。指標の種類が GAUGE である場合、現在の指標値が自動スケーリングに使用されます。指標 DELTACUMULATIVE では、指標のレート(1 秒当たりの指標の変更)が代わりに使用されます。レートの計算方法の詳細については、カスタム指標アダプタのドキュメントをご覧ください。

外部指標仕様の作成

自動スケーリングに使用する指標を選択したら、HorizontalPodAutoscaler の外部指標仕様を記述する必要があります。これを行うには、次の 3 つのフィールドを指定する必要があります。

  • metricName: 指標の名前。Kubernetes API では指標名にスラッシュを使用できないため、パイプ記号(|)で置き換える必要があります。このチュートリアルでは pubsub.googleapis.com/subscription/num_undelivered_messagespubsub.googleapis.com|subscription|num_undelivered_messages として指定されている点にご注目ください。
  • metricSelector: 特定の時系列の指標を選択するためのオプション。metricSelector が複数の時系列と一致する場合は、それらの値の合計が自動スケーリングに使用されます。このチュートリアルでは、metricSelector を使用して、echo-read サブスクリプション内のメッセージのみを考慮するよう HPA に制限を加えました。詳細は、Stackdriver の時系列とラベルKubernetes LabelSelector をご覧ください。
  • targetAverageValue: 各レプリカが処理できる指標の合計値を指定します。これは、Pub/Sub メッセージや QPS など、レプリカ間で分割できる作業やリソースを表す指標を使用する場合に便利です。リクエストの平均レイテンシなどの他の指標では、グローバル ターゲット値を指定する方が理にかなっています。これを行うには、targetAverageValue の代わりに targetValue を指定します。

複数の指標に基づく自動スケーリング

「カスタム指標を使用した Deployment の自動スケーリング」で説明しているように、外部指標とその他の種類の指標を組み合わせて、1 つの HorizontalPodAutoscaler を持つ複数の指標を使用できます。これを行うには、HPA オブジェクト仕様内の metrics リストで、個別のエントリとして使用する各指標を指定します。HPA は、各指標に基づいてレプリカの数を計算し、最も多いものを選択します。

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. Pub/Sub サブスクリプションとトピックをクリーンアップします。

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. 次のコマンドを実行して、GKE クラスタを削除します。

    gcloud container clusters delete [CLUSTER_NAME]

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のチュートリアル