Cloud Deploy 服务架构

本文档介绍了 Cloud Deploy 与其用于部署应用的外部系统之间的关系。这些系统是其他 Google Cloud 服务和第三方工具。

概要视图

下图显示了 Cloud Deploy 与其依赖的系统之间的关系。

Cloud Deploy 组件之间的关系

如下图所示,Cloud Deploy 与以下系统交互:

  • 您的 CI 系统

    Cloud Deploy 支持大多数 CI 工具,前提是该 CI 流程的一个输出可以调用 Cloud Deploy APICLI创建版本

  • Cloud Build

    Cloud Deploy 调用 Cloud Build 来渲染清单以及部署到目标运行时。

  • Skaffold

    Cloud Deploy 通过 Cloud Build 使用 Skaffold 来渲染和部署清单,从而部署应用。

  • Cloud Storage

    Cloud Deploy 将渲染来源和已渲染清单存储在 Cloud Storage 存储桶中。

  • Google Cloud ObservabilityCloud Audit Logs

    Google Cloud Observability 会收集并提供 Cloud Deploy 的日志记录数据。

    另请参阅审核日志记录

  • Pub/Sub

    Cloud Deploy 将消息发布到多个 Pub/Sub 主题。您可以使用此服务来与外部工作流、测试和其他相关系统集成。

    如需了解详情,请参阅订阅 Cloud Deploy 通知

  • 目标运行时

    Cloud Deploy 使用 skaffold apply 通过 Cloud Build 将应用部署到目标运行时 (GKE 或 GKE Enterprise)。

Cloud Deploy 资源

下图显示了 Cloud Deploy 用于交付应用的资源,以及这些资源之间的关系:

Cloud Deploy 资源之间的关系

如图所示,资源之间的关系如下:

  • 交付流水线可以生成零个或多个版本,并且可以引用一个或多个目标,包括多目标及其关联的子目标

  • 交付流水线还可以引用一个或多个自动化操作,以自动执行对 Cloud Deploy 资源的操作。

  • 每个版本都包含流水线实例,即交付流水线和目标在创建版本时所配置的“快照”。

  • 每个版本可以产生零个或多个发布版本,并且可以引用零个或多个工件。

    每个发布版本至少包含一个阶段,表示发布版本中逻辑上分组在一起的一组操作(作业),例如部署或部署和验证。

    每个阶段都包含一个或多个作业,表示在部署过程中要执行的操作(部署或验证)。每个作业可以包含一个或多个作业运行,这些作业运行是作业的实例,例如部署尝试。作业运行是发布的子资源。

    多目标用于并行部署,用于创建控制器版本发布,后者用于创建与子目标对应的子版本发布。

  • 每个发布版本都与一个目标相关联。

    对于并行部署,每个子目标平台都与一个子版本发布相关联。

  • 每个目标都与一个 GKE 或 Anthos 集群或应用的其他运行时目标相关联。

  • 一个目标可以与一个或多个交付流水线相关联。

  • 工件是指 CI 流程中的任何输出(例如容器映像),这些输出会在发布过程中部署到目标运行时。

此外,发布包含一个或多个阶段,每个阶段包含一个或多个作业以及一个或多个作业运行。

发布资源

如图所示,发布包括以下步骤:

  • 阶段

    一个阶段包含一个或多个作业(例如部署或部署和验证)。每个发布版本都有一个或多个阶段。阶段是发布中的子消息。

  • 求职招聘

    要对发布进行的具体操作,例如部署或验证。作业是发布中的子消息。

  • JobRuns

    作业的实例,例如验证尝试。每项作业可以没有或有多个 JobRun。JobRun 是发布的子资源。

自动化操作包含自动化操作规则,零个或多个 AutomationRun 资源可能会引用这些规则。AutomationRun 是已执行自动化规则的实例,例如从一个目标自动提升到另一个目标。Automation 和 AutomationRun 资源是提交流水线下的同级子资源。

Automation 资源

它们如何整合在一起以交付版本

本部分介绍 Cloud Deploy 如何与本文档中列出的组件交互,来以版本的形式自动交付应用。

  1. 您的 CI 系统调用 Cloud Deploy 交付流水线。

    您的 CI 流程使用 CLIAPI 调用 Cloud Deploy 来创建新版本,并传递构建工件或对映像的引用。

    如需详细了解如何集成 CI 系统,请参阅将 Cloud Deploy 与其他系统集成

  2. 创建新版本后,Cloud Deploy 会执行以下操作:

    1. 将交付流水线的实例存储为版本的一部分。

      即使交付流水线配置已更改,此版本的此流水线实例也保持不变。如需了解详情,请参阅每个版本的流水线实例

      此外,Skaffold 版本会存储为版本的一部分。在大多数情况下,这将是默认的 Skaffold 版本,但由于您可以指定其他版本,因此系统会存储这些信息。

    2. 调用 Cloud Build,以从 Cloud Storage 获取 Skaffold 渲染来源。

      Cloud Deploy 将渲染源存储在默认或备用 Cloud Storage 存储桶中。

    3. 调用 skaffold diagnose(使用创建版本时存储的 Skaffold 版本)生成单个有效的清单。

    4. 调用 render 运算。

      如果您使用的是内置目标,Cloud Deploy 会调用 skaffold render 以使用提供的映像或构建工件渲染清单。Cloud Deploy 会将 spec.templates.spec.containers.image 中的映像名称替换为在 gcloud deploy releases create 命令上或由该命令引用的构建工件文件中提供的完整映像路径(包括摘要或标记)。

      如果您使用的是自定义目标,Cloud Deploy 会调用为其自定义目标类型定义的 render 操作

      Cloud Deploy 将已渲染清单存储在默认或备用 Cloud Storage 存储桶中。

      Cloud Deploy 使用默认或备用执行环境来执行这些操作。

  3. 创建发布版本(在创建版本后自动执行,或稍后按需执行)时,Cloud Deploy 会执行以下操作:

    1. 调用预部署钩子(如果有)。

      如果您使用的是预演版部署策略,系统会在第一个阶段开始时调用预部署钩子。

    2. 调用 deploy 运算。

      如果您使用的是内置目标,Cloud Deploy 会通过调用 skaffold apply 自动创建发布并将其部署到第一个目标。如果您使用的是内置目标,系统会在创建版本时自动创建第一个发布。

      如果您使用的是自定义目标,Cloud Deploy 会自动调用为其自定义目标类型定义的 deploy 操作,以便将发布部署到第一个目标。

      对于内置目标和自定义目标,只有在使用命令行创建版本时,系统才会自动将版本发布到第一个目标。

      部署到第一个目标的过程与提升相同,如下一步所述。

    3. 如果交付流水线配置中的目标的 verifytrue,并且在 Skaffold 配置中指定了验证,则调用 skaffold verify

    4. 如果指定了 verify,则在 verify 之后调用部署后钩子(如果有)。否则,系统会在 deploy 之后调用部署后钩子。

      如果您使用的是 Canary 部署策略,则部署后钩子会作为最终发布阶段中的最后一项作业执行。

  4. 当需要将版本提升到下一个目标时,Cloud Build 会从 Cloud Storage 中检索特定于目标的清单。然后,Cloud Build 调用 skaffold apply 以将已渲染清单应用于指定的目标运行时。

    如果目标需要批准,您可以通过 CLI 或使用控制台批准或拒绝。

    此外,Cloud Deploy 会生成 Pub/Sub 消息,您可以订阅该消息以自动启动批准工作流

    Cloud Deploy 使用与此版本关联的 Skaffold 版本和流水线实例,并在默认或自定义执行环境中执行此步骤。

    此过程不仅适用于提升,也适用于回滚和重新部署。

  5. 在整个 Cloud Deploy 操作中,该服务会将通知发布到多个 Pub/Sub 主题(例如,当发布需要批准时)。

    将 Cloud Deploy 与外部系统集成中进一步介绍了此集成和其他集成。

  6. 您可以指定自动化操作,以便在提交流水线中自动执行各种操作。这些作业可以在指定时间执行。automationRun 表示自动化规则的执行。

  7. 在整个 Cloud Deploy 操作期间,该服务会将平台日志和审核日志写入 Google Cloud Observability 和 Cloud Audit Logs。

在所有这些步骤中,都可以使用 Identity and Access Management 来限制流控制和资源访问权限。

后续步骤