算機(jī)工具類-容器和編排Skills】gcp-cloud-run 技能)
在GCP上構(gòu)建生產(chǎn)就緒無(wú)服務(wù)器應(yīng)用的專門(mén)技能。涵蓋Cloud Run服務(wù)(容器化)、Cloud Run Functions(事件驅(qū)動(dòng))、冷啟動(dòng)優(yōu)化和Pub/Sub事件驅(qū)動(dòng)架構(gòu)。下載地址Skill源碼下載地址agentic-awesome-skills/skills/gcp-cloud-run at main · sickn33/agentic-awesome-skills · GitHub技能概述gcp-cloud-run 技能是一個(gè)用于在GCP上構(gòu)建生產(chǎn)就緒無(wú)服務(wù)器應(yīng)用的技能。它涵蓋Cloud Run服務(wù)(容器化)、Cloud Run Functions(事件驅(qū)動(dòng))、冷啟動(dòng)優(yōu)化和Pub/Sub事件驅(qū)動(dòng)架構(gòu)幫助開(kāi)發(fā)者構(gòu)建高效、可擴(kuò)展的無(wú)服務(wù)器應(yīng)用。主要功能Cloud Run服務(wù)容器化Web服務(wù)和APICloud Run Functions事件驅(qū)動(dòng)函數(shù)冷啟動(dòng)優(yōu)化最小化冷啟動(dòng)延遲并發(fā)配置正確的并發(fā)設(shè)置Pub/Sub集成事件驅(qū)動(dòng)處理Cloud SQL連接安全數(shù)據(jù)庫(kù)連接核心原則Cloud Run用于容器Functions用于簡(jiǎn)單事件處理器使用啟動(dòng)CPU加速和最小實(shí)例優(yōu)化冷啟動(dòng)根據(jù)工作負(fù)載設(shè)置并發(fā)(從8開(kāi)始調(diào)整)內(nèi)存包括/tmp文件系統(tǒng) - 相應(yīng)規(guī)劃僅在需要時(shí)使用VPC Connector(增加延遲)容器應(yīng)快速啟動(dòng)且無(wú)狀態(tài)優(yōu)雅處理信號(hào)以實(shí)現(xiàn)干凈關(guān)閉Cloud Run服務(wù)模式何時(shí)使用Web應(yīng)用和API需要任何運(yùn)行時(shí)或庫(kù)具有多個(gè)端點(diǎn)的復(fù)雜服務(wù)無(wú)狀態(tài)容器化工作負(fù)載Dockerfile示例# Dockerfile - 多階段構(gòu)建以獲得更小的鏡像FROM node:20-slim AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --onlyproductionFROM node:20-slimWORKDIR /app# 僅復(fù)制生產(chǎn)依賴COPY --frombuilder /app/node_modules ./node_modulesCOPY src ./srcCOPY package.json ./# Cloud Run使用PORT環(huán)境變量ENV PORT8080EXPOSE 8080# 以非root用戶運(yùn)行USER nodeCMD [node, src/index.js]部署命令# 直接gcloud部署gcloud run deploy my-service \--source . \--region us-central1 \--allow-unauthenticated \--memory 512Mi \--cpu 1 \--min-instances 1 \--max-instances 100 \--concurrency 80 \--cpu-boostCloud Run Functions模式何時(shí)使用簡(jiǎn)單事件處理器Pub/Sub消息處理Cloud Storage觸發(fā)器HTTP webhooksHTTP函數(shù)示例// index.jsconst functions require(google-cloud/functions-framework);functions.http(helloHttp, (req, res) {const name req.query.name || req.body.name || World;res.send(Hello, ${name}!);});Pub/Sub函數(shù)示例const functions require(google-cloud/functions-framework);functions.cloudEvent(processPubSub, (cloudEvent) {// 解碼Pub/Sub消息const message cloudEvent.data.message;const data message.data ? JSON.parse(Buffer.from(message.data, base64).toString()) : {};console.log(Received message:, data);// 處理消息processMessage(data);});冷啟動(dòng)優(yōu)化優(yōu)化影響優(yōu)化措施效果Startup CPU Boost冷啟動(dòng)快50%Min Instances消除流量高峰的冷啟動(dòng)Distroless鏡像更小攻擊面更快拉取延遲初始化將重加載推遲到第一個(gè)請(qǐng)求優(yōu)化命令# 啟用啟動(dòng)CPU加速gcloud run deploy my-service \--cpu-boost \--region us-central1# 設(shè)置最小實(shí)例gcloud run deploy my-service \--min-instances 1 \--region us-central1并發(fā)配置并發(fā)指南并發(fā)值適用場(chǎng)景Concurrency1僅用于CPU密集型或不安全代碼Concurrency8-20內(nèi)存密集型工作負(fù)載Concurrency80默認(rèn)值適合I/O密集型Concurrency250最大值用于非常輕量的處理器Pub/Sub集成創(chuàng)建推送訂閱# 創(chuàng)建主題gcloud pubsub topics create orders# 創(chuàng)建到Cloud Run的推送訂閱gcloud pubsub subscriptions create orders-push \--topic orders \--push-endpoint https://my-service-xxx.run.app/pubsub \--ack-deadline 600處理Pub/Sub推送消息const express require(express);const app express();app.use(express.json());app.post(/pubsub, async (req, res) {// 驗(yàn)證請(qǐng)求來(lái)自Pub/Subif (!req.body.message) {return res.status(400).send(Invalid Pub/Sub message);}try {// 解碼消息數(shù)據(jù)const message req.body.message;const data message.data ? JSON.parse(Buffer.from(message.data, base64).toString()) : {};console.log(Processing order:, data);await processOrder(data);// 返回200確認(rèn)res.status(200).send(OK);} catch (error) {console.error(Processing failed:, error);// 返回500觸發(fā)重試res.status(500).send(Processing failed);}});Cloud SQL連接# 使用Cloud SQL連接部署gcloud run deploy my-service \--add-cloudsql-instances PROJECT:REGION:INSTANCE \--set-env-vars INSTANCE_CONNECTION_NAMEPROJECT:REGION:INSTANCE \--set-env-vars DB_NAMEmydb \--set-env-vars DB_USERmyuserSecret Manager集成# 創(chuàng)建密鑰echo -n my-secret-value | gcloud secrets create my-secret --data-file-# 作為環(huán)境變量掛載gcloud run deploy my-service \--update-secretsAPI_KEYmy-secret:latest# 作為文件卷掛載gcloud run deploy my-service \--update-secrets/secrets/api-keymy-secret:latest注意事項(xiàng)/tmp文件系統(tǒng)計(jì)入內(nèi)存Cloud Run使用內(nèi)存文件系統(tǒng)作為/tmp。寫(xiě)入/tmp的任何文件都會(huì)消耗容器的內(nèi)存分配。512MB容器下載200MB文件到/tmp后只剩約300MB給應(yīng)用。建議流式處理而非緩沖使用Cloud Storage處理大文件。并發(fā)1導(dǎo)致擴(kuò)展瓶頸設(shè)置并發(fā)為1意味著每個(gè)容器一次只處理一個(gè)請(qǐng)求。在流量高峰期間100個(gè)并發(fā)請(qǐng)求100個(gè)容器實(shí)例每個(gè)實(shí)例都有冷啟動(dòng)開(kāi)銷。建議僅在絕對(duì)必要時(shí)使用并發(fā)1。非請(qǐng)求處理時(shí)CPU被限制默認(rèn)情況下Cloud Run在不主動(dòng)處理請(qǐng)求時(shí)將CPU限制到接近零。建議使用--cpu-throttlingfalse啟用CPU始終分配或?qū)⒑笈_(tái)工作移至Cloud Tasks。