准备从 Standard 迁移到 Autopilot


本页面提供了注意事项和建议,以帮助您将工作负载从 Standard Google Kubernetes Engine (GKE) 集群迁移到 Autopilot 集群,同时将服务中断降至最低。本页面适用于已决定迁移到 Autopilot 的集群管理员。如果您需要更多信息,然后再决定迁移,请参阅选择 GKE 操作模式比较 GKE Autopilot 和 Standard

迁移的工作原理

Autopilot 集群实现了许多可选功能的自动化操作,而这些功能在 Standard 集群中需要手动配置。此外,与 Standard 模式相比,Autopilot 集群会对应用实施更安全的默认配置,以提供更适合生产的环境,并减少所需的管理开销。 默认情况下,Autopilot 集群会应用许多 GKE 最佳做法和建议。Autopilot 使用以工作负载为中心的配置模型,您可以在该模型中请求 Kubernetes 清单中所需的内容,而 GKE 预配相应的基础架构。

将 Standard 工作负载迁移到 Autopilot 时,您应准备工作负载清单以确保它们与 Autopilot 集群兼容,方法是,例如确保您的清单请求您自行预配时通常必须使用的基础架构。

如需准备和执行成功的迁移,您需要执行以下概要任务:

  1. 对现有 Standard 集群运行预检检查,以确认与 Autopilot 的兼容性。
  2. 如果适用,请修改工作负载清单以使其与 Autopilot 兼容。
  3. 执行试运行,以检查工作负载在 Autopilot 上是否正常运行。
  4. 规划并创建 Autopilot 集群。
  5. 如果适用,请更新基础架构即代码工具。
  6. 执行迁移。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 确保您已有的 Standard 集群具有正在运行的工作负载。
  • 确保您拥有的 Autopilot 集群没有工作负载,以执行试运行。如需创建新的 Autopilot 集群,请参阅创建 Autopilot 集群

在 Standard 集群上运行预检检查

Google Cloud CLI 和 Google Kubernetes Engine API 提供预检检查工具,用于验证正在运行的 Standard 工作负载的规范,以找出哪些地方与 Autopilot 集群不兼容。 GKE 1.26 及更高版本中提供了此工具。

  • 要在命令行中使用此工具,请运行以下命令:
gcloud container clusters check-autopilot-compatibility CLUSTER_NAME

CLUSTER_NAME 替换为您的 Standard 集群的名称。 或者,将 --format=json 添加到此命令,以获取 JSON 文件中的输出。

输出包含所有正在运行的 Standard 工作负载的发现结果,这些结果经过了分类并附有可操作建议,以确保与 Autopilot 兼容(如果适用)。下表介绍了这些类别:

预检工具结果
Passed 工作负载将按预期运行,无需针对 Autopilot 进行配置。
Passed with optional configuration

工作负载将在 Autopilot 上运行,但您可以选择更改配置以优化体验。如果您未更改配置,则 Autopilot 会为您应用默认配置。

例如,如果您的工作负载在 Standard 模式下的 N2 机器上运行,则 GKE 会为 Autopilot 应用通用计算类。您可以根据需要修改工作负载以请求由 N2 机器支持的均衡计算类。

Additional configuration required

除非您更改配置,否则工作负载不会在 Autopilot 上运行。

例如,假设一个容器使用 Standard 中的 NET_ADMIN 功能。默认情况下,Autopilot 会丢弃此功能以提高安全性,因此在部署工作负载之前,您需要在集群上启用 NET_ADMIN。

Incompatibility

工作负载使用了 Autopilot 不支持的功能,因此无法在 Autopilot 上运行。

例如,Autopilot 集群会拒绝特权 Pod(Pod 规范中的 privileged: true),以改善默认安全状况。在 Autopilot 中运行该应用的唯一方法是移除特权设置。

根据预检结果修改工作负载规范

运行预检检查后,逐步执行 JSON 输出并确定需要更改的工作负载。我们建议实施配置建议,即使是可选建议也是如此。每个发现结果还提供了一个文档链接,以向您展示工作负载规范应该是什么样子的。

Autopilot 与 Standard 之间的最重要的区别在于,Autopilot 中的基础架构配置根据工作负载规范自动执行。Kubernetes 调度控制(例如节点污点和容忍)会自动添加到正在运行的工作负载中。如有必要,您还应修改基础架构即代码配置(例如 Helm 图表或 Kustomize 叠加层)以进行匹配。

您需要进行的一些常见配置更改包括:

Autopilot 的常见配置更改
计算和架构配置

Autopilot 集群默认使用 E 系列机器类型。如果您需要其他机器类型,则工作负载规范必须请求计算类,告知 Autopilot 将这些 Pod 放置在使用特定机器类型或架构的节点上。

如需了解详情,请参阅 Autopilot 中的计算类

加速器

基于 GPU 的工作负载必须在工作负载规范中请求 GPU。 Autopilot 会自动预配具有所需机器类型和加速器的节点。

如需了解详情,请参阅在 Autopilot 中部署 GPU 工作负载

资源请求量

所有 Autopilot 工作负载都需要在 Pod 规范中指定 resources.requests 的值。GKE 使用这些值来预配适当的机器大小来运行 Pod。 如果您省略任何请求数,Autopilot 可提供自动应用的特定默认请求数,并且会根据工作负载的计算类或硬件请求强制执行特定的最小值和最大值。

如需了解详情,请参阅 Autopilot 中的资源请求

Spot 虚拟机上的容错工作负载

如果您的工作负载在 Standard 中的 Spot 虚拟机上运行,请通过为 cloud.google.com/gke-spot=true 设置节点选择器来请求工作负载配置中的 Spot Pod。

如需了解详情,请参阅 Spot Pod

在预演 Autopilot 集群上执行试运行

修改每个工作负载清单后,在新的预演 Autopilot 集群上执行试运行部署,以确保工作负载按预期运行。

命令行

运行以下命令:

kubectl create --dry-run=server -f=PATH_TO_MANIFEST

PATH_TO_MANIFEST 替换为修改后的工作负载清单的路径。

IDE

如果您使用 Cloud Shell Editor,则试运行命令是内置的,可在任何打开的清单上运行。如果您使用 Visual Studio Code 或 Intellij IDE,请安装 Cloud Code 扩展程序,以在任何打开的清单上自动运行试运行。

IDE 中的 Problems 窗格会显示任何试运行问题,例如在下图中,指定了 privileged: true 的清单的试运行失败。

Visual Studio Code 中 application.yaml 清单的试运行的输出。该消息显示如下:失败的服务器试运行应用于当前上下文:准入网络钩子拒绝了请求。

规划目标 Autopilot 集群

当试运行不再显示问题时,请为工作负载规划并创建新的 Autopilot 集群。此集群与您在上一部分中用于测试清单修改的 Autopilot 集群不同。

使用转移到 GKE 的最佳做法,了解基本配置要求。然后,阅读 Autopilot 概览,其中提供了有关不同层中的用例的信息。

此外,请考虑以下事项:

  • Autopilot 集群是 VPC 原生集群,因此我们不建议从基于路由的 Standard 集群迁移到 Autopilot。
  • 对 Autopilot 集群和 Standard 集群使用相同或类似的 VPC,包括任何自定义防火墙规则和 VPC 设置。
  • Autopilot 集群使用 GKE Dataplane V2 且仅支持 Cilium NetworkPolicy。不支持 Calico NetworkPolicy。
  • 如果要在 Autopilot 中使用 IP 伪装,请使用出站流量 NAT 政策
  • 如果您有专用 Standard 集群,请创建具有类似隔离设置的专用 Autopilot 集群
  • 在创建集群期间为集群指定主要 IPv4 范围,范围大小与 Standard 集群相同。
  • 了解各模式之间的配额差异,尤其是在具有大型集群的情况下。
  • 了解 Autopilot 的每个节点的 Pod 数上限,这与 Standard 不同。如果您经常使用节点或 Pod 亲和性,则这一点更为重要。
  • 所有 Autopilot 集群都使用 Cloud DNS

创建 Autopilot 集群

准备好创建集群后,请使用创建 Autopilot 集群。 所有 Autopilot 集群都是区域级的,并会自动注册到发布渠道,但您可以指定渠道和集群版本。我们建议将一个小型示例工作负载部署到集群以触发节点自动预配过程,以便生产工作负载可以立即调度。

更新基础架构即代码工具

以下基础架构即代码提供方支持 Autopilot:

阅读您的首选提供方的文档并修改配置。

选择迁移方法

您使用的迁移方法取决于您的单个工作负载、您对多集群 Service多集群 Ingress 等网络概念的熟悉程度以及您对集群中 Kubernetes 对象状态的管理方式。

工作负载类型 预检工具结果 迁移方法
无状态
  • 通过
  • 使用可选配置通过
  • 需要其他配置

对于 PassedPassed with optional configuration 工作负载,您还可以使用 Backup for GKE 将所有工作负载迁移到 Autopilot 集群。您仍必须更新流水线和上游清单以定位 Autopilot 集群。如需了解概要步骤,请参阅使用 Backup for GKE 迁移所有工作负载

有状态
  • 通过
  • 使用可选配置通过

请采用以下方法之一:

  • Backup for GKE:使用 Backup for GKE 将有状态工作负载迁移到 Autopilot 集群,同时保留现有 PersistentVolume 关系。如需了解概要步骤,请参阅使用 Backup for GKE 迁移所有工作负载。 支持跨区域迁移。
  • 手动:手动移动有状态工作负载。 此方法需要仔细规划 PersistentVolume 和 Compute Engine 磁盘。如需了解概要步骤,请参阅手动迁移有状态工作负载。 不支持跨区域迁移。
需要其他配置 在计划停机期间更新 Kubernetes 清单并在 Autopilot 上重新部署。如需了解概要步骤,请参阅手动迁移有状态工作负载

概要迁移步骤

在开始迁移之前,请确保已解决预检检查中的所有 IncompatibleAdditional configuration required 结果。如果您在 Autopilot 上部署的工作负载带有这些结果并且未进行修改,则工作负载将会失败。

以下部分是假设迁移的简要概览。 实际步骤因环境和每个工作负载而异。 在迁移生产环境之前,请计划、测试和重新测试工作负载以解决问题。注意事项包括以下内容:

  • 迁移过程的时长取决于您要迁移的工作负载数量。
  • 迁移有状态工作负载时,必须停机。
  • 采用手动迁移可以在迁移过程中专注于单个工作负载,以便根据具体情况实时解决问题。
  • 在所有情况下,请确保迁移 Service、Ingress 和其他 Kubernetes 对象,以有助于无状态和有状态工作负载的功能。

使用 Backup for GKE 迁移所有工作负载

如果 Standard 集群中运行的所有工作负载(有状态和无状态)都与 Autopilot 兼容,并且预检工具为每个工作负载都返回 PassedPassed with optional configuration,则您可以使用 Backup for GKE 备份 Standard 集群和工作负载的整个状态,并将备份恢复到 Autopilot 集群。

此方法具有以下优势:

  • 您可以将所有工作负载从 Standard 迁移到 Autopilot 操作,并且只需进行极少的配置。
  • 您可以移动无状态和有状态工作负载,并保留工作负载之间的关系以及关联的 PersistentVolume。
  • 回滚操作非常直观,由 Google 管理。您可以回滚整个迁移过程,也可以选择性地回滚特定的工作负载。
  • 您可以跨 Google Cloud 区域迁移有状态工作负载。手动迁移有状态工作负载只能在同一区域进行。

使用此方法时,GKE 会将 Autopilot 默认配置应用于从预检工具收到 Passed with optional configuration 结果的工作负载。在迁移这些工作负载之前,请确保您接受这些默认值。

在不停机的情况下手动迁移无状态工作负载

要在不停机的情况下迁移无状态工作负载,请将来源集群和目标集群注册到 GKE 舰队,并使用多集群 Service 和多集群 Ingress 确保您的工作负载在迁移过程中保持可用。

  1. 为来源集群和目标集群启用多集群 Service 和多集群 Ingress。如需查看相关说明,请参阅配置多集群 Service设置多集群 Ingress
  2. 如果您有后端依赖项(例如数据库工作负载),请使用多集群 Service 从 Standard 集群导出这些 Service。 这样,Autopilot 集群中的工作负载便可以访问 Standard 集群中的依赖项。如需查看相关说明,请参阅注册 Service 以进行导出
  3. 部署多集群 Ingress 和多集群 Service 以控制集群之间的入站流量。将多集群 Service 配置为仅将流量发送到 Standard 集群。如需了解相关说明,请参阅跨集群部署 Ingress
  4. 将包含更新后的清单的无状态工作负载部署到 Autopilot 集群。导出的多集群 Service 会自动匹配流量并将其发送到相应的有状态工作负载。
  5. 更新多集群 Service,将入站流量定向到 Autopilot 集群。如需了解相关说明,请参阅集群选择

您现在正在从 Autopilot 集群处理无状态工作负载。如果您在来源集群中只有无状态工作负载,并且没有剩下任何依赖项,请继续完成迁移。如果您有有状态工作负载,请继续手动迁移有状态工作负载

手动迁移有状态工作负载

迁移无状态工作负载后,您必须静默有状态工作负载并将其从 Standard 集群迁移。此步骤需要您的集群停机。

  1. 启动环境停机。
  2. 静默有状态工作负载。
  3. 请务必修改工作负载清单,以满足 Autopilot 兼容性。如需了解详情,请参阅根据预检结果修改工作负载规范
  4. 在 Autopilot 集群上部署工作负载。

  5. 在 Autopilot 集群上为有状态工作负载部署 Service。

  6. 更新集群内网络,以允许无状态工作负载继续与后端工作负载通信:

    • 如果您在 Standard 集群后端服务中使用了静态 IP 地址,请在 Autopilot 中重复使用该 IP 地址。
    • 如果您让 Kubernetes 分配 IP 地址,请部署后端服务,获取新 IP 地址,然后更新 DNS 以使用新的 IP 地址。

在此阶段,应满足以下条件:

  • 您正在 Autopilot 中运行所有无状态工作负载。
  • 任何后端有状态工作负载也在 Autopilot 中运行。
  • 无状态和有状态工作负载可以相互通信。
  • 您的多集群 Service 会将所有入站流量定向到您的 Autopilot 集群。

将所有工作负载和 Kubernetes 对象迁移到新集群后,请继续完成迁移

替代方案:在停机期间手动迁移所有工作负载

如果您不想使用多集群 Service 和多集群 Ingress 来以最短的停机时间迁移工作负载,请在停机期间迁移所有工作负载。此方法会导致服务的停机时间延长,但不需要使用多集群功能。

  1. 开始停机。
  2. 在 Autopilot 集群上部署无状态清单。
  3. 手动迁移有状态工作负载。如需了解相关说明,请参阅手动迁移有状态工作负载部分。
  4. 修改集群内和入站外部流量的 DNS 记录,以使用 Service 的新 IP 地址。
  5. 结束停机。

完成迁移

将所有工作负载和 Service 迁移到新的 Autopilot 集群后,请结束停机,并让您的环境在这种情况下等待预定时长。如果您对迁移状态感到满意,并且确定不需要回滚迁移,则可以清理迁移工件并完成迁移。

可选:清理多集群功能

如果您使用多集群 Ingress 和多集群 Service 进行迁移,并且不希望 Autopilot 集群继续注册到舰队,请执行以下操作:

  1. 对于入站外部流量,请部署 Ingress 并将其设置为公开工作负载的 Service 的 IP 地址。如需查看相关说明,请参阅外部应用负载均衡器的 Ingress
  2. 对于集群内流量(例如从前端工作负载到有状态依赖项的流量),请更新集群 DNS 记录以使用这些 Service 的 IP 地址。
  3. 删除您在迁移期间创建的多集群 Ingress 和多集群 Service 资源。
  4. 停用多集群 Ingress 和多集群 Service
  5. 从舰队中取消注册 Autopilot 集群

删除 Standard 集群

在迁移完成后,经过足够长的时间,您对新集群的状态感到满意后,请删除 Standard 集群。我们建议您保留备份的 Standard 清单。

回滚有问题的迁移

如果您遇到问题并想要还原到 Standard 集群,请根据执行迁移的方式执行以下操作之一:

  • 如果您在迁移过程中使用 Backup for GKE 创建备份,请将备份恢复到原始 Standard 集群。如需查看相关说明,请参阅恢复备份

  • 如果您手动迁移了工作负载,请重复上述部分中的迁移步骤,并将 Standard 集群作为目标,将 Autopilot 集群作为来源。概括来讲,包括以下步骤:

    1. 开始停机。
    2. 将有状态工作负载手动迁移到 Standard 集群。如需了解相关说明,请参阅手动迁移有状态工作负载部分。
    3. 使用在迁移之前备份的原始清单将无状态工作负载迁移到 Standard 集群。
    4. 将 Ingress 部署到 Standard 集群,并将 DNS 切换到 Service 的新 IP 地址。
    5. 删除 Autopilot 集群。

后续步骤