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

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

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

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

目標

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

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

始める前に

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

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

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

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

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

クラスタの作成

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、つまり 2,250 m です。

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

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

別の指標を使用する

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

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

  1. Google Cloud Console で [モニタリング] を選択するか、次のボタンを使用します。
    [モニタリング] に移動
  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 を指定します。

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

「カスタム指標を使用した 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]

次のステップ