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

1. 概览

在本实验中,您将部署一个双层微服务,其中包含一个在 GKE Autopilot 上运行的 pod,并将其连接到 AlloyDB 数据库的私有实例。客户服务应用是 Cymbal Eats 系统的一部分,可提供管理注册用户的功能。客户服务应用是一个基于 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,看看是否可用。完成此步骤后便无法更改该 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 作业和客户服务的容器映像
  • 用于 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

探索控制台中的可用功能(查询洞见、监控)。

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

部署应用

接下来,您将部署客户服务应用。

客户服务应用是一个基于 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 对象以存储客户服务应用将用于连接到数据库的数据库凭据:

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. 测试应用

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

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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

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