GKE Autopilot で実行されているアプリケーションからプライベート AlloyDB インスタンスへの接続

1. 概要

このラボでは、GKE Autopilot で稼働する Pod を持つ 2 層マイクロサービスをデプロイし、AlloyDB データベースのプライベート インスタンスに接続します。カスタマー サービス アプリケーションは Cymbal Eats システムの一部であり、登録ユーザーを管理する機能を提供します。カスタマー サービス アプリケーションは、Quarkus フレームワークを使用する Java ベースのマイクロサービスです。

e8a5140b09521b7a.png

AlloyDB は、プライベート サービス アクセス用に構成されたプライベート内部 IP アドレスを介したネットワーク接続をサポートしています。

プライベート サービス アクセスは、VPC ネットワークと、AlloyDB リソース(クラスタとインスタンス)が存在する基盤となる Google Cloud VPC ネットワークとの間の VPC ピアリング接続として実装されます。プライベート接続を使用すると、VPC ネットワーク内のリソースは、内部 IP アドレスを使用して排他的にアクセスする AlloyDB リソースと通信できます。VPC ネットワーク内のリソースは、インターネット アクセスや外部 IP アドレスがなくても AlloyDB リソースにアクセスできます。

44662d7a086358de.png

GKE Autopilot とは

GKE Autopilot は GKE の運用モードの一つで、ノード、スケーリング、セキュリティ、その他の事前構成された設定などのクラスタ構成を Google が管理します。Autopilot クラスタは、ほとんどの本番環境ワークロードを実行するように最適化されており、Kubernetes マニフェストに基づいてコンピューティング リソースをプロビジョニングします。この合理化された構成は、クラスタとワークロードの設定、スケーラビリティ、セキュリティに関する GKE のベスト プラクティスと推奨事項に準拠しています。組み込みの設定のリストについては、Autopilot と Standard の比較表をご覧ください。

AlloyDB とは

特に要求の厳しいエンタープライズ データベース ワークロードに対応するフルマネージドの PostgreSQL 互換データベース サービスです。AlloyDB は、Google の強みと、人気の高いオープンソース データベース エンジンの 1 つである PostgreSQL を組み合わせて、優れたパフォーマンス、スケール、可用性を実現します。

学習内容

このラボでは、次の方法について学びます。

  • AlloyDB データベースのプライベート インスタンスを作成する
  • AlloyDB インスタンスに接続する GKE Autopilot クラスタにアプリケーションをデプロイする

前提条件

  • このラボは、Cloud コンソール環境と Cloud Shell 環境に精通していることを前提としています。
  • GKE と AlloyDB の以前の経験は役立ちますが、必須ではありません。

2. 設定と要件

Cloud プロジェクトの設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この値はいつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常、それが何であるかは関係ありません。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常は PROJECT_ID として識別されます)。生成された ID が気に入らない場合は、別のランダムな ID を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、3 つ目の値は、一部の API で使用される [プロジェクト番号] です。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に課金されないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境設定

検索バーの右側にあるアイコンをクリックして Cloud Shell をアクティブにします。

eb0157a992f16fa3.png

リポジトリのクローンを作成してディレクトリに移動し、以下のコマンドをコピーしてターミナルに貼り付け、Enter キーを押します。

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/customer-service

gke-lab-setup.sh を実行して、必要な依存関係をデプロイする

次のリソースが作成されます。

  • AlloyDB クラスタとインスタンス
  • Cloud Run ジョブとカスタマー サービスのコンテナ イメージを保存する Artifact Registry
  • Cloud Run ジョブが AlloyDB データベースと通信するための VPC アクセス コネクタ
  • AlloyDB データベースを作成する Cloud Run ジョブ
  • GKE Autopilot クラスタ
./gke-lab-setup.sh

承認するよう求められたら、[承認] をクリックします。] をクリックしてください。

6356559df3eccdda.png

設定には 10 分ほどかかります。必要な依存関係の作成に使用する設定スクリプトを確認します。

gke-lab-setup.sh

スクリプトが完了し、以下の出力が表示されるまで待ってから、次の手順に進んでください。

Job [db-job] has successfully been created.

To execute this job, use:
gcloud beta run jobs execute db-job
OK Creating execution... Done.               
  OK Provisioning resources...
Done.
Execution [db-job-k94ps] has successfully started running.

3. アプリケーションのデプロイ

AlloyDB クラスタを確認する

以下のコマンドを実行して、作成された AlloyDB インスタンスを確認します。

gcloud alloydb instances describe customer-instance --cluster=customer-cluster --region=us-central1

出力例:

createTime: '2023-01-06T14:40:07.213288293Z'
instanceType: PRIMARY
ipAddress: 10.77.176.2
machineConfig:
  cpuCount: 2
name: projects/cymbal-eats-20056-16671/locations/us-central1/clusters/customer-cluster/instances/customer-instance
nodes:
- zoneId: us-central1-f
queryInsightsConfig:
  queryPlansPerMinute: 5
  queryStringLength: 1024
  recordApplicationTags: true
  recordClientAddress: true
reconciling: false
state: READY
uid: df90d57d-88df-49be-a626-6dfec0513e64
updateTime: '2023-01-06T14:49:40.907977843Z'
writableNode:
  zoneId: us-central1-b

コンソールで、利用可能な機能(Query Insight、Monitoring)を確認する。

3b12b0fa1367fb42.png

GKE Autopilot クラスタを確認する

プロジェクトの環境変数を設定します。

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')

初期設定の一環として、以下のコマンドを使用してクラスタを作成しました(このコマンドを実行する必要はありません)。

gcloud container clusters create-auto $CLUSTER_NAME --region $REGION

コマンドを実行して、作成された GKE Autopilot クラスタを表示します。

gcloud container clusters list

出力例:

e8882c44fa0bb631.png

次のコマンドを実行して、クラスタの認証情報を保存します。

CLUSTER_NAME=rewards-cluster
REGION=us-central1

gcloud container clusters get-credentials $CLUSTER_NAME --region=$REGION

アプリケーションをデプロイする

次に、カスタマー サービス アプリケーションをデプロイします。

カスタマー サービス アプリケーションは、Quarkus フレームワークを使用する Java ベースのマイクロサービスです。

cymbal-eats/customer-service フォルダに移動し、次のコマンドを実行してコンテナ イメージをビルドしてアップロードします。

./mvnw clean package -DskipTests

export CUSTOMER_SERVICE_IMAGE=gcr.io/$PROJECT_ID/customer-service:1.0.0

gcloud builds submit --tag $CUSTOMER_SERVICE_IMAGE .

コンソールで Cloud Build を開き、最新のビルドの詳細を確認します。

49fd65309967ae47.png

AlloyDB プライベート IP アドレスの値を使用して、以下の環境変数を設定します。

export DB_HOST=$(gcloud beta alloydb instances describe customer-instance \
    --cluster=customer-cluster \
    --region=$REGION \
    --format=json | jq \
    --raw-output ".ipAddress")

echo $DB_HOST

次のコマンドを実行して、カスタマー サービス アプリケーションがデータベースに接続するために使用するデータベース認証情報を保存する Kubernetes Secret オブジェクトを作成します。

DB_NAME=customers
DB_USER=postgres
DB_PASSWORD=password123

kubectl create secret generic gke-alloydb-secrets \
  --from-literal=database=$DB_NAME \
  --from-literal=username=$DB_USER \
  --from-literal=password=$DB_PASSWORD \
  --from-literal=db_host=$DB_HOST

次のコマンドを実行して、deployment.yaml ファイルの CUSTOMER_SERVICE_IMAGE を置き換えます。

sed "s@CUSTOMER_SERVICE_IMAGE@$CUSTOMER_SERVICE_IMAGE@g" deployment.yaml.tmpl > customer-service-deployment.yaml

コマンドを実行してアプリケーションをデプロイします。

kubectl apply -f customer-service-deployment.yaml

アプリケーションが RUNNING 状態に移行するまでに少し時間がかかります。

次のコマンドを実行して、テスト手順で使用する外部 IP を作成します。

SERVICE_NAME=customer-service

kubectl expose deployment $SERVICE_NAME \
  --type LoadBalancer --port 80 --target-port 8080

次のコマンドを実行して、作成されたリソースを確認します。

kubectl get all

出力例:

179a23bd33793924.png

4. アプリケーションをテストする

次のコマンドを実行して、カスタマー サービスの URL を保存します。

kubectl get svc

前の出力の外部 IP の値を使用して、以下の環境変数を設定します。

CUSTOMER_SERVICE_URL=$(kubectl get svc customer-service -o=jsonpath='{.status.loadBalancer.ingress[0].ip}')

新しい顧客レコードを作成するには、次のコマンドを実行します。

curl -X POST $CUSTOMER_SERVICE_URL/customer \
-H 'Content-Type: application/json' \
-d '{"id": "id1","rewardPoints": 3,"address": "1845 Denise St","city": "Mountain View","createDateTime": "2022-11-11T15:56:45.487566","email": "ajensen9090+eats@gmail.com","name": "Angela Jensen","state": "CA","updateDateTime": "2022-11-11T15:56:45.866125","zip": "94043"}'

上記のコマンドを複数回実行して、ログ メッセージを生成します。生成されたログメッセージは、後でログ エクスプローラに表示されます。

顧客記録の確認

以下のコマンドを実行して、作成した顧客レコードを表示します。

curl $CUSTOMER_SERVICE_URL/customer | jq

出力例:

[
  {
    "address": "1845 Denise St",
    "city": "Mountain View",
    "createDateTime": "2023-01-06T16:13:19.118744",
    "email": "ajensen9090+eats@gmail.com",
    "id": "id1",
    "name": "Angela Jensen",
    "rewardPoints": 3,
    "state": "CA",
    "updateDateTime": "2023-01-06T16:13:19.118896",
    "zip": "94043"
  }
]

GKE のワークロードとサービスを確認する

Cloud コンソールで Kubernetes Engine を開き、作成されたワークロードとサービスを確認します。

e1217216e003a839.png

d5c97fb5950c4db.png

アプリケーション ログ

ログ エクスプローラを開き、「顧客がすでに存在します」を含むログを検索します。あります。

543c5ed97819f540.png

5. 完了

お疲れさまでした。これでこの Codelab は終了です。

学習した内容

  • AlloyDB データベースのプライベート インスタンスを作成する方法
  • AlloyDB インスタンスに接続する GKE Autopilot クラスタにアプリケーションをデプロイする方法

次のステップ:

Cymbal Eats の他の Codelab を確認する:

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。