概述 Kubernetes v1.24 正式移除了 dockershim,这意味着 Docker Engine 不再作为 K8s 的容器运行时。取而代之的是符合 CRI(Container Runtime Interface)规范的运行时,其中 containerd 是事实上的标准选择。
很多运维人员对 containerd 的认知停留在"Docker 的替代品",但实际上 containerd 的架构、镜像管理、命令行工具都与 Docker 有显著差异。本文深入理解 CRI 规范、containerd 架构、日常运维和从 Docker 迁移的实践。
本文基于 containerd v2.0 和 Kubernetes v1.30。参考 containerd 官方文档
CRI 规范 什么是 CRI CRI(Container Runtime Interface)是 K8s 定义的容器运行时接口规范。K8s 不再直接调用容器运行时,而是通过 gRPC 调用符合 CRI 规范的运行时:
kubelet → CRI gRPC → 容器运行时(containerd/CRI-O)→ 容器 CRI 接口定义 CRI 定义了两个核心服务:
服务 功能 关键方法 RuntimeService 容器和 Pod 生命周期 RunPodSandbox, CreateContainer, StartContainer, StopContainer ImageService 镜像管理 ListImages, PullImage, RemoveImage, ImageStatus // CRI 接口简化定义 service RuntimeService { rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse); rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse); rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse); rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse); rpc StartContainer(StartContainerRequest) returns (StartContainerResponse); rpc StopContainer(StopContainerRequest) returns (StopContainerResponse); rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse); rpc ListContainers(ListContainersRequest) returns (ListContainersResponse); rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse); rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse); } service ImageService { rpc ListImages(ListImagesRequest) returns (ListImagesResponse); rpc PullImage(PullImageRequest) returns (PullImageResponse); rpc RemoveImage(RemoveImageRequest) returns (RemoveImageResponse); rpc ImageStatus(ImageStatusRequest) returns (ImageStatusResponse); } 为什么移除 dockershim Docker Engine 不原生支持 CRI,K8s 通过 dockershim 适配层调用 Docker。这带来几个问题:...