指南:microservices-demo 的構(gòu)建、部署與調(diào)試實(shí)戰(zhàn))
基于 Skaffold 的 Online Boutique 本地開發(fā)指南microservices-demo 的構(gòu)建、部署與調(diào)試實(shí)戰(zhàn)【免費(fèi)下載鏈接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo本文圍繞 Online Boutiquemicroservices-demo的官方開發(fā)指南展開完整講解如何借助skaffold命令行工具在本地構(gòu)建并運(yùn)行這套由 10 余個(gè)微服務(wù)組成的云原生示例應(yīng)用既包含面向 Google Cloud 的 GKE 集群部署路徑Option 1也覆蓋 Minikube / Docker for Desktop / Kind 的本地集群方案Option 2。讀完本文你將掌握skaffold run、skaffold dev、skaffold delete的完整使用方式理解倉庫中skaffold.yaml的構(gòu)建清單與配置畫像profile結(jié)構(gòu)并能夠在本地完成驗(yàn)證、端口轉(zhuǎn)發(fā)與資源清理。Online Boutique 微服務(wù)架構(gòu)圖一、開發(fā)指南定位與前置條件Online Boutique 是一個(gè)典型的“云優(yōu)先”cloud-first微服務(wù)演示應(yīng)用前端提供 Web 商城頁面cartservice、productcatalogservice、checkoutservice、paymentservice、shippingservice、emailservice、currencyservice、recommendationservice、adservice等后端服務(wù)之間通過 gRPC 通信協(xié)議定義見 protos/demo.proto每個(gè)服務(wù)使用不同的語言實(shí)現(xiàn)Go、C#、Node.js、Python、Java并各自帶有獨(dú)立的Dockerfile。開發(fā)指南docs/development-guide.md的目的正是解決“如何在本機(jī)把這些服務(wù)統(tǒng)一構(gòu)建起來并部署到 Kubernetes”這一核心問題——答案是使用 Skaffold 批量完成鏡像構(gòu)建與部署。在開始之前需要準(zhǔn)備以下工具與環(huán)境Docker for Desktop本地容器運(yùn)行時(shí)也是 Option 2本地集群的可選實(shí)現(xiàn)方式之一kubectlKubernetes 命令行客戶端用于與集群交互如果走 GKE 路線也可以通過gcloud components install kubectl安裝skaffold 2.0.2官方建議安裝最新版本。Skaffold 是本次開發(fā)流程的核心工具負(fù)責(zé)“批量構(gòu)建 Docker 鏡像并部署到集群”這一整套流水線克隆倉庫git clone https://github.com/GoogleCloudPlatform/microservices-demo cd microservices-demo/若選擇 Option 1GKE還需要一個(gè)已啟用 Google Container RegistryGCR/ Artifact RegistryAR的 Google Cloud 項(xiàng)目若選擇 Option 2本地集群可選的集群工具包括Minikube與Kind。二、Option 1部署到 Google Kubernetes EngineGKE如果你的目標(biāo)是在接近生產(chǎn)環(huán)境的真實(shí)集群上運(yùn)行這套應(yīng)用推薦使用 GKE。此路徑適合已經(jīng)使用 Google Cloud 的開發(fā)者整個(gè)流程分為四步。1. 創(chuàng)建 GKE 集群并讓 kubectl 指向集群首先啟用 Kubernetes Engine API隨后使用gcloud創(chuàng)建一個(gè) Autopilot 集群這里以demo命名、區(qū)域us-central1為例并確認(rèn)kubectl已連接到該集群gcloud services enable container.googleapis.comgcloud container clusters create-auto demo --regionus-central1kubectl get nodes若你的集群啟用了 Workload Identity請額外參考 Google Cloud 官方關(guān)于啟用 Workload Identity 的說明確保后續(xù)部署與憑據(jù)獲取正常。2. 啟用 Artifact Registry 并配置 Docker 認(rèn)證Skaffold 構(gòu)建出的鏡像需要推送到鏡像倉庫本倉庫默認(rèn)使用 Artifact RegistryAR。依次執(zhí)行g(shù)cloud services enable artifactregistry.googleapis.comgcloud artifacts repositories create microservices-demo \ --repository-formatdocker \ --locationus \gcloud auth configure-docker -qgcloud auth configure-docker會(huì)在本地配置 Docker CLI 對 AR 的認(rèn)證使后續(xù)docker push能夠成功。3. 使用 Skaffold 一鍵構(gòu)建、推送并部署在倉庫根目錄執(zhí)行將PROJECT_ID替換為你的 Google Cloud 項(xiàng)目 IDskaffold run --default-repous-docker.pkg.dev/PROJECT_ID/microservices-demo這條命令會(huì)依次完成三件事構(gòu)建容器鏡像依據(jù) skaffold.yaml 中build.artifacts列出的全部服務(wù)逐一執(zhí)行docker build推送鏡像到 Artifact Registry鏡像標(biāo)簽基于--default-repo參數(shù)指定的倉庫地址生成應(yīng)用 Kubernetes 清單執(zhí)行kubectl apply部署./kubernetes-manifests目錄下的全部 YAML通過 Kustomize 組織詳見下文。故障排查如果在 Google Cloud Shell 中遇到 “No space left on device”磁盤空間不足錯(cuò)誤可以改為把鏡像構(gòu)建放到云端——先啟用 Cloud Build API再執(zhí)行skaffold run -p gcb --default-repous-docker.pkg.dev/[PROJECT_ID]/microservices-demo-p gcb會(huì)激活 skaffold.yaml 中名為gcb的 profile將構(gòu)建后端切換到googleCloudBuild從而繞開本地磁盤限制該 profile 使用 300 GB 磁盤、N1_HIGHCPU_32機(jī)器類型、超時(shí) 4000 秒詳見skaffold.yaml第 6975 行。4. 獲取外部 IP 并訪問前端部署完成后通過以下命令找到前端負(fù)載均衡器的外部地址kubectl get service frontend-external然后在瀏覽器中訪問http://EXTERNAL-IP即可看到 Online Boutique 商城頁面。frontend.yaml 中定義了frontend-external這個(gè)LoadBalancer類型的 Service將 80 端口映射到 frontend 容器的 8080 端口。三、Option 2本地集群部署如果你沒有 Google Cloud 環(huán)境或者希望離線開發(fā)調(diào)試可以使用本地 Kubernetes 集群。開發(fā)指南提供了三種經(jīng)過驗(yàn)證的本地集群方案任選其一即可。方案 AMinikubeUbuntu Linux 下測試通過Minikube 是輕量級單節(jié)點(diǎn)集群。為確保整套微服務(wù)尤其是資源占用較高的服務(wù)能正常運(yùn)行本地集群至少需要4 核 CPU4.0 GiB 內(nèi)存32 GB 磁盤空間啟動(dòng)命令minikube start --cpus4 --memory 4096 --disk-size 32g方案 BDocker for DesktopMac / Windows 下測試通過在 Docker Desktop 的Preferences設(shè)置中勾選“Enable Kubernetes”啟用內(nèi)置的 Kubernetes 集群將CPUs設(shè)置為至少3Memory設(shè)置為至少6.0 GiB在Disk選項(xiàng)卡中磁盤空間設(shè)置為至少32 GB。方案 CKindKind 在 Docker 容器中運(yùn)行 Kubernetes 控制面創(chuàng)建方式最簡單kind create cluster本地集群的通用部署步驟無論選擇哪種本地集群接下來的步驟完全一致運(yùn)行kubectl get nodes確認(rèn)kubectl已連接到對應(yīng)集群的控制面在倉庫根目錄執(zhí)行skaffold run注意首次運(yùn)行會(huì)比較慢可能耗時(shí)約 20 分鐘需要拉取基礎(chǔ)鏡像、編譯各語言服務(wù)并構(gòu)建鏡像。如果希望在重構(gòu)代碼時(shí)自動(dòng)重建鏡像并熱更新部署改用skaffold devskaffold dev會(huì)監(jiān)聽源碼變化一旦檢測到文件改動(dòng)便自動(dòng)觸發(fā)構(gòu)建與重新部署非常適合本地迭代開發(fā)運(yùn)行kubectl get pods確認(rèn)所有 Pod 處于Running狀態(tài)由于本地集群通常沒有外部負(fù)載均衡器使用端口轉(zhuǎn)發(fā)訪問前端kubectl port-forward deployment/frontend 8080:8080瀏覽器訪問localhost:8080即可看到前端頁面。Online Boutique 前端商城頁面部署成功后的運(yùn)行效果四、深入理解 skaffold.yaml構(gòu)建清單與配置畫像要熟練使用上述命令理解倉庫根目錄的 skaffold.yaml 是關(guān)鍵。該文件聲明了 Skaffold 的完整構(gòu)建與部署行為分為兩個(gè)Config段。主配置app構(gòu)建全部核心服務(wù)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: {}要點(diǎn)解讀build.artifacts以“鏡像名 構(gòu)建上下文”的形式列出全部服務(wù)。注意cartservice的上下文是src/cartservice/src其Dockerfile位于該子目錄即 src/cartservice/src/Dockerfile而其他服務(wù)的Dockerfile通常直接位于各自目錄根例如 src/frontend/DockerfiletagPolicy.gitCommit鏡像標(biāo)簽基于 Git commit 生成保證每次構(gòu)建的可追溯性local.useDockerCLI/useBuildkit使用本地 Docker CLI 與 BuildKit 進(jìn)行構(gòu)建充分利用本機(jī)緩存manifests.kustomize.paths部署清單通過 Kustomize 組織指向 kubernetes-manifests 目錄——該目錄下的 kustomization.yaml 匯總了全部服務(wù)的 YAML 資源loadgenerator被注釋掉因?yàn)殚_發(fā)期間它由獨(dú)立的 Skaffold 模塊單獨(dú)管理見下文deploy.kubectl最終通過kubectl apply完成部署。獨(dú)立配置loadgenerator負(fù)載生成器第二個(gè)Configmetadata.name: loadgenerator通過requires依賴主配置僅構(gòu)建loadgenerator這一個(gè)鏡像上下文 src/loadgenerator并直接使用原生 YAML 清單 kubernetes-manifests/loadgenerator.yaml 部署。這樣在本地開發(fā)時(shí)可以單獨(dú)控制是否注入模擬用戶流量。內(nèi)置 profileskaffold.yaml 定義了三個(gè) profile可按需組合激活Profile激活方式作用gcbskaffold run -p gcb將構(gòu)建后端切換到 Google Cloud Build無需本地 Docker適合 Google Cloud Shell 等磁盤受限環(huán)境缺點(diǎn)是 GCB 不緩存構(gòu)建每次從零開始耗時(shí)較長debugskaffold debug自動(dòng)激活將cartservice的Dockerfile替換為Dockerfile.debug開啟可調(diào)試構(gòu)建network-policiesskaffold run -p network-policies在 Kustomize 路徑中追加 kustomize/components/network-policies 組件為服務(wù)應(yīng)用網(wǎng)絡(luò)策略其中debugprofile 體現(xiàn)了 Skaffold 與源碼的深度集成src/frontend/Dockerfile中通過ARG SKAFFOLD_GO_GCFLAGS接收 Skaffold 傳入的調(diào)試編譯參數(shù)并設(shè)置GOTRACEBACKsingle方便定位問題。五、驗(yàn)證部署從 Pod 狀態(tài)到端口轉(zhuǎn)發(fā)無論使用哪種部署路徑驗(yàn)證環(huán)節(jié)都一致kubectl get pods正常情況下你會(huì)看到adservice、cartservice、checkoutservice、currencyservice、emailservice、frontend、loadgenerator、paymentservice、productcatalogservice、recommendationservice、shippingservice以及 Redisredis-cart等 Pod 全部處于Running狀態(tài)。在 GKE 上直接通過frontend-external的負(fù)載均衡 IP 訪問在本地集群中則用kubectl port-forward deployment/frontend 8080:8080將 frontend Deployment 的 8080 端口轉(zhuǎn)發(fā)到本機(jī)隨后訪問localhost:8080。frontend 的容器端口與健康檢查細(xì)節(jié)可參考 kubernetes-manifests/frontend.yaml它以/_healthz作為就緒探針與存活探針路徑并注入了PRODUCT_CATALOG_SERVICE_ADDR、CURRENCY_SERVICE_ADDR、CART_SERVICE_ADDR等服務(wù)發(fā)現(xiàn)環(huán)境變量用于在集群內(nèi)定位各 gRPC 后端服務(wù)地址如productcatalogservice:3550、checkoutservice:5050。六、擴(kuò)展如何添加一個(gè)新的微服務(wù)開發(fā)指南指出Online Boutique 的核心微服務(wù)集合已經(jīng)比較完整、未來不太可能頻繁變動(dòng)但你可能希望添加一個(gè)可選的輔助微服務(wù)來補(bǔ)充功能。完整的分步指引見 docs/adding-new-microservice.md其核心流程包括在 src/ 目錄下為服務(wù)創(chuàng)建新目錄命名即服務(wù)名按照既有微服務(wù)的約定放置源碼例如 Python 服務(wù)至少需要README.md、入口main.py、依賴清單requirements.in與Dockerfile編寫Dockerfile可參考 src/frontend/Dockerfile 的多階段構(gòu)建與安全基線寫法在 kustomize/components/ 下新增組件目錄寫入該服務(wù)的Deployment與Service清單并保證鏡像名與構(gòu)建配置一致——kustomize/components/shopping-assistant/ 是一個(gè)現(xiàn)成的完整參考示例它同時(shí)通過 patch 為frontend注入ENABLE_ASSISTANTtrue環(huán)境變量來啟用新服務(wù)將新組件加入根級 kustomize/kustomization.yaml 的components列表在根級 skaffold.yaml 的build.artifacts中登記新服務(wù)確保鏡像能被批量構(gòu)建更新 helm-chart 的模板與默認(rèn) valueschart 版本信息見 helm-chart/Chart.yaml最后更新 README.md、docs/img 下的架構(gòu)圖或新增獨(dú)立文檔。這套流程體現(xiàn)了“倉庫即配置中心”的設(shè)計(jì)skaffold.yaml負(fù)責(zé)構(gòu)建編排kustomize負(fù)責(zé)清單組合Helm chart 提供可打包的發(fā)布形態(tài)三者通過一致的鏡像命名與服務(wù)名相互銜接。七、清理部署當(dāng)你完成開發(fā)或演示后如果應(yīng)用是通過skaffold run部署的可以一鍵清理全部已部署資源skaffold delete該命令會(huì)依據(jù)skaffold.yaml中的部署配置刪除之前skaffold run應(yīng)用到集群的所有 Kubernetes 資源包括 Deployment、Service 等是本地反復(fù)迭代時(shí)的常用收尾操作。對于 GKE 路徑還可以在確認(rèn)清理后刪除整個(gè)集群以停止計(jì)費(fèi)。小結(jié)本文完整復(fù)現(xiàn)了 docs/development-guide.md 的兩條部署路徑并進(jìn)一步剖析了 skaffold.yaml 的構(gòu)建清單、profile 機(jī)制以及 src/frontend/Dockerfile 等源碼層面的集成細(xì)節(jié)。核心要點(diǎn)可以概括為GKE 上用skaffold run --default-repo...一鍵上云本地用skaffold run/skaffold dev快速迭代skaffold delete完成清理。掌握這套流程后你既能基于 Online Boutique 快速搭建可復(fù)現(xiàn)的演示環(huán)境也能借助skaffold dev的自動(dòng)重建能力高效地進(jìn)行多語言微服務(wù)的本地開發(fā)與調(diào)試。【免費(fèi)下載鏈接】microservices-demoSample cloud-first application with 10 microservices showcasing Kubernetes, Istio, and gRPC.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mi/microservices-demo創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考