在 Cloud Deploy 中自动进行版本推广和推进发布
本页面介绍如何使用 Cloud Deploy 自动将版本提升到目标版本并将发布推进到下一阶段。
在本快速入门中,您将执行以下操作:
创建两个 GKE 集群或两个 Cloud Run 服务。
创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。
定义 Cloud Deploy 交付流水线和部署目标。
流水线将部署到两个目标:
dev
和staging
。staging
目标使用 Canary 部署策略。定义两条自动规则:
用于在成功发布到
dev
后将版本提升到staging
目标的自动化操作。用于在
canary-25
阶段成功完成后将发布推进到stable
阶段的自动化操作。
通过创建自动部署到
dev
目标的版本来实例化交付流水线。在 Google Cloud 控制台中查看交付流水线和版本。
由于自动升级,此版本会自动提升为
staging
。由于
staging
目标使用 Canary 部署策略,并且这是进入该运行时的第一个部署,因此系统会跳过canary-25
阶段。请参阅为什么有时会跳过某些阶段,详细了解首次跳过 Canary 阶段的原因。由于自动化阶段提前,分阶段发布进入
stable
阶段。
准备工作
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
启用 Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
启用 Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
- 确保默认 Compute Engine 服务帐号具有足够的权限。
服务账号可能已经拥有必要的权限。这些步骤适用于停用为默认服务帐号自动授予角色的项目。
- 首先,添加
clouddeploy.jobRunner
角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner"
- 添加
clouddeploy.releaser
角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.releaser"
- 为特定运行时添加开发者角色。
- 对于 GKE:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer"
- 对于 Cloud Run:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer"
-
添加
iam.serviceAccountUser
角色,该角色包含要部署到运行时的默认服务帐号的actAs
权限:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
-
添加
iam.serviceAccountUser
角色(包括您自己的actAs
权限),以使用默认服务帐号:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=user:YOUR_EMAIL_ADDRESS \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
在这种情况下,YOUR_EMAIL_ADDRESS 是您用于访问 Google Cloud 的电子邮件地址。
- 首先,添加
如果您已安装 CLI,请确保运行的是最新版本:
gcloud components update
创建运行时环境
如果要部署到 Cloud Run,则可以跳过此命令。
对于 GKE,请创建两个采用默认设置的集群:automation-quickstart-cluster-dev
和 automation-quickstart-cluster-staging
。集群的 Kubernetes API 端点必须可从公共互联网通过网络访问。默认情况下,GKE 集群可从外部访问。
gcloud container clusters create-auto automation-quickstart-cluster-dev \
--project=PROJECT_ID \
--region=us-central1 \
&& gcloud container clusters create-auto automation-quickstart-cluster-staging \
--project=PROJECT_ID \
--region=us-central1
获取您的项目编号。
您需要使用项目编号来识别默认服务帐号。这是配置自动化资源所必需的。
运行以下命令以获取项目编号:
gcloud projects describe PROJECT_ID
从命令行输出中复制项目编号,并将其粘贴到此处。
您无需作为命令运行此命令。如果在此处粘贴,则会填充本快速入门稍后的自动化配置中的服务帐号引用。
PROJECT_NUMBER
准备 Skaffold 配置和应用清单
Cloud Deploy 使用 Skaffold 提供有关要部署的内容以及如何针对单独的目标正确部署的详细信息。
在本快速入门中,您将创建一个 skaffold.yaml
文件,该文件用于标识要用于部署示例应用的应用清单。
打开一个终端窗口。
创建一个新目录并进入该目录。
GKE
mkdir deploy-automation-gke-quickstart cd deploy-automation-gke-quickstart
Cloud Run
mkdir deploy-automation-run-quickstart cd deploy-automation-run-quickstart
创建名为
skaffold.yaml
且包含以下内容的文件:GKE
apiVersion: skaffold/v3alpha1 kind: Config metadata: name: gke-automation manifests: rawYaml: - k8s-deployment.yaml deploy: kubectl: {}
Cloud Run
apiVersion: skaffold/v3alpha1 kind: Config metadata: name: run-automation profiles: - name: dev manifests: rawYaml: - run-dev.yaml - name: staging manifests: rawYaml: - run-staging.yaml deploy: cloudrun: {}
此文件是最低的 Skaffold 配置。在本快速入门中,您将创建该文件。但是,对于简单的非生产应用,您也可以让 Cloud Deploy 为您创建一个。
如需详细了解此文件,请参阅
skaffold.yaml
参考文档。为应用创建定义 - 针对 Cloud Run 的一对服务定义或针对 GKE 的 Kubernetes 清单。
GKE
创建一个名为
k8s-deployment.yaml
的文件,其中包含以下内容:apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80
此文件是一个简单的 Kubernetes 清单,将应用于集群以部署应用。
Cloud Run
创建一个名为
run-dev.yaml
的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-dev spec: template: spec: containers: - image: my-app-image
创建一个名为
run-staging.yaml
的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-staging spec: template: spec: containers: - image: my-app-image
此文件是简单的 Cloud Run 服务定义,在部署时用于创建 Cloud Run 服务。
创建交付流水线、目标和自动化
您可以在一个文件或单独的文件中定义交付流水线和目标。您还可以在单独的文件中定义自动化操作。本快速入门使用一个文件来处理流水线、目标和自动化。
创建交付流水线、目标定义和自动化操作:
GKE
在
deploy-automation-gke-quickstart
目录中,创建一个新文件clouddeploy.yaml
,其中包含以下内容:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev - targetId: automation-quickstart-staging profiles: [] strategy: canary: runtimeConfig: kubernetes: serviceNetworking: service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: promotes a release suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: - target: id: automation-quickstart-dev rules: - promoteRelease: name: "promote-release" wait: 1m toTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: - target: id: automation-quickstart-staging rules: - advanceRollout: name: "advance-rollout" sourcePhases: ["canary-25"] wait: 1m
Cloud Run
在
deploy-automation-run-quickstart
目录中,创建一个新文件clouddeploy.yaml
,其中包含以下内容:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev profiles: [dev] - targetId: automation-quickstart-staging profiles: [staging] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: Promotes a release to the next target suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: - target: id: automation-quickstart-dev rules: - promoteRelease: name: "promote-release" wait: 1m toTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: - target: id: automation-quickstart-staging rules: - advanceRollout: name: "advance-rollout" sourcePhases: ["canary-25"] wait: 1m
向 Cloud Deploy 服务注册流水线和目标:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
现在,您已有一条流水线,其中有一个多目标包含两个 GKE 或 Cloud Run 目标,可用于部署应用。
确认您的流水线和目标:
在 Google Cloud 控制台中,转到 Cloud Deploy 交付流水线页面,以查看可用交付流水线列表。
此时将显示您刚刚创建的交付流水线,目标列中列出了两个目标。
点击流水线名称以打开交付流水线可视化图表和详细信息。
在交付流水线详情下,选择自动化操作标签页。
系统会显示您创建的两个自动化操作。
创建版本
版本是 Cloud Deploy 中心资源,表示要部署的更改。交付流水线定义该版本的生命周期。如需详细了解该生命周期,请参阅 Cloud Deploy 服务架构。
GKE
从 deploy-automation-gke-quickstart
目录运行以下命令,创建表示要部署的容器映像的 release
资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud Run
从 deploy-automation-run-quickstart
目录运行以下命令,创建表示要部署的容器映像的 release
资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=gcr.io/cloudrun/hello@sha256:7c0aeb55b25b12c656ad0856b13126ca0346c16dc631d9d7fa9dc335dd4a05df
默认情况下,当您创建版本时,系统会自动为流水线中的第一个目标创建发布。
由于本快速入门包含两项自动化操作,因此系统会自动执行两项操作:
在第一个目标中成功部署后,版本会自动提升到第二个目标。
宣传自动化操作需要等待一分钟的时间。
在第二个目标中,配置了 25% 的 Canary 版,第二个自动化功能会将发布从
canary-25
推进到stable
。对于第一个版本,系统会跳过
canary-25
阶段,因为应用没有现成的版本可用于 Canary 更新。发布作业会自动推进到stable
。提前自动化操作会有一分钟延迟。
一切完成后,应用即会被成功部署到这两个目标,您无需执行进一步操作。
如果您想详细了解如何运行 Canary 部署策略,则可以试用 Canary 快速入门。
在 Google Cloud 控制台中查看结果
您可以在 Google Cloud 控制台中查看结果,包括自动化运行。
转到 Cloud Deploy 交付流水线页面以查看您的交付流水线。
点击交付流水线的名称“my-automation-demo-app-1”。
流水线可视化图表会显示应用的部署状态。如果经过的时间足够长,两个目标都会显示绿色。
您的版本列在版本标签页中交付流水线详细信息下。
点击自动化运行标签页。
有两个条目,分别对应您创建的两个自动化操作。您可以点击任一项来查看相应自动化运行的详细信息。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除 GKE 集群或 Cloud Run 服务:
GKE
gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \ && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
Cloud Run
gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \ && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
删除交付流水线、目标、自动化、版本和发布:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
删除 Cloud Deploy 创建的 Cloud Storage 存储分区。
一个以
_clouddeploy
结尾,另一个是[region].deploy-artifacts.[project].appspot.com
。
恭喜,您已经完成快速入门!