使用 Terraform 在 GKE 上部署 Online Boutique 微服务示例应用:完整实战指南
使用 Terraform 在 GKE 上部署 Online Boutique 微服务示例应用完整实战指南【免费下载链接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.项目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo导读Online Boutique 是一个包含 10 个微服务的云优先示例电商应用架构基于 Kubernetes、Istio 与 gRPC本指南以仓库中 terraform/README.md 为核心讲解如何使用 Terraform 将其完整部署到 Google Kubernetes EngineGKE集群从初始化 GCP 项目、配置terraform.tfvars、执行init/plan/apply三步流水线到可选集成 Cloud MemorystoreRedis、获取前端外部 IP 验证访问再到安全销毁资源释放云账单。读完本文你将掌握一套可复用的“Terraform 驱动 GKE 微服务 Kustomize”自动化部署与清理的完整方法。前置条件一个已启用结算的 GCP 项目部署前只需一项硬性前置条件在 Google Cloud 上新建或复用已有项目确保该项目已启用结算billing否则后续创建 GKE 集群、Memorystore 实例等资源都会失败。项目中各服务运行所需的 API 无需手工逐个开启——Terraform 脚本会在部署过程中自动启用详见下文 main.tf 分析。认识terraform/目录脚本由哪些文件构成在动手执行命令之前先理解仓库 terraform/ 目录的完整结构这有助于你在出问题时快速定位terraform/ ├── README.md # 部署与清理指南本文讲解对象 ├── main.tf # 核心启用 API、创建 GKE 集群、下发并等待应用 ├── variables.tf # 全部可配置变量及默认值 ├── providers.tf # Terraform 与 google provider 版本约束 ├── memorystore.tf # 可选MemorystoreRedis实例及 Kustomize 改写 ├── output.tf # apply 后输出的集群信息 └── terraform.tfvars # 用户实际填写的变量文件gcp_project_id、memorystoremain.tf自动化部署的四个阶段main.tf 用模块化方式编排了完整部署链路可按执行顺序拆解为四个阶段阶段一启用 Google Cloud API。借助terraform-google-modules/project-factory的project_services子模块版本~ 18.0开启以下 APIlocals { base_apis [ container.googleapis.com, # GKE 集群 monitoring.googleapis.com, # 监控 cloudtrace.googleapis.com, # 链路追踪 cloudprofiler.googleapis.com # 性能剖析 ] memorystore_apis [redis.googleapis.com] }值得注意activate_apis使用concat(local.base_apis, var.memorystore ? local.memorystore_apis : [])即只有把memorystore置为true时才会额外启用redis.googleapis.com默认最小化授权范围。阶段二创建 Autopilot GKE 集群。google_container_cluster.my_cluster使用enable_autopilot true托管集群无需管理节点池同时显式声明空ip_allocation_policyVPC-native / IP 别名模式这是后续连接 Memorystore 的必要条件并依赖阶段一完成后再创建resource google_container_cluster my_cluster { name var.name location var.region enable_autopilot true ip_allocation_policy { } # deletion_protection false # 默认受保护见「清理」章节 depends_on [module.enable_google_apis] }阶段三拉取集群凭据并下发应用。terraform-google-modules/gcloud模块~ 4.0执行gcloud container clusters get-credentials获取 kubectl 凭据随后null_resource.apply_deployment通过 local-exec 运行kubectl apply -k ${var.filepath_manifest} -n ${var.namespace}——注意这里用的是Kustomize 渲染目录默认../kustomize/而非单个 YAML具体机制见下文“应用清单来自 Kustomize”。阶段四等待就绪。null_resource.wait_conditions依次等待 metrics API 可用与全部 Pod ready超时 280 秒确保terraform apply结束时应用已处于可用状态kubectl wait --forconditionAVAILABLE apiservice/v1beta1.metrics.k8s.io --timeout180s kubectl wait --forconditionready pods --all -n ${var.namespace} --timeout280sproviders.tf 与 output.tfproviders.tf 固定使用hashicorp/google提供器7.43.0并把项目与区域注入 providerterraform { required_providers { google { source hashicorp/google version 7.43.0 } } } provider google { project var.gcp_project_id region var.region }output.tf 在 apply 后输出cluster_location与cluster_name便于后续 kubectl 操作时引用集群信息。可配置变量速查variables.tf 定义了全部变量。除gcp_project_id与memorystore需要用户在terraform.tfvars中显式填写外其余均有默认值变量类型默认值说明gcp_project_idstring必填要部署到的 GCP 项目 IDnamestringonline-boutique新建 GKE 集群的名称regionstringus-central1集群所在区域namespacestringdefault应用部署的 Kubernetes Namespacefilepath_manifeststring../kustomize/Kustomize 清单目录路径memorystorebool必填是否用 Cloud MemorystoreRedis替换集群内 Redis 缓存默认 terraform.tfvars 内容如下只需替换gcp_project_id即可开始gcp_project_id project_id_here memorystore false部署 Online Boutique六步实操第 1 步克隆仓库并进入 terraform 目录git clone https://github.com/GoogleCloudPlatform/microservices-demo.git cd microservices-demo/terraform第 2 步填写项目 ID并可选开启 Memorystore打开terraform.tfvars把project_id_here替换为你的 GCP 项目 ID即gcp_project_id变量。可选若希望为购物车缓存预置托管的 Cloud MemorystoreRedis实例将memorystore false改为memorystore true。该选项的完整收益与内部原理见下文专节。第 3 步初始化 Terraformterraform init此命令会下载googleprovider 与两个 Google 官方 Terraform 模块project-factory、gcloud并生成.terraform工作目录与锁定文件。第 4 步预览将要创建的资源terraform planplan会输出将创建的 API 服务、Autopilot GKE 集群、凭据模块以及两个null_resource执行器若memorystore true还会额外出现google_redis_instance.redis-cart与 kustomization 改写资源。建议在apply前仔细核对计划确认项目 ID 无误。第 5 步创建资源并部署应用terraform apply若出现确认提示输入yes并回车该步骤大约需要 10 分钟期间不要中断进程。时间主要消耗在 GKE 集群创建、镜像拉取与 Pod 就绪等待上apply 结束时脚本已通过kubectl wait确认全部 Pod ready可直接进入访问验证。第 6 步获取前端外部 IP 访问应用应用部署后前端对外暴露的入口是frontend-external这个LoadBalancer类型的 Service见 kubernetes-manifests/frontend.yaml 中type: LoadBalancer、端口 80 → 8080 的定义。两种方式获取其 Endpoint方式一kubectl 命令行kubectl get service frontend-external | awk {print $4}输出即为外部 IP在浏览器中打开http://该IP即可访问 Online Boutique 商店首页。方式二Cloud Console 图形界面在 Google Cloud Console 中依次进入Kubernetes Engine → Services Ingress找到frontend-external对应的 Endpoint 并访问。可选集成memorystore true 时发生了什么这是原文档中唯一的可选配置项其背后是一套完整的“托管 Redis 替换集群内 Redis”的自动化逻辑值得深入理解。默认行为集群内的 redis-cart默认情况下购物车服务cartservice将购物车数据序列化存储到集群内部署的 Redis。cartservice 通过环境变量REDIS_ADDR读取 Redis 地址见 src/cartservice/src/Startup.cs 中Configuration[REDIS_ADDR]的读取逻辑。将缓存外置到托管服务 Memorystore可带来更强的韧性独立于集群生命周期与更高的安全性受管的身份与网络隔离。memorystore.tf托管实例 Kustomize 自动化改写当memorystore true时memorystore.tf 会执行两步操作创建托管 Redis 实例通过count var.memorystore ? 1 : 0控制开关resource google_redis_instance redis-cart { name redis-cart memory_size_gb 1 region var.region count var.memorystore ? 1 : 0 redis_version REDIS_7_0 project var.gcp_project_id depends_on [module.enable_google_apis] }用 sed 把实例的 host:port 写入 Kustomize 组件使 cartservice 指向外部 Rediscommand sed -i \s/REDIS_CONNECTION_STRING/${google_redis_instance.redis-cart[0].host}:${google_redis_instance.redis-cart[0].port}/g\ ../kustomize/components/memorystore/kustomization.yamlmemorystore 组件 本身是三段 patch把 cartservice 的REDIS_ADDR环境变量替换为REDIS_CONNECTION_STRING占位符随后被 sed 替换为真实地址并删除不再使用的redis-cartDeployment 与 Servicepatches: - patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: cartservice spec: template: spec: containers: - name: server env: - name: REDIS_ADDR value: REDIS_CONNECTION_STRING - patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: redis-cart $patch: delete - patch: |- apiVersion: v1 kind: Service metadata: name: redis-cart $patch: delete连接 Memorystore 的两个硬性前提GKE 集群与 Memorystore 实例必须处于同一区域并使用同一 VPC 网络集群必须启用VPC-native / IP 别名Autopilot 集群默认满足且 main.tf 中显式声明的空ip_allocation_policy正是为此准备。不用 Terraform 的等价手动方案若不想走 Terraform也可以参照 memorystore 组件文档 手动完成同样效果gcloud redis instances create redis-cart创建实例kustomize edit add component components/memorystore把组件挂到 kustomize/kustomization.yaml再用sed替换连接串最后用kubectl kustomize .本地渲染或kubectl apply -k .直接部署。应用清单来自 Kustomizefilepath_manifest 的秘密terraform apply最终执行的是kubectl apply -k ../kustomize/其渲染来源是 kustomize/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - base components: # - components/cymbal-branding # - components/google-cloud-operations # - components/memorystore # ...其余组件按需取消注释base见 kustomize/base/kustomization.yaml聚合了全部 11 个微服务清单adservice、cartservice、checkoutservice、currencyservice、emailservice、frontend、loadgenerator、paymentservice、productcatalogservice、recommendationservice、shippingservice。components目录则提供了品牌化、云运维、Memorystore、网络策略等可选增强默认全部关闭一旦你在 tfvars 中开启memorystoreTerraform 就会动态激活并改写其中的 memorystore 组件——这是整套方案“配置即自动化”的落点。清理资源避免持续产生云账单为避免示例应用持续计费可删除整个项目或在保留项目的前提下删除单独资源。删除单独资源的官方流程如下回到terraform/目录为google_container_clusterGKE 集群把deletion_protection设为false——该行默认被注释掉# deletion_protection false正因如此直接terraform destroy会被保护机制拦截。取消注释并重新应用以更新 Terraform 状态# 取消注释deletion_protection false sed -i s/# deletion_protection/deletion_protection/g main.tf # 重新 apply 以更新状态 terraform apply销毁全部资源terraform destroy若出现确认提示输入yes并回车。destroy会按依赖逆序清理先删除应用下发与等待用的null_resource再删除 Memorystore 实例如启用、GKE 集群最后按需关闭 API 服务main.tf 中disable_services_on_destroy false表示不会在销毁时强制禁用已启用的 API避免影响项目内其他资源。注意事项与排障提示耗时预期terraform apply约 10 分钟主要瓶颈在集群创建与 Pod 镜像拉取若wait_conditions的 280 秒超时被触发而报错通常是镜像拉取慢或资源配额不足可适当调大超时后重跑。不要中断 apply中断会导致状态不一致下次执行前建议先terraform plan核对。项目 ID 写错是最高频错误务必用真实 GCP 项目 ID非项目名称替换terraform.tfvars中的占位符。Memorystore 连接失败时优先检查区域一致性、VPC 网络一致性与集群是否 VPC-nativeAutopilot 默认满足。仓库中 docs/deploystack.md、docs/cloudshell-tutorial.md 等文档提供了其他部署路径可作对比参考本指南的 Terraform 路径强调“基础设施即代码”的可重复性与一键清理能力。小结通过 terraform/ 目录下约六个文件即可完成“启用 API → 创建 Autopilot GKE 集群 → 获取凭据 → Kustomize 下发 11 个微服务 → 等待就绪”的全自动化部署并可通过单个memorystore开关一键切换到托管 Redis 缓存。掌握这套模式后你可以把它复用到任何“Terraform GKE Kustomize”的生产化部署场景中。【免费下载链接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.项目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考