将节点迁移到 containerd 2


Google Kubernetes Engine (GKE) 集群使用容器化节点映像,并且所有工作器节点都运行 1.24 及更高版本。工作器节点使用特定版本的 containerd,具体取决于 GKE 版本:

  • 运行 GKE 1.32 或更低版本且使用 containerd 节点映像的节点使用 containerd 1.7 或更低版本。
  • 运行 GKE 1.33 的节点使用 containerd 2.0。

将 GKE 节点从 1.32 升级到 1.33 时,节点会从使用 containerd 1.7 迁移到新的主版本 containerd 2.0。您无法更改 GKE 版本使用的 containerd 版本。

如果您知道自己的工作负载在 containerd 2 上按预期运行,则可以跳过阅读本页面。

GKE 如何过渡到 containerd 2

查看以下时间表,了解 GKE 如何将现有集群过渡到使用 containerd 2:

  • 在次要版本 1.32 中,GKE 使用 containerd 1.7。containerd 1.7 弃用了 Docker Schema 1 映像和容器运行时接口 (CRI) v1alpha2 API。如需了解在较低版本中已废弃的其他功能,请参阅已废弃的配置属性
  • 在次要版本 1.33 中,GKE 使用 containerd 2.0,该版本移除了对 Docker Schema 1 映像和 CRI v1alpha2 API 的支持。
  • CRI 插件中的以下 containerd 配置属性已废弃,并将在 containerd 2.1 中移除,GKE 版本尚未公布:registry.authsregistry.configsregistry.mirrors.

如需了解自动升级到更高次要版本(例如 1.33)的大致时间,请参阅发布渠道的预计时间表

改用 containerd 2 的影响

请阅读以下部分,了解向 containerd 2 的过渡的影响。

自动升级已暂停

GKE 在检测到集群使用已弃用的功能时,会暂停到 1.33 版的自动升级。不过,如果您的集群节点使用这些功能,我们建议您创建维护排除项以阻止节点升级。维护排除项可确保,如果 GKE 未检测到使用情况,您的节点不会升级。

在您停止使用这些功能后,如果 1.33 是集群节点的自动升级目标,并且没有其他因素阻止自动升级,GKE 会恢复自动升级到 1.33。对于 Standard 集群节点池,您还可以手动升级节点池

支持终止以及未做好迁移准备的影响

GKE 会暂停自动升级,直到标准支持服务结束。如果您的集群已在扩展渠道中注册,则您的节点可以一直使用该版本,直到扩展支持服务结束日期。如需详细了解在支持服务结束时自动升级节点,请参阅在支持服务结束时自动升级

如果您不从这些功能迁移,当 1.32 版达到支持终止期限,并且您的集群节点自动升级到 1.33 版时,您的集群可能会遇到以下问题:

  • 使用 Docker Schema 1 映像的工作负载会失败。
  • 调用 CRI v1alpha2 API 的应用在调用该 API 时会失败。

从已弃用的功能迁移

请查看以下内容,了解如何从在 containerd 2 中已废弃的功能迁移。

从 Docker Schema 1 映像迁移

确定使用必须迁移的映像的工作负载,然后迁移这些工作负载。

查找要迁移的映像

您可以使用不同的工具查找必须迁移的图片。

使用 Cloud Logging

您可以在 Cloud Logging 中使用以下查询检查 containerd 日志,以查找集群中的 Docker Schema 1 映像:

jsonPayload.SYSLOG_IDENTIFIER="containerd"
"conversion from schema 1 images is deprecated"

如果图片提取已超过 30 天,您可能看不到图片的日志。

直接在节点上使用 ctr 命令

如需查询特定节点以返回以架构 1 提取的所有未删除映像,请在节点上运行以下命令:

  ctr --namespace k8s.io images list 'labels."io.containerd.image/converted-docker-schema1"'

例如,如果您正在排查特定节点的问题,并且由于从映像拉取已超过 30 天,因此在 Cloud Logging 中没有看到日志条目,此命令会很有用。

使用 crane 开源工具

您还可以使用 crane 等开源工具检查图片。

运行以下 crane 命令可检查映像的架构版本:

crane manifest $tagged_image | jq .schemaVersion

准备工作负载

如需准备运行 Docker Schema 1 映像的工作负载,您必须将这些工作负载迁移到 Schema 2 Docker 映像或 Open Container Initiative (OCI) 映像。请考虑以下迁移选项:

  • 查找替换映像:您或许可以找到公开的开源映像或供应商提供的映像。
  • 转换现有映像:如果您找不到替换映像,可以按照以下步骤将现有的 Docker Schema 1 映像转换为 OCI 映像:
    1. 将 Docker 映像拉取到 containerd,它会自动将其转换为 OCI 映像。
    2. 将新的 OCI 映像推送到您的注册表。

从 CRI v1alpha2 API 迁移

CRI v1alpha2 API 已在 Kubernetes 1.26 中移除。您必须找出所有访问 containerd 套接字的工作负载,然后更新这些应用,改用 v1 API。

识别工作负载

您可以使用不同的方法来确定必须迁移的工作负载。

使用 kubectl

以下命令可帮助您查找访问 containerd 套接字的工作负载。此命令会返回挂载包含套接字的 hostPath 目录的工作负载。此查询可能会导致误报,因为某些工作负载会挂载这些目录或其他子目录,但不会访问容器化套接字。

运行以下命令:

kubectl get pods --all-namespaces -o json | jq -r '.items[] |
select(.spec.volumes[]? | select(.hostPath.path? and (.hostPath.path |
startswith("/run") or startswith("/var/run") or . == "/"))) |
.metadata.namespace + "/" + .metadata.name'
检查应用代码

您可以检查应用代码,看看它是否在导入 CRI v1alpha2 API 客户端库。

例如,请参阅以下 golang 代码:

  package main

  import (
    ...

    runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
  )

  func foo() {
    ...

    client := runtimeapi.NewRuntimeServiceClient(conn)
    version, err := client.Version(ctx, &runtimeapi.VersionRequest{})

    ...
  }

在这里,应用会导入 v1alpha2 库,并使用该库发出 RPC。如果 RPC 使用与 containerd 套接字的连接,则此应用会导致 GKE 暂停集群的自动升级。

请按以下步骤搜索和更新应用代码:

  1. 运行以下命令搜索 v1alpha2 导入路径,以便找出有问题的 golang 应用:

      grep -r "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
    

    如果此命令的输出显示文件中使用了 v1alpha2 库,则您必须更新该文件。

    例如,请替换以下应用代码:

      runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
    
  2. 将代码更新为使用 v1:

      runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"