GCP Cloud Run容器部署教程
Google Cloud Run 是 GCP 提供的全托管无服务器容器运行平台,它让你无需管理任何基础设施即可运行容器化应用。Cloud Run 结合了容器的灵活性和无服务器的便捷性,是现代云原生应用的理想选择。本教程将带你从零开始,完成一个容器化应用到 Cloud Run 的全流程部署。
Cloud Run 核心概念
Cloud Run 基于 Knative 开源框架构建,提供以下核心特性:
- 全托管:Google 负责底层基础设施、安全补丁和运行时维护
- 自动扩缩:从零到数千个实例自动扩缩,空闲时缩容到零
- 按用量计费:仅按实际处理的请求数和 CPU/内存使用量付费
- 容器原生:支持任何语言、任何框架,只要能打包成容器即可
- HTTPS 默认:自动配置 SSL 证书和自定义域名
Cloud Run 定价
| 资源项 | 免费额度 | 超出后价格 | |--------|----------|------------| | vCPU | 每月 2 个 vCPU-秒/秒 | $0.00004000/vCPU-秒 | | 内存 | 每月 1 GB-秒/秒 | $0.00000475/GB-秒 | | 请求 | 每月 200 万次 | $0.40/百万次 | | 网络(出站) | 每月 5GB(北美) | $0.08/GB |
环境准备
# 安装 Google Cloud SDK
curl https://sdk.cloud.google.com | bash
# 初始化并登录
gcloud init
# 启用必要 API
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
containerregistry.googleapis.com
示例应用:Go 语言 Web 服务
我们使用 Go 语言构建一个简单的 Web API 服务。创建项目目录并添加以下文件:
// main.go
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
)
type Response struct {
Message string `json:"message"`
Hostname string `json:"hostname"`
Version string `json:"version"`
}
func handler(w http.ResponseWriter, r *http.Request) {
hostname, _ := os.Hostname()
resp := Response{
Message: "Hello from Cloud Run!",
Hostname: hostname,
Version: "1.0.0",
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(resp)
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, "OK")
}
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/health", healthHandler)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Printf("Server starting on port %s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
创建 Dockerfile
# Dockerfile
# 构建阶段
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server main.go
# 运行阶段
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
方式一:使用 Cloud Build 一键部署
Cloud Run 最便捷的部署方式是使用 Cloud Build 的自动构建和部署流程:
# 一键构建并部署
gcloud run deploy my-service \
--source . \
--region us-central1 \
--allow-unauthenticated \
--cpu 1 \
--memory 512Mi \
--min-instances 0 \
--max-instances 100 \
--set-env-vars "VERSION=1.0.0"
此命令会自动完成:源码构建 → Docker 镜像创建 → 推送到 Artifact Registry → 部署到 Cloud Run。
方式二:手动构建并部署
如果需要更多控制权,可以分步操作:
# 1. 构建 Docker 镜像
docker build -t us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1 .
# 2. 推送到 Artifact Registry
docker push us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1
# 3. 部署到 Cloud Run
gcloud run deploy my-service \
--image us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1 \
--region us-central1 \
--allow-unauthenticated \
--cpu 1 \
--memory 512Mi \
--port 8080
配置自动扩缩容
Cloud Run 的自动扩缩容是其核心优势之一:
gcloud run services update my-service \
--region us-central1 \
--min-instances 1 \
--max-instances 50 \
--concurrency 80 \
--cpu-throttling
| 参数 | 说明 | 推荐值 |
|------|------|--------|
| --min-instances | 最小实例数,设为1避免冷启动 | 0(省钱)/ 1(低延迟) |
| --max-instances | 最大实例数,防止无限扩容 | 10-100 视业务而定 |
| --concurrency | 每实例最大并发请求数 | 80(默认)/ 1000(I/O密集) |
| --cpu-throttling | CPU 在无请求时是否节流 | 启用(省钱)/ 禁用(CPU密集) |
配置自定义域名和 HTTPS
# 映射自定义域名
gcloud run domain-mappings create \
--service my-service \
--domain api.example.com \
--region us-central1
# 验证域名所有权后,Cloud Run 自动配置托管 SSL 证书
持续部署(CI/CD)配置
推荐使用 Cloud Build Triggers 实现自动化部署:
# cloudbuild.yaml
steps:
# 构建镜像
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA', '.']
# 推送镜像
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA']
# 部署到 Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'run'
- 'deploy'
- 'my-service'
- '--image=us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA'
- '--region=us-central1'
- '--platform=managed'
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA'
安全最佳实践
- 使用 Artifact Registry 而非 Container Registry(更安全、区域化)
- 最小权限原则:Cloud Run 服务账号仅授予必要权限
- Secret Manager 集成:敏感配置使用 Secret Manager 挂载
# 挂载 Secret
gcloud run services update my-service \
--update-secrets=DB_PASSWORD=my-secret:latest
- VPC Connector:访问 VPC 内资源(如 Cloud SQL)时配置 Serverless VPC Access
- IAM 认证:内部服务关闭
--allow-unauthenticated,使用 IAM 控制访问
监控与可观测性
Cloud Run 自动集成 GCP 的可观测性套件:
- Cloud Logging:容器 stdout/stderr 自动收集
- Cloud Monitoring:请求延迟、错误率、实例数等指标
- Cloud Trace:分布式追踪,需在代码中集成
// 添加 OpenTelemetry 追踪
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/trace/jaeger"
)
func initTracer() {
exporter, _ := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces")))
tp := tracesdk.NewTracerProvider(tracesdk.WithBatcher(exporter))
otel.SetTracerProvider(tp)
}
Cloud Run vs 其他容器部署方式
| 特性 | Cloud Run | GKE | Compute Engine | |------|-----------|-----|----------------| | 管理开销 | 零 | 中 | 高 | | 自动扩缩 | 自动(到0) | 需配置 HPA | 需自行实现 | | 冷启动 | 有(~1-3秒) | 无 | 无 | | 网络控制 | 有限 | 完全 | 完全 | | 最长请求时间 | 60分钟 | 无限制 | 无限制 | | 按用量计费 | 是 | 按节点 | 按实例 |
总结
GCP Cloud Run 为容器化应用提供了极致的部署便捷性,特别适合 API 服务、Web 应用和事件驱动型工作负载。从零到上线只需一条命令,自动扩缩容让你无需担心流量波动。
通过多云平台购买 GCP 资源,可享受合作伙伴专属折扣和专业技术支持,最高节省 20% 的云服务开支。立即访问 duoyun.io 了解详情。