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

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

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

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

目標

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

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

始める前に

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

このチュートリアルでは、gcloud および kubectl コマンドライン ツールにプリインストールされている Cloud Shell を使用します。

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

次のようにしてデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト ID および Compute Engine ゾーン オプションを入力する時間が節約されます。
gcloud config set project project-id
gcloud config set compute/zone compute-zone

クラスタの作成

GKE クラスタを作成する

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

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

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

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

Stackdriver に保存されている指標へのアクセスを GKE オブジェクトに許可するには、カスタム指標 Stackdriver アダプタをデプロイする必要があります。

カスタム指標アダプタを実行するには、次のコマンドを実行して、必要な承認のロールを作成する権限をユーザーに付与する必要があります。

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

このマニフェストをデプロイするには、pubsub-hpa.yaml としてマシンにダウンロードし、次のコマンドを実行します。

kubectl apply -f pubsub-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 に変更されました。

別の指標を使用する

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

Metrics Explorer を使用してモニタリング対象リソースの指標を表示する方法は次のとおりです。

  1. Google Cloud Console で [Monitoring] を選択するか、次のボタンを使用します。
    [Monitoring] に移動
  2. [Monitoring] のナビゲーション パネルで、 [Metrics Explorer] をクリックします。
  3. モニタリング対象リソースの名前を [Find resource type and metric] テキスト ボックスに入力します。

外部指標仕様の作成

自動スケーリングに使用する指標を選択したら、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 を指定します。

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

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
    

次のステップ