部署应用

本页面介绍了如何使用 Cloud Deploy 将应用部署到预期的目标运行时环境。在此之前,您需要创建交付流水线和目标

准备工作

本部分介绍在使用 Cloud Deploy 部署应用之前需要完成的准备工作。

  • 确保您的执行服务帐号具有必要的 IAM 角色和权限

  • 创建交付流水线和目标

    Cloud Deploy 可以部署到 Google Kubernetes Engine、Cloud Run 和 GKE Enterprise 集群。目标配置取决于您要部署到的目标配置。

  • 准备好您的容器映像和清单。

    您需要一个或多个要部署的容器映像,以及一个或多个 Kubernetes 清单(部署到 GKE)或服务 YAML 文件(部署到 Cloud Run)。

    您需要使用持续集成流水线或其他一些流程来构建和放置映像。CI 工具可以是 Cloud Build、Jenkins 或生成容器映像的任何工具,您可以提供给 Cloud Deploy 交付流水线。

  • 拥有 skaffold.yaml 配置文件

    Cloud Deploy 调用 skaffold render 以使用此文件呈现 Kubernetes 清单,并使用 skaffold apply 将其部署到目标中。为此,Skaffold 至少需要一个最小的 skaffold.yaml。您可以采用以下两种方式之一:

    • 自行创建受众群体。

      请注意,skaffold.yaml 文件必须在第一行中引用支持的 Skaffold 版本对应的命名空间,如以下示例所示:

      `apiVersion: skaffold/v4beta7`
      
    • 让它为您生成。

      如果您还没有 skaffold.yaml 文件,则可以让 Cloud Deploy 为您创建一个文件。此文件适用于新手入门、学习或演示 Cloud Deploy,不应用于生产工作负载。

    如需了解详情,请参阅将 Skaffold 与 Cloud Deploy 搭配使用。此外,如需详细了解如何将 Skaffold 和 Cloud Deploy 与清单管理工具(如 Helm、Kustomize 和 kpt)搭配使用,请参阅在 Cloud Deploy 中管理清单

为您选择的运行时环境设置 Cloud Deploy

Cloud Deploy 可以将您的应用部署到以下任何运行时环境:

调用交付流水线以创建版本

将 Cloud Deploy 配置为部署到运行时后,您现在可以根据您创建的交付流水线提交要部署的应用。

  1. 运行常规持续集成 (CI) 流程,以创建一个或多个可部署的工件。

  2. 通过调用 Cloud Deploy 创建版本来启动交付流水线。

    从包含 Skaffold 配置的目录中运行以下命令:

    gcloud deploy releases create RELEASE_NAME --delivery-pipeline=PIPELINE_NAME --region=REGION
    

    由于此命令会创建包含目录及所有子目录的全部内容的 tar 文件,因此您可能不想从主目录或根目录运行此命令。从包含 Skaffold 配置的目录运行该命令,或包含 --source= 选项(如后文所述)。

    在此命令中...

    RELEASE_NAME 是为此版本指定的名称。该名称在此交付流水线的所有版本中必须是唯一的。

    您可以通过添加 '$DATE' 和/或 '$TIME' 来指定动态发布版本名称。例如,如果您在世界协调时间 (UTC) 下午 3:07 调用此命令,则 'rel-$TIME' 将解析为 rel-1507'$DATE''$TIME' 必须采用英文单引号,并且时间是调用该命令的机器上的世界协调时间 (UTC)。

    PIPELINE_NAME 是交付流水线的名称,该流水线将在目标的进展过程中管理此版本的部署。此名称必须与流水线定义中的 name 字段匹配。

    REGION 是您要创建版本的区域的名称,例如 us-central1。这是必填项。

此命令将包含您的配置的 tar 文件上传到 Cloud Storage 存储桶,并创建版本。Cloud Deploy 还会自动创建发布,并将映像部署到交付流水线中定义的第一个目标。

除了此命令中显示的参数之外,您还可以添加以下选项之一:

  • --images=<name=path/name:$IMAGE_SHA>,<name=path/name:$IMAGE_SHA>

    映像名称的集合到映像完整路径替换。

  • --build-artifacts=<path/file>

    对 Skaffold 构建工件输出文件的引用,可以传入该文件以表示映像完整路径替换。

这两个选项是互斥的。

您还可以添加以下标志之一,让 Cloud Deploy 为您生成 skaffold.yaml 文件:

这两个选项是互斥的。

如果目录中存在您不希望包含在 tar 文件中的文件,也可以添加 .gcloudignore 文件。

通过 Google Cloud 控制台创建版本

您可以使用 Google Cloud 控制台为交付流水线创建版本。这对于试用 Cloud Deploy 非常有用,但不适用于生产工作负载。

以下过程假定您已创建交付流水线以及一个或多个目标。(您也可以使用 Google Cloud 控制台)创建交付流水线。)

  1. 交付流水线详情页面中,对于特定的交付流水线,点击创建版本

    交付流水线详情,其中显示了“创建版本”按钮

  2. 选择容器字段中,粘贴或输入要部署的容器映像的路径。您还可以使用此字段中预填充的默认容器进行评估。

    您还可以点击选择,从 Artifact Registry 或 Container Registry 中选择容器映像。

  3. 版本名称字段中为此版本提供唯一的名称,或使用提供的默认名称。

  4. 发布名称字段中提供发布的名称,或使用提供的默认名称。

    此名称用于发布到此版本的第一个目标。对于后续目标,您可以在提升对话框或 gcloud deploy releases promote 命令中为该发布命名。

  5. (可选)在说明字段中添加此版本的说明。

  6. 部署详情下,输入 GKE 部署或 Cloud Run 服务的名称,或使用提供的默认名称。

    对于 GKE,Cloud Deploy 会为您生成清单。对于 Cloud Run,Cloud Deploy 会生成服务定义,用于创建服务。

  7. 点击创建

    “创建版本”对话框

Cloud Deploy 使用生成的清单或 Cloud Run 服务定义以及生成的 skaffold.yaml 来创建版本。

更改部署超时时间

对于部署到 GKE 和 GKE Enterprise 目标集群的作业,有三种不同的超时会影响系统等待 Kubernetes 报告稳定部署的时间:

  • 对于 Cloud Build 为 Cloud Deploy 执行的操作,Cloud Build 将超时设置为 1 小时。

    您可以在执行环境配置中更改此超时设置。

  • Skaffold 具有健康检查超时 (deploy.statusCheckDeadlineSeconds),这是等待部署进入稳定状态的时间(以秒为单位)。

    默认值是 600 秒(即 10 分钟)。如需使用此超时,必须将 deploy.statusCheck 设置为 true。默认为 。如果 statusCheckfalse,则不进行状态检查,kubectl apply 成功完成后,发布会被标记为成功。

  • 对于 kind: Deployment 的 Kubernetes 资源,则会显示 Deployment.spec.progressDeadlineSeconds,这是 Kubernetes 等待 Deployment 报告为稳定版的时间。

    此超时仅适用于 Deployment 资源。以下是前两种超时设置的具体方式:

    • 如果 Kubernetes 中的 Deployment.spec.progressDeadlineSeconds 未设置,则 Skaffold 健康检查超时是有效超时时间(无论是默认值还是明确设置)。

    • 如果在 Kubernetes 中设置了 Deployment.spec.progressDeadlineSeconds,则 Skaffold 会忽略自己的健康检查超时,而 Kubernetes 进度期限就是有效超时。但是,如果 Kubernetes 超时被明确设置为 600(10 分钟),则 Skaffold 会假定它是默认值(未设置)并忽略它,并使用 Skaffold 超时(如果已设置)。

    • 如果二者均未设置,则有效超时为 Skaffold 的默认值 600(10 分钟)。

    除了 Deployment 之外,其他 Kubernetes 资源也可以设置超时,而这不会影响稳定性超时。如果存在其中任何一项,请检查它们以确保它们没有与稳定性超时冲突。

    如果 Skaffold(或 Cloud Build)超时,GKE 部署将继续运行。Cloud Deploy 显示失败,但在 GKE 集群上仍然可能成功或失败。

如需更改部署稳定性超时,请执行以下操作:

  1. 确保将 skaffold.yaml 中的 deploy.statusCheck 设置为 true

    默认为 true。如果为 true,则 Skaffold 会根据下一步中的超时值,等待健康检查报告稳定部署。

  2. skaffold.yaml 中,将 statusCheckDeadlineSeconds 设置为您希望等待的秒数。

    deploy:
      ...
      statusCheck: true
      statusCheckDeadlineSeconds: 600
      ...
    

    默认值为 600(10 分钟)。Skaffold 需要等待此时间才能实现稳定部署。如果在部署稳定之前超出此时间,则部署将失败。

  3. (可选)您可以在 statusCheckDeadlineSeconds 之后添加 tolerateFailuresUntilDeadline: true

    此设置会指示 Skaffold 在单个部署失败时不要退出,但可以容忍失败直至 statusCheckDeadlineSeconds 到期。如果您的资源可能需要更多时间(在状态检查截止日期之前)才能达到稳定状态,此设置将非常有用。

    例如,如果您使用的是 Istio 或 Anthos Service Mesh,则可能会出现部署失败的情况,并显示类似如下的消息:

    error iptables validation failed; workload is not ready for Istio.
    When using Istio CNI, this can occur if a pod is scheduled before the node is ready.
    

    此设置仅适用于 Skaffold 2.0 或更高版本。

  4. 在 Kubernetes 清单中,对于 kind: Deployment 的资源,将 Deployment.spec.progressDeadlineSeconds 设置为您为 statusCheckDeadlineSeconds 设置的值。

后续步骤