このチュートリアルでは、高可用性のリレーショナル データベースを基盤とするウェブ アプリケーションを Google Kubernetes Engine(GKE)で大規模に実行する方法について説明します。
このチュートリアルで使用するサンプル アプリケーションは、Bank of Anthos です。これは、銀行の決済処理ネットワークをシミュレートする HTTP ベースのウェブ アプリケーションです。Bank of Anthos は、複数のサービスを使用して機能します。このチュートリアルでは、ウェブサイトのフロントエンドと、Bank of Anthos サービスを支えるリレーショナル PostgreSQL データベースに焦点を当てます。アーキテクチャやデプロイするサービスなど Bank of Anthos の詳細については、GitHub の Bank of Anthos をご覧ください。
目標
- GKE クラスタを作成して構成する。
- サンプル ウェブ アプリケーションと高可用性 PostgreSQL データベースをデプロイする。
- ウェブ アプリケーションとデータベースの自動スケーリングを構成する。
- 負荷生成ツールを使用してトラフィックの急増をシミュレートする。
- サービスのスケールアップとスケールダウンを確認する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Helm CLI をインストールします。
環境を準備する
このチュートリアルで使用するサンプル リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git cd bank-of-anthos/
環境変数を設定します。
PROJECT_ID=PROJECT_ID GSA_NAME=bank-of-anthos GSA_EMAIL=bank-of-anthos@${PROJECT_ID}.iam.gserviceaccount.com KSA_NAME=default
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。
クラスタとサービス アカウントを設定する
クラスタを作成します。
gcloud container clusters create-auto bank-of-anthos --region=us-central1
クラスタの起動には最大 5 分かかることがあります。
IAM サービス アカウントを作成します。
gcloud iam service-accounts create bank-of-anthos
IAM サービス アカウントへのアクセス権を付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
このステップでは、次のアクセス権を付与します。
roles/cloudtrace.agent
: レイテンシ情報などのトレースデータを Trace に書き込みます。roles/monitoring.metricWriter
: Cloud Monitoring に指標を書き込みます。roles/iam.workloadIdentityUser
: Kubernetes サービス アカウントが GKE 用 Workload Identity 連携を使用して IAM サービス アカウントとして機能することを許可します。
作成した IAM サービス アカウントとして機能するように、
default
Namespace でdefault
Kubernetes サービス アカウントを構成します。kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
これにより、
default
Namespace でdefault
Kubernetes サービス アカウントを使用する Pod が、IAM サービス アカウントと同じ Google Cloud リソースにアクセスできるようになります。
Bank of Anthos と PostgreSQL のデプロイ
このセクションでは、Bank of Anthos と PostgreSQL データベースを高可用性(HA)モードでインストールします。これにより、データベース サーバーのレプリカを自動スケーリングできます。このセクションで使用しているスクリプト、Helm チャート、Kubernetes マニフェストを確認するには、GitHub の Bank of Anthos リポジトリをご覧ください。
データベース スキーマとデータ定義言語(DDL)スクリプトをデプロイします。
kubectl create configmap initdb \ --from-file=src/accounts/accounts-db/initdb/0-accounts-schema.sql \ --from-file=src/accounts/accounts-db/initdb/1-load-testdata.sql \ --from-file=src/ledger/ledger-db/initdb/0_init_tables.sql \ --from-file=src/ledger/ledger-db/initdb/1_create_transactions.sh
サンプル Helm チャートを使用して PostgreSQL をインストールします。
helm repo add bitnami https://charts.bitnami.com/bitnami helm install accounts-db bitnami/postgresql-ha \ --version 10.0.1 \ --values extras/postgres-hpa/helm-postgres-ha/values.yaml \ --set="postgresql.initdbScriptsCM=initdb" \ --set="postgresql.replicaCount=1" \ --wait
このコマンドは、開始レプリカ数が 1 の PostgreSQL クラスタを作成します。このチュートリアルの後の部分では、受信接続に基づいてクラスタをスケーリングします。このオペレーションが完了するまで 10 分以上かかることがあります。
Bank of Anthos をデプロイします。
kubectl apply -f extras/jwt/jwt-secret.yaml kubectl apply -f extras/postgres-hpa/kubernetes-manifests
このオペレーションが完了するまで数分かかることがあります。
チェックポイント: 設定を検証する
Bank of Anthos のすべての Pod が実行されていることを確認します。
kubectl get pods
出力は次のようになります。
NAME READY STATUS accounts-db-pgpool-57ffc9d685-c7xs8 3/3 Running accounts-db-postgresql-0 1/1 Running balancereader-57b59769f8-xvp5k 1/1 Running contacts-54f59bb669-mgsqc 1/1 Running frontend-6f7fdc5b65-h48rs 1/1 Running ledgerwriter-cd74db4cd-jdqql 1/1 Running pgpool-operator-5f678457cd-cwbhs 1/1 Running transactionhistory-5b9b56b5c6-sz9qz 1/1 Running userservice-f45b46b49-fj7vm 1/1 Running
ウェブサイトのフロントエンドにアクセスできることを確認します。
frontend
サービスの外部 IP アドレスを探します。kubectl get ingress frontend
出力は次のようになります。
NAME CLASS HOSTS ADDRESS PORTS AGE frontend <none> * 203.0.113.9 80 12m
ブラウザで外部 IP アドレスに移動します。Bank of Anthos のログインページが表示されます。関心をお持ちの場合はアプリケーションをご覧ください。
404 エラーが発生した場合は、マイクロサービスがプロビジョニングされるまで数分待ってから再試行してください。
ウェブアプリと PostgreSQL データベースの自動スケーリング
GKE Autopilot は、クラスタ内のワークロード数に基づいてクラスタのコンピューティング リソースを自動スケーリングします。リソース指標に基づいてクラスタ内の Pod 数を自動的にスケーリングするには、Kubernetes 水平 Pod 自動スケーリングを実装する必要があります。Kubernetes に組み込まれている CPU とメモリの指標を使用でき、Cloud Monitoring から取得した 1 秒あたりの HTTP リクエスト数や SELECT ステートメントの数などのカスタム指標を使用することもできます。
このセクションでは、次の操作を行います。
- 組み込み指標とカスタム指標の両方を使用して、Bank of Anthos マイクロサービスの水平 Pod 自動スケーリングを構成する。
- Bank of Anthos アプリケーションへの読み込みをシミュレートして、自動スケーリング イベントをトリガーする。
- クラスタ内の Pod とノードの数が、負荷に応じて自動的にスケールアップまたはスケールダウンされることを確認する。
カスタム指標の収集を設定する
Monitoring からカスタム指標を読み取るには、カスタム指標 - Stackdriver アダプタ アダプタをクラスタにデプロイする必要があります。
アダプタをデプロイします。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
GKE 用 Workload Identity 連携を使用して指標を取得するようにアダプタを構成します。
IAM サービス アカウントを構成します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
アダプタが使用する Kubernetes サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
アダプタ Deployment を再起動して変更を反映します。
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
データベースの自動スケーリングを構成する
このチュートリアルの前の部分で Bank of Anthos と PostgreSQL をデプロイしたときに、すべての受信 SQL ステートメントを処理する 1 つのプライマリ読み取り / 書き込みレプリカを持つデータベースを StatefulSet としてデプロイしました。このセクションでは、受信 SELECT ステートメントを処理する新しいスタンバイの読み取り専用レプリカを追加するように、水平 Pod 自動スケーリングを構成します。各レプリカの負荷を軽減するには、SELECT ステートメント(読み取りオペレーション)を分散することをおすすめします。PostgreSQL Deployment には、このロード バランシングを実現してシステムのスループットを向上させる Pgpool-II
という名前のツールが含まれています。
PostgreSQL は、SELECT ステートメントの指標を Prometheus 指標としてエクスポートします。prometheus-to-sd
という名前の軽量の指標エクスポータを使用して、これらの指標をサポートされている形式で Cloud Monitoring に送信します。
HorizontalPodAutoscaler
オブジェクトを確認します。このマニフェストの内容は次のとおりです。
5
へのスケールアップ時のレプリカの最大数を設定します。- スケールダウン中の最小数を
1
に設定します。 - 外部指標を使用してスケーリングに関する決定を行います。このサンプルでは、指標は SELECT ステートメントの数です。スケールアップ イベントは、受信した SELECT ステートメントの数が 15 を超えると発生します。
マニフェストをクラスタに適用します。
kubectl apply -f extras/postgres-hpa/hpa/postgresql-hpa.yaml
ウェブ インターフェースの自動スケーリングを構成する
Bank of Anthos と PostgreSQL をデプロイするでは、Bank of Anthos ウェブ インターフェースをデプロイしました。ユーザー数が増加すると、userservice
Service はより多くの CPU リソースを消費します。このセクションでは、既存の Pod がリクエストされた CPU の 60% 超を使用している場合の userservice
と、ロードバランサへの受信 HTTP リクエストが 1 秒あたり 5 件を超える場合の frontend
Deployment に対して、水平 Pod 自動スケーリングを構成します。
userservice Deployment の自動スケーリングを構成する
userservice
Deployment のHorizontalPodAutoscaler
マニフェストを確認します。このマニフェストの内容は次のとおりです。
50
へのスケールアップ時のレプリカの最大数を設定します。- スケールダウン中の最小数を
5
に設定します。 - 組み込みの Kubernetes 指標を使用してスケーリングに関する決定を行います。このサンプルでは、指標は CPU 使用率であり、目標使用率は 60% です。これにより、過剰な使用率と過小な使用率の両方が回避されます。
マニフェストをクラスタに適用します。
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
フロントエンド デプロイの自動スケーリングを構成する
userservice
Deployment のHorizontalPodAutoscaler
マニフェストを確認します。このマニフェストでは、次のフィールドを使用します。
spec.scaleTargetRef
: スケーリングする Kubernetes リソース。spec.minReplicas
: レプリカの最小数。このサンプルでは5
です。spec.maxReplicas
: レプリカの最大数。このサンプルでは25
です。spec.metrics.*
: 使用する指標。このサンプルでは、1 秒あたりの HTTP リクエストの数です。これは、デプロイしたアダプタによって指定される Cloud Monitoring のカスタム指標です。spec.metrics.external.metric.selector.matchLabels
: 自動スケーリング時にフィルタリングする特定のリソースラベル。
ロードバランサから
frontend
Deployment への転送ルールの名前を確認します。export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
出力は次のようになります。
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
転送ルールをマニフェストに追加します。
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
このコマンドは
FORWARDING_RULE_NAME
を保存した転送ルールに置き換えます。マニフェストをクラスタに適用します。
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
チェックポイント: 自動スケーリングの設定を検証する
HorizontalPodAutoscaler
リソースの状態を取得します。
kubectl get hpa
出力は次のようになります。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
accounts-db-postgresql StatefulSet/accounts-db-postgresql 10905m/15 (avg) 1 5 2 5m2s
contacts Deployment/contacts 1%/70% 1 5 1 11m
frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s
userservice Deployment/userservice 0%/60% 5 50 5 4m56s
これで、アプリケーションを設定して自動スケーリングを構成できました。フロントエンドとデータベースが、提供された指標に基づいてスケーリングできるようになります。
負荷をシミュレーションして GKE のスケーリングを確認する
Bank of Anthos には、負荷がかかった状態でアプリケーションのスケーリングをテストするトラフィックをシミュレートできる loadgenerator
Service が含まれています。このセクションでは、loadgenerator
Service をデプロイし、負荷を生成して、スケーリングを確認します。
負荷テスト生成ツールをデプロイする
Bank of Anthos ロードバランサの IP アドレスを使用して環境変数を作成します。
export LB_IP=$(kubectl get ingress frontend -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $LB_IP
出力は次のようになります。
203.0.113.9
ロードバランサの IP アドレスをマニフェストに追加します。
sed -i "s/FRONTEND_IP_ADDRESS/$LB_IP/g" "extras/postgres-hpa/loadgenerator.yaml"
マニフェストをクラスタに適用します。
kubectl apply -f extras/postgres-hpa/loadgenerator.yaml
負荷生成ツールは、毎秒 1 人のユーザーの追加を開始し、最大 250 人のユーザーを追加します。
読み込みをシミュレートする
このセクションでは、負荷生成ツールを使用してトラフィックの急増をシミュレートし、時間の経過に伴う負荷の増加に対応するためにレプリカ数とノード数がスケールアップすることを確認します。次に、テストを終了し、レスポンスでレプリカとノードの数がスケールダウンすることを確認します。
負荷生成ツールのウェブ インターフェースをローカルで公開します。
kubectl port-forward svc/loadgenerator 8080
エラー メッセージが表示された場合は、Pod の実行中にもう一度お試しください。
ブラウザで、負荷生成ツールのウェブ インターフェースを開きます。
- ローカルシェルを使用している場合は、ブラウザを開いて http://127.0.0.1:8080 に移動します。
- Cloud Shell を使用している場合は、[ ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] をクリックします。
[チャート] タブをクリックして、パフォーマンスの推移を確認します。
新しいターミナル ウィンドウを開き、HorizontalPodAutoscaler のレプリカ数を確認します。
kubectl get hpa -w
レプリカの数は、負荷が増加すると増加します。スケールアップには約 10 分を要する場合があります。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS accounts-db-postgresql StatefulSet/accounts-db-postgresql 8326m/15 (avg) 1 5 5 contacts Deployment/contacts 51%/70% 1 5 2 frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
別のターミナル ウィンドウを開き、クラスタ内のノード数を確認します。
gcloud container clusters list \ --filter='name=bank-of-anthos' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="us-central1"
ノードの数は、新しいレプリカに対応するために、最初の 3 つのノードから増えました。
負荷生成ツールのインターフェースを開き、[停止] をクリックしてテストを終了します。
レプリカ数とノード数を再度チェックし、負荷が軽減されて数が減少するのを確認します。Kubernetes
HorizontalPodAutoscaler
リソースのレプリカの安定化に要する時間はデフォルトで 5 分であるため、スケールダウンには時間がかかることがあります。詳細については、安定化に要する時間をご覧ください。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
リソースを個別に削除する
Google Cloud は、作成した Kubernetes オブジェクトに基づいて、ロードバランサなどのリソースを作成します。このチュートリアルのすべてのリソースを削除する手順は次のとおりです。
サンプル Kubernetes リソースを削除します。
kubectl delete \ -f extras/postgres-hpa/loadgenerator.yaml \ -f extras/postgres-hpa/hpa \ -f extras/postgres-hpa/kubernetes-manifests \ -f extras/jwt/jwt-secret.yaml \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
PostgreSQL データベースを削除します。
helm uninstall accounts-db kubectl delete pvc -l "app.kubernetes.io/instance=accounts-db" kubectl delete configmaps initdb
GKE クラスタと IAM サービス アカウントを削除します。
gcloud iam service-accounts delete "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" --quiet gcloud container clusters delete "bank-of-anthos" --region="us-central1" --quiet
プロジェクトを削除する
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
次のステップ
- 垂直 Pod 自動スケーリングについて確認する。自動スケーリングを使用すると、長時間実行ワークロードのリソース リクエストを自動的に調整し、過去の使用状況に基づく推奨事項を取得できます。
- 水平 Pod 自動スケーリングの詳細を確認する。