1. 概览
在本实验中,您将使用 Cloud Deploy 将 .Net 应用部署到 Cloud Run。您将使用 Cloud Build 构建容器映像,而无需使用 Dockerfile。您将使用 Cloud Deploy 设置包含三个目标环境的流水线,并完成相应步骤,以便在各个环境中提升版本。最后,您需要批准将该版本部署到生产环境。
什么是 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 项目设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
环境设置
点击搜索栏右侧的图标,激活 Cloud Shell。
在 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. 查看配置文件
克隆应用源代码:
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,然后批准该版本以进行正式版部署。
查看 Cloud Deploy 流水线状态和可用的 DORA 指标(“部署次数”“部署频率”“部署失败率”)。
指标 | 说明 |
部署次数 | 部署到交付流水线中最终目标的成功和失败部署总数。 |
部署频率 | 交付流水线部署到交付流水线中最终目标的频率。DevOps 研究和评估 (DORA) 计划定义的四个关键指标之一。 |
部署失败率 | 未能发布到交付流水线中最终目标的部署所占的百分比。 |
在 Cloud Run 中查看已部署的应用:
7. 恭喜!
恭喜,您已完成此 Codelab!
所学内容:
- 如何创建 Cloud Deploy 流水线
- 如何使用 Cloud Build 为 .Net 应用创建容器映像
- 如何使用 Cloud Deploy 将应用部署到 Cloud Run
- 如何提升 Cloud Deploy 版本
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
若要避免产生费用,最简单的方法是删除您为本教程创建的项目。