基于 Skaffold 的 Online Boutique 本地开发指南:microservices-demo 的构建、部署与调试实战
【免费下载链接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.项目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo
本文围绕 Online Boutique(
microservices-demo)的官方开发指南展开,完整讲解如何借助skaffold命令行工具在本地构建并运行这套由 10 余个微服务组成的云原生示例应用:既包含面向 Google Cloud 的 GKE 集群部署路径(Option 1),也覆盖 Minikube / Docker for Desktop / Kind 的本地集群方案(Option 2)。读完本文,你将掌握skaffold run、skaffold dev、skaffold delete的完整使用方式,理解仓库中skaffold.yaml的构建清单与配置画像(profile)结构,并能够在本地完成验证、端口转发与资源清理。
Online Boutique 微服务架构图
一、开发指南定位与前置条件
Online Boutique 是一个典型的“云优先”(cloud-first)微服务演示应用:前端提供 Web 商城页面,cartservice、productcatalogservice、checkoutservice、paymentservice、shippingservice、emailservice、currencyservice、recommendationservice、adservice等后端服务之间通过 gRPC 通信(协议定义见 protos/demo.proto),每个服务使用不同的语言实现(Go、C#、Node.js、Python、Java),并各自带有独立的Dockerfile。开发指南(docs/development-guide.md)的目的正是解决“如何在本机把这些服务统一构建起来并部署到 Kubernetes”这一核心问题——答案是使用 Skaffold 批量完成镜像构建与部署。
在开始之前,需要准备以下工具与环境:
Docker for Desktop:本地容器运行时,也是 Option 2(本地集群)的可选实现方式之一;
kubectl:Kubernetes 命令行客户端,用于与集群交互;如果走 GKE 路线,也可以通过
gcloud components install kubectl安装;skaffold 2.0.2+:官方建议安装最新版本。Skaffold 是本次开发流程的核心工具,负责“批量构建 Docker 镜像并部署到集群”这一整套流水线;
克隆仓库:
git clone https://github.com/GoogleCloudPlatform/microservices-demo cd microservices-demo/若选择 Option 1(GKE),还需要一个已启用 Google Container Registry(GCR)/ Artifact Registry(AR)的 Google Cloud 项目;
若选择 Option 2(本地集群),可选的集群工具包括Minikube与Kind。
二、Option 1:部署到 Google Kubernetes Engine(GKE)
如果你的目标是在接近生产环境的真实集群上运行这套应用,推荐使用 GKE。此路径适合已经使用 Google Cloud 的开发者,整个流程分为四步。
1. 创建 GKE 集群并让 kubectl 指向集群
首先启用 Kubernetes Engine API,随后使用gcloud创建一个 Autopilot 集群(这里以demo命名、区域us-central1为例),并确认kubectl已连接到该集群:
gcloud services enable container.googleapis.comgcloud container clusters create-auto demo --region=us-central1kubectl get nodes若你的集群启用了 Workload Identity,请额外参考 Google Cloud 官方关于启用 Workload Identity 的说明,确保后续部署与凭据获取正常。
2. 启用 Artifact Registry 并配置 Docker 认证
Skaffold 构建出的镜像需要推送到镜像仓库,本仓库默认使用 Artifact Registry(AR)。依次执行:
gcloud services enable artifactregistry.googleapis.comgcloud artifacts repositories create microservices-demo \ --repository-format=docker \ --location=us \gcloud auth configure-docker -qgcloud auth configure-docker会在本地配置 Docker CLI 对 AR 的认证,使后续docker push能够成功。
3. 使用 Skaffold 一键构建、推送并部署
在仓库根目录执行(将PROJECT_ID替换为你的 Google Cloud 项目 ID):
skaffold run --default-repo=us-docker.pkg.dev/PROJECT_ID/microservices-demo这条命令会依次完成三件事:
- 构建容器镜像:依据 skaffold.yaml 中
build.artifacts列出的全部服务逐一执行docker build; - 推送镜像到 Artifact Registry:镜像标签基于
--default-repo参数指定的仓库地址生成; - 应用 Kubernetes 清单:执行
kubectl apply部署./kubernetes-manifests目录下的全部 YAML(通过 Kustomize 组织,详见下文)。
故障排查:如果在 Google Cloud Shell 中遇到 “No space left on device”(磁盘空间不足)错误,可以改为把镜像构建放到云端——先启用 Cloud Build API,再执行:
skaffold run -p gcb --default-repo=us-docker.pkg.dev/[PROJECT_ID]/microservices-demo-p gcb会激活 skaffold.yaml 中名为gcb的 profile,将构建后端切换到googleCloudBuild,从而绕开本地磁盘限制(该 profile 使用 300 GB 磁盘、N1_HIGHCPU_32机器类型、超时 4000 秒,详见skaffold.yaml第 69~75 行)。
4. 获取外部 IP 并访问前端
部署完成后,通过以下命令找到前端负载均衡器的外部地址:
kubectl get service frontend-external然后在浏览器中访问http://EXTERNAL-IP即可看到 Online Boutique 商城页面。frontend.yaml 中定义了frontend-external这个LoadBalancer类型的 Service,将 80 端口映射到 frontend 容器的 8080 端口。
三、Option 2:本地集群部署
如果你没有 Google Cloud 环境,或者希望离线开发调试,可以使用本地 Kubernetes 集群。开发指南提供了三种经过验证的本地集群方案,任选其一即可。
方案 A:Minikube(Ubuntu Linux 下测试通过)
Minikube 是轻量级单节点集群。为确保整套微服务(尤其是资源占用较高的服务)能正常运行,本地集群至少需要:
- 4 核 CPU
- 4.0 GiB 内存
- 32 GB 磁盘空间
启动命令:
minikube start --cpus=4 --memory 4096 --disk-size 32g方案 B:Docker for Desktop(Mac / Windows 下测试通过)
在 Docker Desktop 的Preferences(设置)中:
- 勾选“Enable Kubernetes”启用内置的 Kubernetes 集群;
- 将CPUs设置为至少3,Memory设置为至少6.0 GiB;
- 在Disk选项卡中,磁盘空间设置为至少32 GB。
方案 C:Kind
Kind 在 Docker 容器中运行 Kubernetes 控制面,创建方式最简单:
kind create cluster本地集群的通用部署步骤
无论选择哪种本地集群,接下来的步骤完全一致:
运行
kubectl get nodes,确认kubectl已连接到对应集群的控制面;在仓库根目录执行:
skaffold run注意:首次运行会比较慢,可能耗时约 20 分钟(需要拉取基础镜像、编译各语言服务并构建镜像)。如果希望在重构代码时自动重建镜像并热更新部署,改用:
skaffold devskaffold dev会监听源码变化,一旦检测到文件改动便自动触发构建与重新部署,非常适合本地迭代开发;运行
kubectl get pods,确认所有 Pod 处于Running状态;由于本地集群通常没有外部负载均衡器,使用端口转发访问前端:
kubectl port-forward deployment/frontend 8080:8080浏览器访问
localhost:8080即可看到前端页面。
Online Boutique 前端商城页面(部署成功后的运行效果)
四、深入理解 skaffold.yaml:构建清单与配置画像
要熟练使用上述命令,理解仓库根目录的 skaffold.yaml 是关键。该文件声明了 Skaffold 的完整构建与部署行为,分为两个Config段。
主配置(app):构建全部核心服务
apiVersion: skaffold/v3 kind: Config metadata: name: app build: platforms: ["linux/amd64", "linux/arm64"] artifacts: - image: emailservice context: src/emailservice - image: productcatalogservice context: src/productcatalogservice ... - image: cartservice context: src/cartservice/src docker: dockerfile: Dockerfile - image: frontend context: src/frontend - image: adservice context: src/adservice tagPolicy: gitCommit: {} local: useDockerCLI: true useBuildkit: true manifests: kustomize: paths: - kubernetes-manifests deploy: kubectl: {}要点解读:
build.artifacts:以“镜像名 + 构建上下文”的形式列出全部服务。注意cartservice的上下文是src/cartservice/src(其Dockerfile位于该子目录,即 src/cartservice/src/Dockerfile),而其他服务的Dockerfile通常直接位于各自目录根,例如 src/frontend/Dockerfile;tagPolicy.gitCommit:镜像标签基于 Git commit 生成,保证每次构建的可追溯性;local.useDockerCLI/useBuildkit:使用本地 Docker CLI 与 BuildKit 进行构建,充分利用本机缓存;manifests.kustomize.paths:部署清单通过 Kustomize 组织,指向 kubernetes-manifests 目录——该目录下的 kustomization.yaml 汇总了全部服务的 YAML 资源,loadgenerator被注释掉,因为开发期间它由独立的 Skaffold 模块单独管理(见下文);deploy.kubectl:最终通过kubectl apply完成部署。
独立配置(loadgenerator):负载生成器
第二个Config(metadata.name: loadgenerator)通过requires依赖主配置,仅构建loadgenerator这一个镜像(上下文 src/loadgenerator),并直接使用原生 YAML 清单 kubernetes-manifests/loadgenerator.yaml 部署。这样在本地开发时可以单独控制是否注入模拟用户流量。
内置 profile
skaffold.yaml 定义了三个 profile,可按需组合激活:
| Profile | 激活方式 | 作用 |
|---|---|---|
gcb | skaffold run -p gcb | 将构建后端切换到 Google Cloud Build,无需本地 Docker,适合 Google Cloud Shell 等磁盘受限环境;缺点是 GCB 不缓存构建,每次从零开始,耗时较长 |
debug | skaffold debug(自动激活) | 将cartservice的Dockerfile替换为Dockerfile.debug,开启可调试构建 |
network-policies | skaffold run -p network-policies | 在 Kustomize 路径中追加 kustomize/components/network-policies 组件,为服务应用网络策略 |
其中debugprofile 体现了 Skaffold 与源码的深度集成:src/frontend/Dockerfile中通过ARG SKAFFOLD_GO_GCFLAGS接收 Skaffold 传入的调试编译参数,并设置GOTRACEBACK=single方便定位问题。
五、验证部署:从 Pod 状态到端口转发
无论使用哪种部署路径,验证环节都一致:
kubectl get pods正常情况下,你会看到adservice、cartservice、checkoutservice、currencyservice、emailservice、frontend、loadgenerator、paymentservice、productcatalogservice、recommendationservice、shippingservice以及 Redis(redis-cart)等 Pod 全部处于Running状态。
在 GKE 上,直接通过frontend-external的负载均衡 IP 访问;在本地集群中,则用:
kubectl port-forward deployment/frontend 8080:8080将 frontend Deployment 的 8080 端口转发到本机,随后访问localhost:8080。frontend 的容器端口与健康检查细节可参考 kubernetes-manifests/frontend.yaml:它以/_healthz作为就绪探针与存活探针路径,并注入了PRODUCT_CATALOG_SERVICE_ADDR、CURRENCY_SERVICE_ADDR、CART_SERVICE_ADDR等服务发现环境变量,用于在集群内定位各 gRPC 后端服务地址(如productcatalogservice:3550、checkoutservice:5050)。
六、扩展:如何添加一个新的微服务
开发指南指出,Online Boutique 的核心微服务集合已经比较完整、未来不太可能频繁变动,但你可能希望添加一个可选的辅助微服务来补充功能。完整的分步指引见 docs/adding-new-microservice.md,其核心流程包括:
- 在 src/ 目录下为服务创建新目录,命名即服务名;
- 按照既有微服务的约定放置源码(例如 Python 服务至少需要
README.md、入口main.py、依赖清单requirements.in与Dockerfile); - 编写
Dockerfile(可参考 src/frontend/Dockerfile 的多阶段构建与安全基线写法); - 在 kustomize/components/ 下新增组件目录,写入该服务的Deployment与Service清单,并保证镜像名与构建配置一致——kustomize/components/shopping-assistant/ 是一个现成的完整参考示例,它同时通过 patch 为
frontend注入ENABLE_ASSISTANT=true环境变量来启用新服务; - 将新组件加入根级 kustomize/kustomization.yaml 的
components列表; - 在根级 skaffold.yaml 的
build.artifacts中登记新服务,确保镜像能被批量构建; - 更新 helm-chart 的模板与默认 values(chart 版本信息见 helm-chart/Chart.yaml);
- 最后更新 README.md、docs/img 下的架构图或新增独立文档。
这套流程体现了“仓库即配置中心”的设计:skaffold.yaml负责构建编排,kustomize负责清单组合,Helm chart 提供可打包的发布形态,三者通过一致的镜像命名与服务名相互衔接。
七、清理部署
当你完成开发或演示后,如果应用是通过skaffold run部署的,可以一键清理全部已部署资源:
skaffold delete该命令会依据skaffold.yaml中的部署配置,删除之前skaffold run应用到集群的所有 Kubernetes 资源(包括 Deployment、Service 等),是本地反复迭代时的常用收尾操作。对于 GKE 路径,还可以在确认清理后删除整个集群以停止计费。
小结
本文完整复现了 docs/development-guide.md 的两条部署路径,并进一步剖析了 skaffold.yaml 的构建清单、profile 机制以及 src/frontend/Dockerfile 等源码层面的集成细节。核心要点可以概括为:GKE 上用skaffold run --default-repo=...一键上云,本地用skaffold run/skaffold dev快速迭代,skaffold delete完成清理。掌握这套流程后,你既能基于 Online Boutique 快速搭建可复现的演示环境,也能借助skaffold dev的自动重建能力高效地进行多语言微服务的本地开发与调试。
【免费下载链接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.项目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考