验证您的部署

本文档介绍如何验证 Cloud Deploy 部署。

您可以配置 Cloud Deploy 和 Skaffold 以验证已部署到任何目标的应用是否正常运行。使用您自己的测试映像完成验证,然后将 Cloud Deploy 和 Skaffold 配置为在部署完成后运行这些测试。

默认情况下,部署验证在 Cloud Deploy 执行环境中运行,但您也可以将其配置为在运行应用的同一集群上运行

部署验证的工作原理是什么?

  1. 您需要configure Skaffold 以进行验证。

    此配置标识用于运行测试的一个或多个容器映像,以及要从该容器映像运行的特定命令(例如脚本)。

  2. 您可以在交付流水线中configure一个或多个目标,以进行部署验证。

    此配置可用于对部署到该目标的工作负载进行验证。

  3. 部署发布 (skaffold apply) 后,Cloud Deploy 会在 Cloud Deploy 执行环境中运行 skaffold verify 命令。

    对于部署到 Google Kubernetes Engine 和 GKE Enterprise 的部署,您可以选择在运行应用容器的同一集群上运行验证容器。

  4. Skaffold 会调用 skaffold.yamlverify 节中指定的一个或多个测试,以对已部署的应用运行。

  5. 执行的测试是成功还是失败表示验证是成功还是失败。

    • 验证是否成功取决于已执行的容器的退出代码。

      0 表示成功。非零退出代码表示失败。如需生成所需的验证结果,请确保容器退出时显示适当的退出代码。如果在验证过程中执行了多个容器,则这些容器必须全部成功通过验证才能成功。

    • 如果验证失败,发布也会失败。

    • 如果部署在验证期间失败,您可以通过检查发布来确认这一点:

      Google Cloud 控制台中与发布有关的详细信息,包括验证状态

  6. 您可以ignore重试失败的验证。

    您还可以终止正在进行的验证作业。

用于验证的组件

rollout 资源包括以下支持部署验证的对象:

  • 阶段

    发布过程中在逻辑上组合在一起的操作(作业)集合,例如部署或部署和验证。

  • 作业

    要在发布时执行的特定操作,例如部署或验证。

  • 作业运行

    作为发布资源的子级,作业运行是作业的实例,例如尝试部署。

如需详细了解 Cloud Deploy 资源,请参阅 Cloud Deploy 服务架构

部署验证生成的通知

Cloud Deploy 为以下事件生成 Pub/Sub 消息并发布这些消息:

  • 作业运行创建、更新和删除

    这些通知会发布到 clouddeploy-resources 主题,并包含以下属性:

    • Resource
    • ResourceType (JobRun)
    • ActionCreateUpdateDelete
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId

下面是某个作业运行创建的 Pub/Sub 消息示例,该消息已发布到 clouddeploy-resources 主题:

{
    "ackId": "UAYWLF1GSFE3GQhoUQ5PXiM_NSAoRRAGAE8CKF15MFcrQVh9Dz4NGXJ9YXRiWRIJBkUHeF9cEQ1iXE5EB0nq0KDVV1dKXxYGAExQeVhbHQVoWVh0Bnn7h5nK-8HjYwk9OqKarPdtO4PY2fNHZiI9XhJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FU0Q",
    "message": {
      "attributes": {
        "Action": "Create",
        "DeliveryPipelineId": "dv-pipeline",
        "JobRunId": "634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "Location": "us-central1",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-100",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-100/rollouts/test-release-100-to-dev-0001/jobRuns/634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-100-to-dev-0001"
      },
      "messageId": "5572937706805411",
      "publishTime": "2022-09-07T14:00:46.040Z"
    }
  },
  • 作业运行开始、成功和失败

    这些通知会发布到 clouddeploy-operations 主题,并包含以下属性:

    • Resource
    • ResourceType (JobRun)
    • ActionStartSucceedFailure
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId
    • PhaseId
    • JobId
    • JobTypeDeployVerify

以下是一个关于失败的作业运行的 Pub/Sub 消息示例,该消息已发布到 clouddeploy-operations 主题:

{
    "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUUBAgUBXx9cEFPdVhec2hRDRlyfWB9aVsbCAUXU3cJURsHaE5tdR-6xcvaS0NVb18UAgRFWndfXhMEblhfcy-fkK3HwvT9U0AvOemNgdZpe6jHiulvZiM9XxJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FUw",
    "message": {
      "attributes": {
        "Action": "Failure",
        "DeliveryPipelineId": "dv-pipeline",
        "JobId": "verify",
        "JobRunId": "b389224a-c259-4a00-ab75-c22e48bc3136",
        "JobType": "Verify",
        "Location": "us-central1",
        "PhaseId": "stable",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-101",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-101/rollouts/test-release-101-to-dev-0001/jobRuns/b389224a-c259-4a00-ab75-c22e48bc3136",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-101-to-dev-0001",
        "TargetId": "dev"
      },
      "messageId": "5573609905896436",
      "publishTime": "2022-09-07T15:35:37.906Z"
    }
  },

配置 Cloud Deploy 以进行部署验证

为 Cloud Deploy 目标启用部署验证需要在交付流水线过程中向一个或多个给定目标添加 verify: true 属性,如以下示例所示:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: my-demo-app
description: main application pipeline
serialPipeline:
 stages:
 - targetId: dev
   profiles: []
   strategy:
     standard:
       verify: true
 - targetId: prod
   profiles: []
   strategy:
     standard:
       verify: false

在此配置中,对 dev 目标启用部署验证,但没有对 prod 目标启用。verify: false 相当于省略 verify 属性或整个 strategy 节。

验证操作在自己的执行环境中执行。您可以为 VERIFY 配置此执行环境,配置方式与为 RENDERDEPLOY 配置相同。

配置 Skaffold 以进行部署验证

为目标启用部署验证需要在部署的 skaffold.yaml 配置文件中使用 verify 节。如果您要为每个目标使用单独的配置文件,则此配置可以用于特定的 Skaffold 配置文件。

verify 节标识用于进行验证的容器,例如集成测试。

以下是一个包含 verify 节的 skaffold.yaml 示例:

apiVersion: skaffold/v3alpha1
kind: Config
build:
  artifacts:
    - image: integration-test
      context: integration-test
manifests:
  rawYaml:
  - kubernetes.yaml
deploy:
  kubectl: {}
verify:
- name: verify-integration-test
  container:
    name: integration-test
    image: integration-test
    command: ["./test-systems.sh"]
- name: verify-endpoint-test
  container:
    name: alpine
    image: alpine
    command: ["/bin/sh"]
    args: ["-c", "wget #ENDPOINT_URL"]

这个简单的示例展示了一个 verify,用于标识要使用的容器,以及要在该容器中运行的测试脚本。本示例中的 #ENDPOINT_URL 只是应用网址的占位符,而不是可用的 Cloud Deploy 环境变量。

在应用集群上运行验证容器

默认情况下,部署验证在 Cloud Deploy 执行环境中运行。您还可以将 Skaffold 配置为在运行应用的同一集群上运行验证容器。在 skaffold.yaml 中配置集群内验证并在目标上启用验证时,验证会自动在该目标的集群中运行。

此功能仅适用于部署到 GKE 和 GKE Enterprise,不适用于 Cloud Run。对 Cloud Run 的部署只能在 Cloud Deploy 执行环境中运行验证。

集群内验证需要 Skaffold 版本 2.3 或更高版本

如需在集群上运行验证容器,请在 skaffold.yaml 配置文件(位于特定验证容器的 verify 节内)中添加 executionMode.kubernetesCluster 节:

verify:
- name:
  container:
    name:
    image:
    command:
    args:
  executionMode:
    kubernetesCluster:

以下是一个验证 Stanza 示例,其中包含用于调用应用集群上的验证容器的 executionMode

verify:
- name: integration-test-container
  container:
    name: integration-test-container
    image: integration-test-container
  executionMode:
    kubernetesCluster: {}

executionMode 节是可选项;如果您将其省略,Skaffold 会在 Cloud Deploy 执行环境中运行验证容器。

重新尝试验证

如果验证作业失败,您可以重试验证,创建新的作业运行:

gcloud deploy rollouts retry-job ROLLOUT_NAME \
             --job-id=JOB_ID \
             --phase-id=PHASE_ID \
             --delivery-pipeline=PIPELINE_NAME \
             --release=RELEASE_NAME \
             --region=REGION

如果重新尝试验证,发布作业的状态会从 FAILED 更改为 IN_PROGRESS

您只能针对验证作业失败的发布作业重新尝试验证。

可用的环境变量

Cloud Deploy 在 VERIFY 执行环境中提供并填充以下环境变量,以供测试使用:

  • ANTHOS_MEMBERSHIP

    对于 ANTHOS 类型的目标,则为 Anthos 成员资格的完整资源名称。

  • CLOUD_RUN_LOCATION

    对于 RUN 类型的目标,表示部署 Cloud Run 服务的区域。

  • CLOUD_RUN_PROJECT

    对于 RUN 类型的目标,表示在其中创建 Cloud Run 服务的项目。

  • CLOUD_RUN_SERVICE

    对于 RUN 类型的目标,表示已部署的 Cloud Run 服务的名称。

  • CLOUD_RUN_SERVICE_URLS

    对于 RUN 类型的目标,表示最终用户将用于访问您的服务的网址(以英文逗号分隔的列表)。您可以在 Google Cloud 控制台中服务的 Cloud Run 服务详细信息中找到这些信息。

  • CLOUD_RUN_REVISION

    对于 RUN 类型的目标,表示 Cloud Run 服务的特定修订版本。

  • GKE_CLUSTER

    对于 GKE 类型的目标,指 Google Kubernetes Engine 集群的完整资源名称,例如 projects/p/locations/us-central1/clusters/dev

  • TARGET_TYPE

    目标的特定运行时类型。可以选择 GKEANTHOSRUN

  • CLOUD_DEPLOY_LOCATION

    运行执行环境的区域。

  • CLOUD_DEPLOY_DELIVERY_PIPELINE

    执行环境正在运行的 ID 交付流水线。

  • CLOUD_DEPLOY_TARGET

    执行环境正在运行的目标的 ID。

  • CLOUD_DEPLOY_PROJECT

    运行执行环境的 Google Cloud 项目的项目编号。

  • CLOUD_DEPLOY_RELEASE

    将在其中运行验证程序的版本的 ID。

  • CLOUD_DEPLOY_ROLLOUT

    包含待验证作业的发布的 ID。

  • CLOUD_DEPLOY_JOB_RUN

    表示作业当前执行的作业运行的 ID。

  • CLOUD_DEPLOY_PHASE

    包含要验证的作业的发布阶段