news 2026/9/13 5:49:05

基于 Skaffold 的 Online Boutique 本地开发指南:microservices-demo 的构建、部署与调试实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 Skaffold 的 Online Boutique 本地开发指南:microservices-demo 的构建、部署与调试实战

基于 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 runskaffold devskaffold delete的完整使用方式,理解仓库中skaffold.yaml的构建清单与配置画像(profile)结构,并能够在本地完成验证、端口转发与资源清理。

Online Boutique 微服务架构图

一、开发指南定位与前置条件

Online Boutique 是一个典型的“云优先”(cloud-first)微服务演示应用:前端提供 Web 商城页面,cartserviceproductcatalogservicecheckoutservicepaymentserviceshippingserviceemailservicecurrencyservicerecommendationserviceadservice等后端服务之间通过 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(本地集群),可选的集群工具包括MinikubeKind

二、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.com
gcloud container clusters create-auto demo --region=us-central1
kubectl get nodes

若你的集群启用了 Workload Identity,请额外参考 Google Cloud 官方关于启用 Workload Identity 的说明,确保后续部署与凭据获取正常。

2. 启用 Artifact Registry 并配置 Docker 认证

Skaffold 构建出的镜像需要推送到镜像仓库,本仓库默认使用 Artifact Registry(AR)。依次执行:

gcloud services enable artifactregistry.googleapis.com
gcloud artifacts repositories create microservices-demo \ --repository-format=docker \ --location=us \
gcloud auth configure-docker -q

gcloud 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设置为至少3Memory设置为至少6.0 GiB
  • Disk选项卡中,磁盘空间设置为至少32 GB

方案 C:Kind

Kind 在 Docker 容器中运行 Kubernetes 控制面,创建方式最简单:

kind create cluster

本地集群的通用部署步骤

无论选择哪种本地集群,接下来的步骤完全一致:

  1. 运行kubectl get nodes,确认kubectl已连接到对应集群的控制面;

  2. 在仓库根目录执行:

    skaffold run

    注意:首次运行会比较慢,可能耗时约 20 分钟(需要拉取基础镜像、编译各语言服务并构建镜像)。如果希望在重构代码时自动重建镜像并热更新部署,改用:

    skaffold dev

    skaffold dev会监听源码变化,一旦检测到文件改动便自动触发构建与重新部署,非常适合本地迭代开发;

  3. 运行kubectl get pods,确认所有 Pod 处于Running状态;

  4. 由于本地集群通常没有外部负载均衡器,使用端口转发访问前端:

    kubectl port-forward deployment/frontend 8080:8080
  5. 浏览器访问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):负载生成器

第二个Configmetadata.name: loadgenerator)通过requires依赖主配置,仅构建loadgenerator这一个镜像(上下文 src/loadgenerator),并直接使用原生 YAML 清单 kubernetes-manifests/loadgenerator.yaml 部署。这样在本地开发时可以单独控制是否注入模拟用户流量。

内置 profile

skaffold.yaml 定义了三个 profile,可按需组合激活:

Profile激活方式作用
gcbskaffold run -p gcb将构建后端切换到 Google Cloud Build,无需本地 Docker,适合 Google Cloud Shell 等磁盘受限环境;缺点是 GCB 不缓存构建,每次从零开始,耗时较长
debugskaffold debug(自动激活)cartserviceDockerfile替换为Dockerfile.debug,开启可调试构建
network-policiesskaffold 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

正常情况下,你会看到adservicecartservicecheckoutservicecurrencyserviceemailservicefrontendloadgeneratorpaymentserviceproductcatalogservicerecommendationserviceshippingservice以及 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_ADDRCURRENCY_SERVICE_ADDRCART_SERVICE_ADDR等服务发现环境变量,用于在集群内定位各 gRPC 后端服务地址(如productcatalogservice:3550checkoutservice:5050)。

六、扩展:如何添加一个新的微服务

开发指南指出,Online Boutique 的核心微服务集合已经比较完整、未来不太可能频繁变动,但你可能希望添加一个可选的辅助微服务来补充功能。完整的分步指引见 docs/adding-new-microservice.md,其核心流程包括:

  1. 在 src/ 目录下为服务创建新目录,命名即服务名;
  2. 按照既有微服务的约定放置源码(例如 Python 服务至少需要README.md、入口main.py、依赖清单requirements.inDockerfile);
  3. 编写Dockerfile(可参考 src/frontend/Dockerfile 的多阶段构建与安全基线写法);
  4. 在 kustomize/components/ 下新增组件目录,写入该服务的DeploymentService清单,并保证镜像名与构建配置一致——kustomize/components/shopping-assistant/ 是一个现成的完整参考示例,它同时通过 patch 为frontend注入ENABLE_ASSISTANT=true环境变量来启用新服务;
  5. 将新组件加入根级 kustomize/kustomization.yaml 的components列表;
  6. 在根级 skaffold.yaml 的build.artifacts中登记新服务,确保镜像能被批量构建;
  7. 更新 helm-chart 的模板与默认 values(chart 版本信息见 helm-chart/Chart.yaml);
  8. 最后更新 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 5:48:20

嵌入式全栈能力图谱:从STM32裸机到Linux驱动与AI部署

1. 这套“7980元嵌入式教程”到底值不值?一个干了12年嵌入式的老兵拆解真实价值 我带过37个应届生转岗嵌入式,也给6家汽车电子、工业控制、医疗设备公司做过技术顾问。看到这个标题——“(已离职)冒死上传!已经替大家…

作者头像 李华
网站建设 2026/9/13 5:47:36

电子制造AI质检闭环:YOLO定制检测+轻量大模型理解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:47:06

上网行为审计软件怎么选?7款主流产品功能与部署实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:45:44

ASM-HEMT参数提取与物理模型验证实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:44:41

千笔论文写作工具:AI如何提升学术写作效率与质量

1. 论文写作工具的市场现状与痛点分析学术写作领域近年来正经历着前所未有的数字化变革。根据2023年全球学术出版协会的报告,超过87%的研究人员表示在论文撰写过程中使用过至少一种数字化辅助工具。这种趋势背后反映的是研究者们对高效写作工具的迫切需求——既要保…

作者头像 李华
网站建设 2026/9/13 5:39:26

京东销量预测源码拆解:特征工程与RNN/GBDT融合实践

简介:一套基于深度学习的京东商品销量预测设计源码,面向电商数据挖掘与深度学习开发者,提供从数据清洗、特征工程到RNN建模、评估与提交结果的全流程实现。资源共51个文件,压缩包约6.96MB,包含10个Python源码文件、10个…

作者头像 李华