使用 Cloud Deploy 部署 Cloud Run 应用

1. 概览

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

916a54f51af5ee54

什么是 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 流水线
  • 在不使用 Dockerfile 的情况下,使用 Cloud Build 为 .Net 应用创建容器映像
  • 使用 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

克隆应用源代码:

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 Deploy Operator 权限添加到 Cloud Build 服务账号:

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

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

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

在 Cloud 控制台中打开 Cloud Deploy,并批准用于生产部署的版本。

4c838b60770e9691

查看 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. 后续操作