1. 概览
在本实验中,您将部署一个双层微服务,其中包含一个在 GKE Autopilot 上运行的 Pod,并将其连接到 AlloyDB 数据库的私有实例。客户服务应用是 Cymbal Eats 系统的一部分,提供管理注册用户的功能。客户服务应用是基于 Java 且使用 Quarkus 框架的微服务。
AlloyDB 支持通过为专用服务访问通道配置的专用内部 IP 地址进行网络连接。
专用服务访问通道是作为 VPC 网络与 AlloyDB 资源(集群和实例)所在的底层 Google Cloud VPC 网络之间的 VPC 对等互连连接实现的。通过专用连接,VPC 网络中的资源可以使用内部 IP 地址与其仅访问的 AlloyDB 资源进行通信。VPC 网络中的资源不需要接入互联网或具备外部 IP 地址,即可访问 AlloyDB 资源。
什么是 GKE Autopilot?
GKE Autopilot 是 GKE 中的一种操作模式,在这种模式下,Google 会管理您的集群配置,包括节点、扩缩、安全性和其他预配置的设置。Autopilot 集群已经过优化,可运行大多数生产工作负载,并根据您的 Kubernetes 清单预配计算资源。简化的配置遵循了 GKE 在集群和工作负载设置、可伸缩性和安全性方面的最佳实践和建议。如需查看内置设置的列表,请参阅 Autopilot 和标准对比表。
什么是 AlloyDB?
兼容 PostgreSQL 的全代管式数据库服务,适用于要求苛刻的企业数据库工作负载。AlloyDB 结合了 Google 的技术精华和最受欢迎的开源数据库引擎之一 PostgreSQL,可提供卓越的性能、扩缩能力和可用性。
学习内容
在本实验中,您将学习如何完成以下操作:
- 创建 AlloyDB 数据库的专用实例
- 在 GKE Autopilot 集群上部署一个连接到 AlloyDB 实例的应用
前提条件
- 本实验假定您熟悉 Cloud 控制台和 Cloud Shell 环境。
- 之前有 GKE 和 AlloyDB 经验有帮助,但不是必需条件。
2. 设置和要求
Cloud 项目设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常您不在乎这是什么在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且该 ID 在项目期间会一直保留。 - 此外,还有第三个值,即某些 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。如需关停资源,以免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
环境设置
点击搜索栏右侧的图标,激活 Cloud Shell。
克隆代码库并导航到该目录,将下面的命令复制并粘贴到终端中,然后按 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 作业的 VPC 访问通道连接器,用于与 AlloyDB 数据库通信
- 用于创建 AlloyDB 数据库的 Cloud Run 作业
- GKE Autopilot 集群
./gke-lab-setup.sh
如果系统提示您授权,请点击“授权”以继续。
设置过程大约需要 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
探索控制台中的可用功能(查询数据分析、监控)。
查看 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
示例输出:
运行以下命令以存储集群的凭据:
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,查看最新构建的详细信息。
使用 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 Secrets 对象以存储数据库凭据,客户服务应用将使用这些凭据连接到数据库:
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
示例输出:
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"}'
多次运行上述命令以生成日志消息,稍后您可以在日志浏览器中查看这些消息。
查看客户记录
运行以下命令以查看创建的客户记录。
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 并查看已创建的工作负载和服务。
应用日志
打开日志浏览器,然后搜索包含“客户已存在”的日志文本。
5. 恭喜!
恭喜,您已完成此 Codelab!
所学内容:
- 如何创建 AlloyDB 数据库的专用实例
- 如何在连接到 AlloyDB 实例的 GKE Autopilot 集群上部署应用
后续步骤:
探索其他 Cymbal Eats Codelab:
- 使用 Eventarc 触发 Cloud Workflows
- 从 Cloud Storage 触发事件处理
- 从 Cloud Run 连接到 Private CloudSQL
- 从 Cloud Run 连接到全代管式数据库
- 使用 Identity-Aware Proxy (IAP) 保护无服务器应用
- 使用 Cloud Scheduler 触发 Cloud Run 作业
- 安全地部署到 Cloud Run
- 保护 Cloud Run 入站流量
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
若要避免产生费用,最简单的方法是删除您为本教程创建的项目。