Kubernetes ワークロードによってエクスポートされた指標、または Pod や Node などの Kubernetes オブジェクトに関連付けられた指標に基づいて自動スケーリングする場合は、代わりにカスタム指標を使用した Deployment の自動スケーリングをご覧ください。
この例では、Cloud Pub/Sub サブスクリプションの未送信メッセージ数に基づいた自動スケーリングを示していますが、この手順は Stackdriver で使用可能なすべての指標に適用できます。
目標
このチュートリアルでは、次のタスクについて説明します。- カスタム指標 Stackdriver アダプタをデプロイする方法
- HorizontalPodAutoscaler(HPA)リソースをデプロイして、別の Google Cloud サービスの Stackdriver 指標に基づいて Deployment をスケーリングする方法
始める前に
次の手順で Kubernetes Engine API を有効にします。- Google Cloud Console で Kubernetes Engine ページにアクセスします。
- プロジェクトを作成または選択します。
- API と関連サービスが有効になるのを待ちます。 これには数分かかることがあります。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する。
このチュートリアルでは、gcloud
および kubectl
コマンドライン ツールにプリインストールされている Cloud Shell を使用します。
gcloud
コマンドライン ツールのデフォルトの設定
次のようにしてデフォルト値を設定しておくと、gcloud
コマンドライン ツールでプロジェクト ID および Compute Engine ゾーン オプションを入力する時間が節約されます。
gcloud config set project project-id gcloud config set compute/zone compute-zone
クラスタの作成
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
オブジェクトが記述されています。
このマニフェストをデプロイするには、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 に変更されました。
別の指標を使用する
metricType
が INT64
または DOUBLE
である限り、Stackdriver で使用できる指標は自動スケーリングに使用できます。使用可能な指標を参照するには、Metrics Explorer または GCP 指標リストを使用します。指標の種類が GAUGE
である場合、現在の指標値が自動スケーリングに使用されます。指標 DELTA
と CUMULATIVE
では、指標のレート(1 秒当たりの指標の変更)が代わりに使用されます。レートの計算方法の詳細については、カスタム指標アダプタのドキュメントをご覧ください。
Metrics Explorer を使用してモニタリング対象リソースの指標を表示する方法は次のとおりです。
- Google Cloud Console で [Monitoring] を選択するか、次のボタンを使用します。
[Monitoring] に移動 - [Monitoring] のナビゲーション パネルで、
[Metrics Explorer] をクリックします。
- モニタリング対象リソースの名前を [Find resource type and metric] テキスト ボックスに入力します。
外部指標仕様の作成
自動スケーリングに使用する指標を選択したら、HorizontalPodAutoscaler の外部指標仕様を記述する必要があります。これを行うには、次の 3 つのフィールドを指定する必要があります。
- metricName: 指標の名前。Kubernetes API では指標名にスラッシュを使用できないため、パイプ記号(
|
)で置き換える必要があります。このチュートリアルではpubsub.googleapis.com/subscription/num_undelivered_messages
がpubsub.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 アカウントに課金されないようにする手順は次のとおりです。
Pub/Sub サブスクリプションとトピックをクリーンアップします。
gcloud pubsub subscriptions delete echo-read gcloud pubsub topics delete echo
GKE クラスタを削除します。
gcloud container clusters delete cluster-name
次のステップ
スケーリング ワークロードのカスタム指標と外部指標の詳細について確認する。
Google Cloud のその他の機能を試す。チュートリアルをご覧ください。