将节点的容器运行时从 Docker Engine 更改为 containerd

本任务概述了将容器运行时从 Docker 更新为 containerd 所需的步骤。它适用于运行 Kubernetes 1.23 或更早版本的集群操作员。此文档还涵盖了从 dockershim 迁移到 containerd 的示例场景。其他容器运行时可以从本页面中选择。

开始之前

注意: 本节链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不对这些项目负责,项目按字母顺序排列。要将项目添加到此列表,请在提交更改之前阅读 内容指南更多信息。

安装 containerd。有关详细信息,请参阅 containerd 的安装文档;有关具体的前置要求,请遵循 containerd 指南

清空节点

kubectl drain <node-to-drain> --ignore-daemonsets

<node-to-drain> 替换为您要驱逐的节点的名称。

停止 Docker 守护进程

systemctl stop kubelet
systemctl disable docker.service --now

安装 Containerd

遵循指南以获取安装 containerd 的详细步骤。

  1. 从官方 Docker 仓库安装 containerd.io 包。有关为您各自的 Linux 发行版设置 Docker 仓库并安装 containerd.io 包的说明,请参阅 containerd 入门

  2. 配置 containerd

    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    
  3. 重启 containerd

    sudo systemctl restart containerd
    

启动 Powershell 会话,将 $Version 设置为所需的版本(例如:$Version="1.4.3"),然后运行以下命令

  1. 下载 containerd

    curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
    tar.exe xvf .\containerd-windows-amd64.tar.gz
    
  2. 解压并配置

    Copy-Item -Path ".\bin\" -Destination "$Env:ProgramFiles\containerd" -Recurse -Force
    cd $Env:ProgramFiles\containerd\
    .\containerd.exe config default | Out-File config.toml -Encoding ascii
    
    # Review the configuration. Depending on setup you may want to adjust:
    # - the sandbox_image (Kubernetes pause image)
    # - cni bin_dir and conf_dir locations
    Get-Content config.toml
    
    # (Optional - but highly recommended) Exclude containerd from Windows Defender Scans
    Add-MpPreference -ExclusionProcess "$Env:ProgramFiles\containerd\containerd.exe"
    
  3. 启动 containerd

    .\containerd.exe --register-service
    Start-Service containerd
    

配置 kubelet 以使用 containerd 作为其容器运行时

编辑文件 /var/lib/kubelet/kubeadm-flags.env 并将 containerd 运行时添加到标志中;--container-runtime-endpoint=unix:///run/containerd/containerd.sock

使用 kubeadm 的用户应注意,kubeadm 工具将主机的 CRI 套接字存储在

每个节点上的 /var/lib/kubelet/instance-config.yaml 文件中。您可以在节点上创建此 /var/lib/kubelet/instance-config.yaml 文件。

/var/lib/kubelet/instance-config.yaml 文件允许设置 containerRuntimeEndpoint 参数。

您可以将此参数的值设置为所选 CRI 套接字的路径(例如 unix:///run/containerd/containerd.sock)。

重新启动 kubelet

systemctl start kubelet

验证节点是否健康

运行 kubectl get nodes -o wide,containerd 将显示为我们刚更改的节点的运行时。

移除 Docker Engine

注意: 本节链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不对这些项目负责,项目按字母顺序排列。要将项目添加到此列表,请在提交更改之前阅读 内容指南更多信息。

如果节点显示健康,请移除 Docker。

sudo yum remove docker-ce docker-ce-cli

sudo apt-get purge docker-ce docker-ce-cli

sudo dnf remove docker-ce docker-ce-cli

sudo apt-get purge docker-ce docker-ce-cli

上述命令不会移除您主机上的镜像、容器、卷或自定义配置文件。要删除它们,请遵循 Docker 的 卸载 Docker Engine 说明。

注意

Docker 卸载 Docker Engine 的说明可能会造成删除 containerd 的风险。执行命令时请务必小心。

取消清空节点

kubectl uncordon <node-to-uncordon>

<node-to-uncordon> 替换为您之前驱逐的节点的名称。


最后修改时间:2025 年 7 月 4 日 晚上 11:28 PST:将 NodeLocalCRISocket 升级到 Beta 版本 (0135b1b08b) 的文档添加

此页面上的项目涉及提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关详细信息,请参阅 CNCF 网站指南

在提出添加额外的第三方链接的更改之前,您应该阅读 内容指南