Skip to main content

Command Palette

Search for a command to run...

Google Cloud Run 一瞥

Updated
3 min read

原文:A First Look at Google Cloud Run

作者:Marko Anastasov

Google 在 Cloud Next'19 上发布了基于 Docker 容器的的 Serverless 新方案。目前可以肯定的是,这是 Serverless 的重要进步——在 Cloud Run 上进行部署比在 Kubernetes 上运行容器简单多了。而且和 Lambda 不同,这一方案没有语言绑定的问题。

什么是 Google Cloud Run

Google Cloud Run 是一个全托管平台,它以无状态、自动伸缩的 HTTP 服务的形式运行 Docker 容器镜像。

Cloud Run 和第一代 Serverless 平台(例如 AWS Lambda、Google Cloud functions 或 Azure Functions)不同,它允许你运行任意的应用,提供多个端点;而无需使用特定接口来运行小规模的函数。

Cloud Run 的基础来自于 Knative,因此这一方案有可能被移植到其它的托管 Kubernetes 平台。

我的项目能够在 Google Cloud Run 上运行么?

Google 发表了 容器运行时契约,其中说明了对容器的要求:

  • 容器是 64 位 Linux 平台;

  • 在 8080 端口监听 HTTP 请求;

  • 最多使用 2G 内存;

  • 容器实例必须在收到请求之后的 4 分钟内启动 HTTP 服务器;

  • 应用应该能够适应自动从 0 到多个运行实例的容器环境;

  • 所有的运算都应该是无状态的,限制在一个请求之内。

只要你的项目能够符合上面的条件,不论使用什么语言开发,都能够在 Cloud Run 上面运行。

Cloud Run 目前还在 Beta 阶段,因此这些需求可能会发生变动。

上手流程

对于熟悉 Docker 或者 Heroku 传统 PaaS 解决方案的人来说,Cloud Run 应该很易上手。

应用打包成 Docker 之后,剩下的任务包括:

  • 把镜像推送到 Google 镜像库。

  • 运行 gcloud beta run deploy

只要几分钟,Cloud Run 就会使用一个可定制、可开放的域名启动新应用了。

示例:使用 Semaphore 进行持续部署

下面的例子中,我们使用 Semaphore 要为一个微服务配置 Serverless CI/CD Pipeline,其中包含如下环节:

  • 运行自动测试;

  • 构建 Docker 容器;

  • 将容器镜像推入 Google 镜像库;

  • 提供到 Cloud Run 预备环境的一键部署;

  • 在对 Master 分支的构建成功之后;自动部署到 Cloud Run 生产环境。

可以在 Github 上找到相关的全部代码。

启用 Cloud Run

官方的快速启动指南提供了一个 Cloud Run 的上手教程。

第一步是:

  • 在你的账号中启用 Cloud Run API

  • 安装 Google Cloud SDK;

  • 使用 gcloud components install beta 安装 Beta 组件。

应用容器化

下面的 Dockerfile 将一个简单的 Sinatra 应用打包:

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential
ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install --without development test
ADD . $APP_HOME
EXPOSE 8080
CMD ["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "8080"]

注意如果使用你自己的 Dockerfile,必须开放 8080 端口,否则可能会看到如下错误:

登录 Google Cloud 和 GCR

要在 CI/CD Pipeline 中自动地将镜像推送到 GCR,需要在 Semaphore 中登录到 Google Cloud。为了安全起见,需要在 Semaphore 中根据 Google Cloud Service account 的认证密钥创建一个 Secret。

获取认证密钥之后,在 Semaphore 中用 Secret 的形式上传到 Semaphore。假设文件名是 .secrets.gcp.json

sem create secret google-cloud-stg --file ~/Downloads/account-name-27f3a5bcea2d.json:.secrets.gcp.json

定义分发管线

接下来就可以编写一个 Pipeline 来构建、标记并推送镜像到 GCR 了:

# .semaphore/docker-build.yml
# This pipeline runs after semaphore.yml
version: v1.0
name: Docker build
agent:
  machine:
    # Use a machine type with more RAM and CPU power for faster container
    # builds:
    type: e1-standard-4
    os_image: ubuntu1804
blocks:
  - name: Build
    task:
      # Mount a secret which defines an authentication key file.
      # For info on creating secrets, see:
      # - https://docs.semaphoreci.com/article/66-environment-variables-and-secrets
      # - https://docs.semaphoreci.com/article/72-google-container-registry-gcr
      secrets:
        - name: google-cloud-stg
      jobs:
      - name: Docker build
        commands:
          # Authenticate using the file injected from the secret
          - gcloud auth activate-service-account --key-file=.secrets.gcp.json
          # Configure access to container registry, silence confirmation prompts with -q
          - gcloud auth configure-docker -q

          - checkout

          # Tag your images with gcr.io/ACCOUNT_PROJECT_NAME/SERVICE_NAME pattern
          # Use Git SHA to produce unique artifacts
          - docker build -t "gcr.io/semaphore2-stg/semaphore-demo-cloud-run:${SEMAPHORE_GIT_SHA:0:7}" .
          - docker push "gcr.io/semaphore2-stg/semaphore-demo-cloud-run:${SEMAPHORE_GIT_SHA:0:7}"

promotions:
  # Deployment to staging can be trigger manually:
  - name: Deploy to staging
    pipeline_file: deploy-staging.yml

  # Automatically deploy to production on successful builds on master branch:
  - name: Deploy to production
    pipeline_file: deploy-production.yml
    auto_promote_on:
      - result: passed
        branch:
          - master

deploy-staging.ymldeploy-production.yml 中包含了同样的步骤,区别只是服务的名称。

# .semaphore/deploy-production.yml
# This pipeline runs after docker-build.yml
version: v1.0
name: Deploy to production
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Deploy to production
    task:
      secrets:
        - name: google-cloud-stg
      jobs:
      - name: run deploy
        commands:
          - gcloud auth activate-service-account --key-file=.secrets.gcp.json
          - gcloud auth configure-docker -q

          # Deploy to Cloud Run, using flags to avoid interactive prompt
          # See https://cloud.google.com/sdk/gcloud/reference/beta/run/deploy
          - gcloud beta run deploy markoci-demo-cloud-run --project semaphore2-stg --image gcr.io/semaphore2-stg/markoci-demo-cloud-run:${SEMAPHORE_GIT_SHA:0:7} --region us-central1

上线运行

在本地终端或者 Semaphore 作业的日志中,最后一行会包含一个应用运行的网址:

https://semaphore-demo-cloud-run-ud2bmvsmda-uc.a.run.app.

用浏览器打开这个网址会看到:

这是因为还没有完成最后一步:在 Google Cloud Run 控制台中开放服务

完成之后的浏览页面:

整装待发

希望本文能够引起你使用 CI/CD Pipeline 在 Google Cloud Run 上构建和发布应用的兴趣。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts