使用部署政策限制发布

本快速入门介绍了如何在指定时间段内阻止 Cloud Deploy 向目标部署,以及如何替换此限制。

在本快速入门中,您将执行以下操作:

  1. 创建 Skaffold 配置和 Kubernetes 清单 用于指定(预构建)容器的 Cloud Run 服务定义 要部署的映像

  2. 定义 Cloud Deploy 交付流水线和一个部署目标,指向一个 GKE 集群或 Cloud Run 服务。

    此流水线仅包含一个目标的一个阶段。

  3. 为目标配置部署政策。

    此政策定义了一个日期范围,禁止系统将应用发布 目标。

  4. 创建版本。

    通常,当您创建版本时,Cloud Deploy 会为交付流水线流程中的第一个目标创建发布。在本例中,由于存在政策阻止部署到目标平台,系统不会为该目标平台创建发布版本。

  5. 在 Google Cloud 控制台中查看结果。

    根据此政策的规定,您将不会看到该版本的发布, 交付流水线可视化图表中没有待处理的操作。

  6. 替换部署政策。

    此替换项会导致 Cloud Deploy 现在为目标创建发布。

  7. 在 Google Cloud 控制台中查看结果。

    由于该政策现已覆盖,您可以看到 正在进行(或已完成,如果经过了足够时间)。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 如果您已安装 Google Cloud CLI,请确保您运行的是最新版本:

    gcloud components update
    
  13. 确保将默认 Compute Engine 服务账号拥有足够的权限。

    服务账号可能已经拥有必要的权限。这些步骤 包含为默认服务停用自动角色授予的项目 账号。

    1. 首先添加 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"
      
    2. 添加 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"
      
    3. 为您的特定运行时添加开发者角色。
      • 对于 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"
        

    4. 添加 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
      

创建运行时环境

如果您要部署到 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 提供 您需要详细了解要部署的内容以及如何将其部署到 target

在本快速入门中,您将创建一个 skaffold.yaml 文件,以标识要用于部署示例应用的 Kubernetes 清单。

  1. 打开一个终端窗口。

  2. 创建一个新目录,并导航至该目录。

    GKE

    mkdir deploy-policy-quickstart
    cd deploy-policy-quickstart
    

    Cloud Run

    mkdir deploy-policy-quickstart
    cd deploy-policy-quickstart
    
  3. 创建名为 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 参考文档 详细了解此配置文件

  4. 为您的应用创建清单,即 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 清单,用于应用到集群以部署应用。

    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 服务定义 它用于在部署时创建 服务。

创建交付流水线和目标

您可以在一个文件或单独的 文件。在本快速入门中,您将创建一个同时包含两者的文件。

  1. 创建交付流水线和目标定义:

    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
    
  2. 在 Cloud Deploy 服务中注册流水线和目标资源:

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    现在,您已拥有一个只有一个目标的交付流水线。

  3. 确认您的流水线和目标:

    在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,用于查看可用交付列表 流水线。

    打开“交付流水线”页面

    此时将显示您刚刚创建的交付流水线,并且目标列会列出了一个目标。

    Google Cloud 控制台中的交付流水线页面,其中显示了您的流水线

创建部署政策

您可以在交付流水线所在的文件中定义部署政策, 目标,也可以在单独的文件中定义它。在本快速入门中,我们定义 。

  1. 在您创建了交付流水线和目标的同一目录中, 创建一个新文件 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 年。这并不是一项实际政策;之所以这样做,只是为了本快速入门,以确保您在创建版本时已设置好此政策。

  2. 在 Cloud Deploy 服务中注册部署政策资源:

    gcloud deploy apply --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
    
  3. 确认您的部署政策:

    在 Google Cloud 控制台中,前往 Cloud Deploy 部署政策页面,查看可用政策的列表。

    打开“部署政策”页面

    系统会显示您刚刚创建的部署政策。

    Google Cloud 控制台中的“部署政策”页面

创建版本

版本是代表 正在部署的更改交付流水线定义该版本的生命周期。请参阅 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

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

正常情况下,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 控制台中查看结果

  1. 在 Google Cloud 控制台中,再次导航到 Cloud Deploy 交付流水线页面,用于查看交付流水线 (deploy-policy-pipeline).

    打开“交付流水线”页面

  2. 点击交付流水线的名称 (deploy-policy-pipeline)。

    流水线可视化会显示应用的部署状态。在此示例中 因为此政策已被覆盖,所以发布已创建且成功。

    显示发布的交付流水线可视化图表

    您的版本列在版本标签页中交付流水线详细信息下。

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

  1. 删除 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
    
  2. 删除部署政策:

    gcloud deploy delete --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
    
  3. 删除交付流水线、目标、版本和发布:

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  4. 删除 Cloud Deploy 创建的两个 Cloud Storage 存储桶。

    打开“Cloud Storage 浏览器”页面

恭喜,您已经完成快速入门!

后续步骤