使用部署政策限制发布
本快速入门介绍了如何在指定时间段内阻止 Cloud Deploy 向目标部署,以及如何替换此限制。
在本快速入门中,您将执行以下操作:
创建 Skaffold 配置和 Kubernetes 清单或 Cloud Run 服务定义,以指定要部署的(预构建)容器映像。
定义 Cloud Deploy 交付流水线和一个部署目标,指向一个 GKE 集群或 Cloud Run 服务。
此流水线仅包含一个阶段,针对一个目标。
为目标配置部署政策。
该政策定义了禁止向该目标平台发布的日期范围。
创建版本。
通常,当您创建版本时,Cloud Deploy 会为交付流水线流程中的第一个目标创建发布。在本例中,由于存在政策阻止部署到目标平台,因此系统不会为该目标平台创建发布版本。
在 Google Cloud 控制台中查看结果。
由于该政策,您不会看到该版本的发布,并且交付流水线可视化中也没有待处理的操作。
替换部署政策。
此替换项会导致 Cloud Deploy 现在为目标创建发布。
在 Google Cloud 控制台中查看结果。
由于该政策现已被替换,因此您会看到正在进行(或已完成,如果已过足够的时间)的发布。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
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.policyAdmin
角色: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.policyAdmin"
- 为您的特定运行时添加开发者角色。
- 对于 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
如果您已安装 Google Cloud CLI,请确保您运行的是最新版本:
gcloud components update
创建运行时环境
如果您要部署到 Cloud Run,则可以跳过此命令。
对于 GKE,请创建一个集群:quickstart-cluster-qsprod
。集群的 Kubernetes API 端点必须可通过公共互联网访问。默认情况下,GKE 集群可从外部访问。
gcloud container clusters create-auto quickstart-cluster-qsprod \
--project=PROJECT_ID \
--region=us-central1
准备 Skaffold 配置和应用清单
Cloud Deploy 使用 Skaffold 提供要部署的内容的详细信息,以及如何将其部署到目标。
在本快速入门中,您将创建一个 skaffold.yaml
文件,以标识要用于部署示例应用的 Kubernetes 清单。
打开一个终端窗口。
创建一个新目录,并导航至该目录。
mkdir deploy-policy-quickstart cd deploy-policy-quickstart
创建名为
skaffold.yaml
且包含以下内容的文件:GKE
apiVersion: skaffold/v4beta1 kind: Config manifests: rawYaml: - k8s-pod.yaml deploy: kubectl: {}
Cloud Run
apiVersion: skaffold/v4beta1 kind: Config manifests: rawYaml: - service.yaml deploy: cloudrun: {}
此文件是一个最基本的 Skaffold 配置。在本快速入门中,您需要创建该文件。不过,对于基本非生产应用,您也可以让 Cloud Deploy 为您创建一个环境。
如需详细了解此配置文件,请参阅
skaffold.yaml
参考文档。为您的应用创建清单,即 Cloud Run 的服务定义或 GKE 的 Kubernetes 清单。
GKE
创建一个名为
k8s-pod.yaml
的文件,其中包含以下内容:apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: nginx image: my-app-image
此文件是一个基本的 Kubernetes 清单,用于应用到集群以部署应用。要部署的容器映像在此处设置为占位符
my-app-image
,在您创建版本时,系统会将其替换为特定映像。Cloud Run
创建一个名为
service.yaml
的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-deploy-policy-run-service spec: template: spec: containers: - image: my-app-image
此文件是一个基本的 Cloud Run 服务定义,用于部署应用。要部署的容器映像在此处设置为占位符
my-app-image
,在您创建版本时,系统会将其替换为特定映像。
创建交付流水线和目标
您可以在一个文件中或在单独的文件中定义交付流水线和目标。在本快速入门中,您将创建一个包含这两者的文件。
创建交付流水线和目标定义:
GKE
在
deploy-policy-quickstart
目录中,创建包含以下内容的新文件clouddeploy.yaml
:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-policy-pipeline serialPipeline: stages: - targetId: prod-target --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod-target description: production cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod
Cloud Run
在
deploy-policy-quickstart
目录中,创建包含以下内容的新文件clouddeploy.yaml
:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-policy-pipeline serialPipeline: stages: - targetId: prod-target --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod-target description: production Run service run: location: projects/PROJECT_ID/locations/us-central1
在 Cloud Deploy 服务中注册流水线和目标资源:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
现在,您已经有了包含一个目标的交付流水线。
确认您的流水线和目标:
在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,查看可用交付流水线的列表。
此时将显示您刚刚创建的交付流水线,并且目标列会列出了一个目标。
创建部署政策
您可以在与交付流水线和目标相同的文件中定义部署政策,也可以在单独的文件中定义部署政策。在本快速入门中,我们将其单独定义。
在创建交付流水线和目标的目录中,创建一个名为
deploypolicy.yaml
的新文件,并在其中添加以下内容:apiVersion: deploy.cloud.google.com/v1 description: Restrict all rollouts in the deploy-policy-pipeline resource for the next ten years kind: DeployPolicy metadata: name: quickstart-deploy-policy selectors: - deliveryPipeline: id: 'deploy-policy-pipeline' rules: - rolloutRestriction: id: no-rollouts timeWindows: timeZone: America/New_York oneTimeWindows: - start: 2024-01-01 00:00 end: 2034-01-01 24:00
此政策将从 2024 年 1 月 1 日起阻止发布 10 年。这并不是一项实际政策;之所以这样做,只是为了本快速入门,以确保您在创建版本时已设置好此政策。
在 Cloud Deploy 服务中注册部署政策资源:
gcloud deploy apply --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
确认您的部署政策:
在 Google Cloud 控制台中,导航到 Cloud Deploy 部署政策页面,以查看可用政策的列表。
系统会显示您刚刚创建的部署政策。
创建版本
版本是表示要部署的更改的中央 Cloud Deploy 资源。交付流水线定义该版本的生命周期。如需详细了解该生命周期,请参阅 Cloud Deploy 服务架构。
GKE
从 deploy-policy-quickstart
目录运行以下命令以创建版本:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
请注意 --images=
标志,您可以使用该标志将清单或服务定义中的占位符 (my-app-image
) 替换为经过 SHA 认证的特定映像。Google 建议您以这种方式将清单模板化,并在创建版本时使用 SHA 限定的映像名称。
Cloud Run
从 deploy-policy-quickstart
目录运行以下命令以创建版本:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
请注意 --images=
标志,您可以使用该标志将清单或服务定义中的占位符 (my-app-image
) 替换为经过 SHA 认证的特定映像。Google 建议您以这种方式将清单模板化,并在创建版本时使用 SHA 限定的映像名称。
在正常情况下,当您使用此命令创建版本时,Cloud Deploy 会将发布部署到第一个目标。在本例中,由于根据部署政策限制了发布,因此系统不会创建任何发布。命令行上会显示错误消息:
ERROR: (gcloud.deploy.releases.create) A create-rollout attempt was blocked by the "quickstart-deploy-policy"
policy. Target: "prod-target", Delivery pipeline: "deploy-policy-pipeline", policy rule: "no-rollouts"
替换政策限制
如需部署被部署政策屏蔽的示例应用,您需要替换该政策。为此,您需要针对此版本创建新的发布,这次要添加 --override-deploy-policies
选项:
GKE
从 deploy-policy-quickstart
目录运行以下命令以创建版本:
gcloud deploy releases promote --release=test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--to-target=prod-target \
--override-deploy-policies=quickstart-deploy-policy
Cloud Run
从 deploy-policy-quickstart
目录运行以下命令以创建版本:
gcloud deploy releases promote --release=test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--to-target=prod-target \
--override-deploy-policies=quickstart-deploy-policy
由于您添加了 --override-deploy-policies=quickstart-deploy-policy
,并且您拥有 roles/clouddeploy.policyAdmin
角色,因此 Cloud Deploy 会忽略您创建的部署政策,并将发布内容部署到 prod-target
。
在 Google Cloud 控制台中查看结果
在 Google Cloud 控制台中,再次前往 Cloud Deploy 交付流水线页面,查看您的交付流水线 (
deploy-policy-pipeline
)。点击交付流水线的名称 (
deploy-policy-pipeline
)。流水线直观显示将显示应用的部署状态。在本例中,由于政策已被替换,因此发布作业已创建并成功完成。
您的版本列在版本标签页中交付流水线详细信息下。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除 GKE 集群或 Cloud Run 服务:
GKE
gcloud container clusters delete quickstart-cluster-qsprod --region=us-central1 --project=PROJECT_ID
Cloud Run
gcloud run services delete my-deploy-policy-run-service --region=us-central1 --project=PROJECT_ID
删除部署政策:
gcloud deploy delete --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
删除交付流水线、目标、版本和发布:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
删除 Cloud Deploy 创建的两个 Cloud Storage 存储分区。
恭喜,您已经完成快速入门!