从 GKE Autopilot 上运行的应用连接到专用 AlloyDB 实例

1. 概览

在本实验中,您将部署一个双层微服务,其中包含一个在 GKE Autopilot 上运行的 pod,并将其连接到 AlloyDB 数据库的专用实例。Customer Service 应用是 Cymbal Eats 系统的一部分,提供管理注册用户的功能。Customer Service 应用是一个基于 Java 的微服务,使用 Quarkus 框架

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 的技术精华和最受欢迎的开源数据库引擎之一 PostgreSQL,可提供卓越的性能、扩缩能力和可用性。

学习内容

在本实验中,您将学习如何完成以下操作:

  • 创建 AlloyDB 数据库的专用实例
  • 在连接到 AlloyDB 实例的 GKE Autopilot 集群上部署应用

前提条件

  • 本实验假设您熟悉 Cloud 控制台和 Cloud Shell 环境。
  • 有 GKE 和 AlloyDB 使用经验会有所帮助,但不是必需条件。

2. 设置和要求

Cloud 项目设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称 是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新它。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您可以尝试自己创建一个,并确认是否可用。此步骤完成后,项目 ID 便无法更改,并且在整个项目期间保持不变。
  • 此外,还有第三个值,即部分 API 使用的项目编号 ,供您参考。如需详细了解所有这三个值,请参阅 文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。如需关闭资源以避免在本教程之外产生结算费用,您可以删除创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用 计划的条件。

环境设置

点击搜索栏右侧的图标,激活 Cloud Shell。

eb0157a992f16fa3.png

克隆代码库并转到相应目录,将以下命令复制并粘贴到终端中,然后按 Enter 键:

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

运行所需的依赖项 gke-lab-setup.sh

系统将创建以下资源:

  • AlloyDB 集群和实例
  • Artifact Registry,用于存储 Cloud Run 作业和 Customer Service 的容器映像
  • VPC 访问通道连接器,用于 Cloud Run 作业与 AlloyDB 数据库通信
  • Cloud Run 作业,用于创建 AlloyDB 数据库
  • 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

部署应用

接下来,您将部署 Customer Service 应用。

Customer Service 应用是一个基于 Java 的微服务,使用 Quarkus 框架

前往 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 对象,用于存储 Customer Service 应用将用于连接到数据库的数据库凭据:

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

应用需要一些时间才能转换为“正在运行”状态。

运行以下命令以创建将在测试步骤中使用的外部 IP:

SERVICE_NAME=customer-service

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

运行以下命令以验证创建的资源:

kubectl get all

示例输出:

179a23bd33793924.png

4. 测试应用

运行以下命令以保存客户服务网址。

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"}'

多次运行上述命令,以生成您稍后将在 Logs Explorer 中查看的日志消息。

查看客户记录

运行以下命令以查看创建的客户记录。

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

应用日志

打开 Logs Explorer,然后搜索包含“Customer already exists”文本的日志。

543c5ed97819f540.png

5. 恭喜!

恭喜,您已完成此 Codelab!

所学内容:

  • 如何创建 AlloyDB 数据库的专用实例
  • 如何在连接到 AlloyDB 实例的 GKE Autopilot 集群上部署应用

后续步骤:

探索其他 Cymbal Eats Codelab:

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。