使用 Cloud Deploy 部署 Cloud Run 应用

1. 概览

在本实验中,您将使用 Cloud Deploy 将 .Net 应用部署到 Cloud Run。您将使用 Cloud Build 构建容器映像,而无需使用 Dockerfile。您将使用 Cloud Deploy 设置包含三个目标环境的流水线,并完成相应步骤,以便在各个环境中提升版本。最后,您需要批准将该版本部署到生产环境。

916a54f51af5ee54.png

什么是 Cloud Build?

借助 Cloud Build,您可以跨所有编程语言快速构建软件。

什么是 Cloud Deploy?

Cloud Deploy 是一项全代管式持续交付服务。借助 Cloud Deploy,您可以为 GKE、Anthos 和 Cloud Run 创建部署流水线。

Cloud Run 是什么?

借助 Cloud Run,您可以在全代管式平台上部署以任何语言(包括 Go、Python、Java、Node.js、.NET 和 Ruby)编写的可伸缩容器化应用。

什么是 Skaffold?

Skaffold 是一种命令行工具,可支持 Kubernetes 原生应用的持续开发。Cloud Deploy 使用 Skaffold 执行渲染和部署操作。

学习内容

在本实验中,您将学习如何完成以下操作:

  • 创建 Cloud Deploy 流水线
  • 使用 Cloud Build 为 .Net 应用创建容器映像,而无需使用 Dockerfile
  • 使用 Cloud Deploy 将应用部署到 Cloud Run
  • 推送 Cloud Deploy 版本

前提条件

  • 本实验假设您熟悉 Cloud 控制台和 shell 环境。

2. 设置和要求

Cloud 项目设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

环境设置

点击搜索栏右侧的图标,激活 Cloud Shell。

eb0157a992f16fa3.png

在 Cloud Shell 中,运行以下命令以设置项目环境变量:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

启用 API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

创建 Artifact Registry 代码库以存储应用容器映像:

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. 查看配置文件

29c2533441779de0.png

克隆应用源代码:

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

查看 Cloud Deploy 流水线配置:

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

查看 skaffold.yaml 文件,该文件定义了三个环境,并使用 Cloud Run 作为目标服务。

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

查看服务配置文件。

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

查看 cloudbuild.yaml 文件,了解构建容器映像和创建 Cloud Deploy 版本的步骤:

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. 创建 Cloud Deploy 流水线

替换 clouddeploy.yaml 中的 _PROJECT_ID 值:

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

创建 Cloud Deploy 流水线:

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Cloud Deploy 中查看创建的流水线。

5. 构建容器映像并创建版本

向 Cloud Build 服务账号添加 Cloud Deploy 操作员权限:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

创建容器映像和 Cloud Deploy 版本:

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Cloud Deploy 中查看创建的版本。等待部署到开发环境完成。

6. 将版本提升到质量检查环境和生产环境

使用 Cloud 控制台或 Cloud Shell 将版本提升到下一个目标(qa-env)。

使用 Cloud Shell 升级版本,运行 gcloud 命令以升级版本。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

等待部署到质量检查环境完成。将版本提升到下一个目标(prod-env)。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

在 Cloud 控制台中打开 Cloud Deploy,然后批准该版本以进行正式版部署。

4c838b60770e9691.png

查看 Cloud Deploy 流水线状态和可用的 DORA 指标(“部署次数”“部署频率”“部署失败率”)。

指标

说明

部署次数

部署到交付流水线中最终目标的成功和失败部署总数。

部署频率

交付流水线部署到交付流水线中最终目标的频率。DevOps 研究和评估 (DORA) 计划定义的四个关键指标之一。

部署失败率

未能发布到交付流水线中最终目标的部署所占的百分比。

Cloud Run 中查看已部署的应用:

d6372b5350f10875.png

7. 恭喜!

恭喜,您已完成此 Codelab!

所学内容:

  • 如何创建 Cloud Deploy 流水线
  • 如何使用 Cloud Build 为 .Net 应用创建容器映像
  • 如何使用 Cloud Deploy 将应用部署到 Cloud Run
  • 如何提升 Cloud Deploy 版本

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。

8. 后续步骤