containerd 是云原生计算基金会(CNCF)毕业的容器运行时项目,负责容器生命周期管理、镜像传输与存储、容器执行、网络与存储挂载等底层能力。它最初由 Docker 公司从 Docker Engine 中拆分并捐赠给 CNCF,如今是 Kubernetes 节点上最主流的容器运行时,也是 Docker Desktop 与大多数云厂商托管 K8s 服务的底层引擎。containerd 以「只做运行时该做的事」为设计原则,不包含镜像构建、编排调度等上层能力,因此比 Docker Engine 更轻量,与 kubelet 通过 CRI(Container Runtime Interface,Kubernetes 与容器运行时之间的标准接口)直连,省去了一层守护进程转发。本文从安装配置、核心能力、生产部署到选型对比逐一展开,包含可直接复制的命令与真实避坑经验,帮助你在 Kubernetes 或边缘环境中快速落地 containerd。
containerd 是 Kubernetes 默认运行时生态的事实标准,掌握它是平台工程师、SRE 与云原生后端工程师的必备技能,也是通往 CKA/CKAD 认证与大规模容器集群运维的基础。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 containerd:从 Docker 到轻量级 CRI 运行时
在 Kubernetes 早期,节点上的容器管理链路很长:kubelet → dockerd → containerd → runc。dockerd 在其中只充当「转发层」,真正的容器创建和镜像解包工作已经由 containerd 完成,多一层守护进程意味着更多内存开销、更多故障点和更长的调用路径。2022 年 Kubernetes 1.24 正式移除 dockershim,kubelet 不再内置对 Docker 的适配,containerd 凭借 CRI 原生支持成为官方推荐的主流运行时。
containerd 解决的核心问题是「把容器运行这件事做纯粹且可插拔」:它对外提供稳定的 gRPC API 和 CRI 插件,对内通过 containerd-shim 管理每个容器的生命周期,使容器进程与守护进程解耦——即使 containerd 重启,容器也不会随之退出。同时它的快照器(Snapshotter)抽象让镜像层管理具备可扩展性,可以对接 overlayfs、stargz 加速镜像、Nydus 等不同存储方案。
与 CRI-O 相比,containerd 的优势在于生态更通用:它脱离 Kubernetes 也能以裸运行时方式使用(ctr/nerdctl),社区贡献者更多、更新节奏更活跃。与 Docker Engine 相比,它少了构建和 Compose 等上层能力,换来的是更小的二进制体积、更少的系统占用和更稳定的 CRI 兼容性——这也正是它在生产 K8s 集群中胜出的原因。
安装与环境配置:3 步就绪
安装 containerd 有 apt/yum 系统源和 GitHub Releases 二进制包两种主流方式。生产环境建议直接使用发行版官方源安装,便于通过系统包管理器做安全更新;需要尝鲜新特性时再选择二进制 tarball。
步骤一:安装
步骤二:生成并调整配置
步骤三:启动并验证
验证时注意 ctr plugins ls 应能看到 io.containerd.grpc.v1.cri 和 io.containerd.snapshotter.v1.overlayfs 处于 ok 状态。若 CRI 插件未加载,后续 Kubernetes 节点将无法注册,需检查 /etc/containerd/config.toml 中 disabled_plugins 是否误注释了 CRI 插件。
# Ubuntu/Debian 使用系统源安装sudo apt-get updatesudo apt-get install -y containerd # 或下载官方二进制 tarball(以 v2.0.x 为例)wget https://github.com/containerd/containerd/releases/download/v2.0.0/containerd-2.0.0-linux-amd64.tar.gzsudo tar Cxzvf /usr/local containerd-2.0.0-linux-amd64.tar.gz
# 生成默认配置sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml # 将 SystemdCgroup 设为 true(Kubernetes 推荐,保持与 kubelet 一致)sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 若需使用私有镜像仓库,在 config.toml 的 [plugins.'io.containerd.grpc.v1.cri'.registry] 段# 配置 config_path = "/etc/containerd/certs.d"
sudo systemctl enable --now containerdsudo systemctl status containerd --no-pagersudo ctr version # 输出 Client/Server 版本即成功sudo ctr plugins ls # 查看 snapshotter 与 CRI 插件加载情况
快速上手:10 分钟跑通第一个容器
containerd 自带 ctr 调试工具,适合快速验证安装是否正常。ctr 的用法与 docker 相似但不完全兼容:它操作的是 containerd API 而不是 Docker API,且默认工作在 default 命名空间。若节点已被 Kubernetes 占用,容器对象位于 k8s.io 命名空间,ctr 默认看不到,排查时务必加 -n 参数。
跑通后你会注意到 ctr 不支持 -p 端口映射、-v 数据卷这类「便利功能」——这正是它的定位:面向运行时调试而不是终端用户。日常在开发机上模拟 Docker 体验,建议安装 nerdctl,它能以兼容 docker run/build/compose 的方式操作同一个 containerd 实例,直接在宿主机验证生产环境同款镜像。
# 拉取 Redis 镜像(显式指定 docker.io 前缀)sudo ctr image pull docker.io/library/redis:7 # 查看本地镜像sudo ctr images ls # 运行一个临时容器:--rm 表示退出即删除sudo ctr run --rm docker.io/library/redis:7 redis-test redis-server --port 6380 # 另开终端进入同一容器内的交互 shellsudo ctr tasks exec --exec-id shell redis-test /bin/sh # 查看 Kubernetes 使用的镜像(k8s.io 命名空间)sudo ctr -n k8s.io images ls
核心能力详解:4 大支柱
支柱一:OCI 合规与镜像分发。 containerd 严格遵循 OCI(Open Container Initiative,开放容器倡议组织制定的容器镜像与运行时规范)标准,能拉取 Docker Hub、Harbor、GHCR 等任意符合 OCI 规范的镜像仓库。它实现了内容寻址存储(Content-Addressable Storage,镜像内容按哈希值存储与寻址),支持并发层下载、层去重与垃圾回收。配置 registry.mirrors 可将默认仓库指向内网加速器或私有仓库,certs.d 目录支持按域名配置 TLS 证书与认证信息,这是生产环境访问私有仓库的标准方式。
支柱二:快照器(Snapshotter)存储抽象。 快照器是 containerd 的存储引擎插件,负责管理镜像层与容器可写层的挂载关系。默认使用 overlayfs 实现层叠文件系统,同一宿主机上多个容器共享只读镜像层,显著节省磁盘空间。社区已出现 stargz、Nydus、EStargz 等加速型快照器,支持按需拉取(按需加载镜像数据块),适合大规模集群分发冷门镜像的场景。更换快照器只需修改 config.toml 的 snapshotter 字段并重启守护进程,业务层无感知。
支柱三:CRI 插件与 Kubernetes 集成。 CRI 是 kubelet 与容器运行时之间的标准接口。containerd 内置 io.containerd.grpc.v1.cri 插件,将 kubelet 的 PodSandbox(Pod 沙箱,K8s 为每个 Pod 创建的隔离环境)、容器创建、镜像拉取等请求翻译为内部 API 调用。通过 crictl 工具可以以 CRI 视角查看节点上的 Pod 与容器状态,定位 kubelet 与运行时之间的通信问题。CRI 插件还负责配置 Pod 级网络命名空间和挂载卷,并与 pause 镜像配合维持 Pod 生命周期。
支柱四:Namespace 多租户与可插拔 Runtime。 containerd 的 namespace 是控制面逻辑隔离域,不同 namespace 下的镜像、容器互不可见,一套 containerd 可同时服务 Kubernetes(k8s.io)、本地调试(default)和 CI 任务等不同租户。此外 containerd 支持通过 Runtime 插件接入 gVisor、Kata Containers 等安全沙箱运行时,在 config.toml 中注册后即可按 Pod 指定 runtimeClassName 运行,实现同一集群内普通容器与安全容器混合调度。
生产部署与监控:从上线到运维
部署方式一:Kubernetes 节点集成。 生产环境最常见的方式是让 kubelet 通过 CRI 直连 containerd。安装完成后确认 /etc/containerd/config.toml 中 CRI 插件未被禁用,sandbox_image 指向的 pause 镜像在集群网络内可拉取。使用 kubeadm 初始化时无需额外配置,kubelet 默认从 /var/run/containerd/containerd.sock 接入 containerd;自定义安装时需在 kubelet 启动参数中指定 --container-runtime-endpoint=unix:///run/containerd/containerd.sock。上线前建议在测试环境验证 crictl ps、crictl images 输出正常,并确认 kubelet 与 containerd 的 cgroup 驱动一致。
部署方式二:Rootless 与边缘场景。 containerd 支持 rootless 模式(无 root 权限运行),通过 containerd-rootless-setuptool.sh 脚本完成安装,适合开发容器与多租户隔离场景。在边缘计算场景,K3s 等轻量 K8s 发行版默认内置 containerd,借助其低内存占用与无守护进程链路的优势,可在树莓派、ARM 网关等受限设备上运行。注意 rootless 模式默认使用 fuse-overlayfs 或 native 快照器,镜像读写性能低于 root 模式,CPU 密集型任务需实测评估。
可观测性。 containerd 暴露 Prometheus 指标端点,需在 config.toml 的 metrics 段设置 address = "127.0.0.1:1338",然后通过 node-exporter 或直接抓取 http://127.0.0.1:1338/v1/metrics 获取运行中的容器数、镜像拉取耗时、快照操作等指标。日志方面,containerd 默认将容器标准输出交给 kubelet 的日志轮转机制,守护进程自身日志写入 journald,用 journalctl -u containerd -f 跟踪。磁盘监控重点关注 /var/lib/containerd 的镜像层占用,配置 gc 策略定期回收悬空镜像与层数据。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>kubeadm 初始化卡在 ContainerCreating:大部分原因是 sandbox_image 指向的 pause 镜像拉不下来,先把 config.toml 中的 sandbox_image 换成内网可达的 registry.k8s.io 镜像源,再重启 containerd。</li><li>ctr 看不到任何 Pod:ctr 默认操作 default 命名空间,Kubernetes 的镜像与容器在 k8s.io 命名空间,排查时必须加 -n k8s.io,否则误判 containerd 异常。</li><li>kubelet 报 cgroup 驱动不一致:SystemdCgroup 必须与 kubelet 的 --cgroup-driver 一致,K8s 官方推荐 systemd,配置后重启 containerd 和 kubelet。</li><li>1.x 升 2.0 后无法启动:2.0 移除了部分废弃插件与配置字段(如旧版 cri 配置路径),升级前备份 config.toml 并在测试机验证,不要直接覆盖生产配置。</li><li>磁盘被历史镜像占满:生产环境务必配置镜像 GC 策略并接入监控,否则每次发版残留的旧镜像层会持续占用 /var/lib/containerd 空间。</li></ul>
| 维度 | containerd | Docker Engine | CRI-O | runc |
|---|---|---|---|---|
| 定位 | 通用容器运行时,K8s 默认选择之一 | 完整容器开发与运行平台 | Kubernetes 专用轻量 CRI 运行时 | OCI 底层容器执行器 |
| 编排范式 | CRI 插件对接 K8s;ctr/nerdctl 直连 | dockerd 守护进程 + docker CLI/API | 原生 CRI 接口,无终端用户侧 CLI | `runc run` 直接创建容器进程 |
| 类型约束 | OCI 规范 + containerd API/CRI | Docker API + Compose 编排模型 | 严格 CRI 标准,面向 kubelet | OCI Runtime Spec |
| 学习曲线 | 中等(ctr 较底层,nerdctl 平缓) | 低(docker 命令生态成熟) | 中高(主要面向 K8s 运维) | 高(面向平台与内核研发) |
| 生态集成 | K8s、gVisor、Kata、NVIDIA、Harbor | Docker Hub、Compose、Swarm、CI/CD 全生态 | OpenShift、Fedora CoreOS、RHEL | 作为 containerd/CRI-O 的底层组件 |
| 生产部署 | 裸机、K8s 节点、边缘 K3s、云厂商托管 | 单机 Docker、Docker Swarm、开发环境 | 以 Red Hat/OpenShift 为主的生产集群 | 一般不单独部署,经上层运行时调用 |
| License | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
| 适合谁 | K8s 平台工程师、SRE、边缘计算团队 | 开发者、CI/CD 流水线、中小团队 | OpenShift 运维、RHEL 系集群用户 | 运行时安全研究、底层内核工程师 |
选型建议:面向 Kubernetes 生产环境,containerd 是最通用且生态最广的选择,既能满足标准集群也能跑安全沙箱;深度绑定 Red Hat/OpenShift 体系时优先 CRI-O;开发与 CI/CD 场景保留 Docker Engine 更顺手;runc 无需单独选型,它作为底层引擎被前两者自动调用。混合团队可让 Docker 与 containerd 共存于同一节点(不同 namespace),兼顾开发体验与生产一致性。
版本迭代
containerd 的演进主线是「从 Docker 内部分离 → CRI 稳定 → 插件化重构」。1.5 补齐生产级 CRI 能力,1.6 成为首个被广泛采用的长期支持版,1.7 是承载 K8s 1.24+ 大规模迁移的 LTS 版本,2.0 于 2025 年 1 月发布,聚焦 v2 API 与插件体系重构(截至训练数据,可能已有更新补丁版本)。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 1.5 | 2021-05 | CRI 服务稳定性、镜像拉取并行化 | 支持并发层下载,CRI 配置收敛到 config.toml |
| 1.6 | 2022-02 | 首个广泛采用的 LTS、Windows 容器增强 | 支持 Windows 主机进程隔离,K8s 1.24+ 事实标准 |
| 1.7 | 2023-08 | 长期支持版、平台级能力增强 | 支持 non-image 容器、SELinux 标签、增强事件 API |
| 2.0 | 2025-01 | v2 API 落地、插件体系重构 | 移除 1.x 废弃接口,默认启用新插件化架构 |
版本主线是「运行时内核做减法、扩展能力做加法」。生产环境若在 1.7 LTS 上,可规划平滑升级至 2.0,但需先验证老配置字段兼容性;新集群直接采用 2.0 即可。评测数据方面,containerd 1.7 与 2.0 均通过 Kubernetes Node Conformance 测试(K8s 官方在运行时的兼容性验证体系),1.24 移除 dockershim 后所有云厂商托管 K8s 均以 containerd 作为默认运行时,其生产稳定性等价于「K8s 默认出厂配置」。两版主要实测差异在 API 兼容性与插件加载方式,容器运行性能本身无明显分化。
AI 应用场景
场景一:Kubernetes 集群节点运行时
阶段:基础设施支撑(AI 推理服务的容器化部署底座)
解决的问题:kubelet 直接通过 CRI 调用 containerd,省去 dockershim 或 dockerd 的中间转发,缩短 Pod 从请求到启动的调用链,同时降低节点常驻内存。相比 Docker 时代的四层链路,containerd 场景下节点只需运行一个守护进程。
具体案例:某在线推理平台将 500 节点 GPU 集群从 dockershim 迁移至 containerd 后,Pod 冷启动耗时缩短约 15%,单节点容器管理内存占用下降数百 MB;GPU 驱动与 nvidia-container-toolkit 通过 containerd 的 Runtime 插件注入,无需改动业务镜像即可让模型服务感知 GPU 设备。
场景二:边缘计算与受限设备部署
阶段:轻量化运行时(边缘 AI 推理节点)
解决的问题:边缘网关、ARM 设备资源紧张,无法承受 Docker 守护进程的内存开销。K3s 等边缘 K8s 发行版内置 containerd,以单二进制方式运行,镜像层共享机制减少 SD 卡存储占用,节点离线时容器保持运行不受影响。
具体案例:某工业视觉质检项目在 50 台 ARM 边缘网关部署 K3s + containerd,每个网关承载 3-5 个推理容器,常驻内存控制在 1GB 以内;model 镜像通过私有仓库按层增量同步,弱网环境下版本更新仍可断点续传。
场景三:CI/CD 镜像构建与分发流水线
阶段:镜像产物管理与加速分发
解决的问题:在 CI Runner 上以 rootless containerd 替代 Docker 构建环境,配合 BuildKit 完成镜像构建,构建产物直接在节点本地写入 containerd 快照层。后续 K8s 节点拉取同一镜像时,registry 与 CI 节点之间的层复用和并发拉取显著缩短分发时间。
具体案例:某 SaaS 团队将 Jenkins 构建环境切换为 containerd + BuildKit 后,镜像构建产物直接落盘到 containerd 的本地缓存,同仓库后续 10 个构建任务镜像层复用率达 60% 以上;配合 Harbor 的代理缓存,跨区域集群镜像拉取时间平均下降 40%。
常见误区
误区既然 Docker 底层就是 containerd,那我装了 containerd 之后应该还能接着用 docker build、docker compose 吧?感觉它就是一个更轻的 Docker。
正解containerd 只覆盖容器生命周期、镜像拉取与解包、存储快照和底层的 runc 调用,不包含镜像构建(Dockerfile 解析、BuildKit)与多容器编排(Compose)。在 containerd 环境构建镜像需使用 buildctl/nerdctl build(底层是 BuildKit),编排多容器应用可用 nerdctl compose,或在 K8s 中用 Deployment/StatefulSet 描述。
为何常见:Docker Desktop 和 Docker Engine 的进程列表里能看到 containerd,容易让人认为「Docker 有的能力 containerd 都有」,忽略了 Docker CLI、BuildKit 和 Compose 都是独立组件,只是恰好跑在 containerd 之上。
误区调试 containerd 用哪个命令都行吧,反正都是连同一个 daemon,看到信息一致就行。
正解三个工具视角不同:ctr 是 containerd 自带的调试客户端,不保证跨版本接口兼容,且默认面向 default 命名空间;crictl 走 CRI 标准接口,能看到 Pod 沙箱、Pod 级容器,是排查 kubelet 问题的第一工具;nerdctl 提供 Docker 兼容语法,适合日常操作和脚本化。生产 K8s 节点上优先用 crictl 定位,本地调试用 nerdctl,ctr 仅作应急验证。
为何常见:containerd 官方文档同时维护三条命令行入口,名称相似且都在 PATH 中,没有长时间实践的人很难从命令名判断它们各自的服务对象,误以为只是新旧版本的差异。
误区节点上明明有很多容器在跑,为什么 ctr 显示的镜像是空的?是不是 containerd 数据丢了或者服务异常?
正解不是异常,是命名空间隔离。Kubernetes 创建的容器和镜像位于 k8s.io 命名空间,而 ctr 默认只显示 default 命名空间。加 -n k8s.io 就能看到 Pod 使用的镜像与容器,两条命令的信息量完全不同。删除或修改对象前同样确认命名空间,避免误删或改错对象。
为何常见:containerd 的 namespace 是控制面逻辑隔离概念,不像 Linux namespace 那样对每个容器进程可见,文档中也没有在命令输出里提示当前默认空间,初次使用极易被空列表误导。
误区本地手动用 ctr 跑容器不设置 SystemdCgroup 也没问题,K8s 里应该也同理吧,这个配置可能只是优化项。
正解容器是否能启动取决于单机环境,cgroupfs 驱动在无 systemd 环境下确实可用;但 kubelet、containerd、节点上的容器运行时必须使用一致的 cgroup 驱动。K8s 官方推荐 systemd 驱动,若 kubelet 用 systemd 而 containerd 保持默认的 cgroupfs,节点会报告 kubelet 无法获取容器 cgroup 统计信息,甚至出现 Pod 调度失败或节点 NotReady。
为何常见:本地单容器场景两种 cgroup 驱动都能跑通,问题只在 kubelet + containerd + 节点多组件协作时才暴露,这种「单机正常、集群异常」的差异让人误判配置无关紧要。
面试题
Q1. containerd 在容器技术栈中处于哪一层?
- A.容器编排平台(如 Kubernetes 调度器)
- B.管理容器生命周期与镜像的高层运行时← 正确答案
- C.仅负责创建进程的底层运行时
- D.独立于 OCI 的镜像构建工具
答案:B。containerd 是高层运行时,负责容器生命周期管理、镜像拉取与解包、快照存储,并调用 runc 等底层运行时执行进程。它不像 Kubernetes 那样做调度,也不像 runc 那样只管单进程创建,更不负责镜像构建。选项 A 混淆了运行时与编排平台,C 是 runc 的定位,D 是 BuildKit 的职责。
Q2. Docker Engine 与 containerd 的正确关系是?
- A.dockerd 完全替代 containerd,二者互不关联
- B.Docker Engine 依赖 containerd 管理容器与镜像← 正确答案
- C.containerd 是 Docker 的镜像构建模块
- D.两者都直接通过 runc 独立创建每个容器
答案:B。现代 Docker Engine 的调用链是 dockerd → containerd → runc,containerd 负责镜像和容器管理,runc 负责创建进程。A 错误,containerd 依然在 dockerd 之下;C 错误,构建由 BuildKit 实现;D 错误,runc 通常不直接被 dockerd 调用,而是经 containerd 的 shim 间接工作。
Q3. 关于 ctr 命令的定位,正确的是?
- A.面向 Kubernetes 的官方调试工具
- B.containerd 自带的调试客户端,接口不保证稳定← 正确答案
- C.与 docker 命令功能一致的 CLI 工具
- D.仅用于镜像构建的命令行工具
答案:B。ctr 是 containerd 附带的调试客户端,直接操作 containerd API,官方明确不承诺它的跨版本兼容性,也不建议在脚本中依赖。K8s 侧应使用 crictl,Docker 兼容体验应使用 nerdctl,构建应使用 buildctl/nerdctl build。
Q4. containerd 如何管理 Kubernetes 的 Pod?
- A.通过 CRI 插件接收 kubelet 请求并转换为内部任务← 正确答案
- B.每个 Pod 额外启动一个 containerd 守护进程
- C.直接调用 Kubernetes API 完成容器调度
- D.依赖 Docker Swarm 来保持 Pod 容器运行
答案:A。kubelet 通过 CRI 接口把 PodSandbox、容器创建等请求发给 containerd 的 CRI 插件,插件将其翻译为 containerd 的命名空间对象与任务。B 错误,containerd 是单守护进程;C 错误,调度是 kube-scheduler 的职责;D 错误,containerd 不依赖 Swarm。
Q5. 关于 containerd 2.0 的正确描述是?
- A.默认启用 v2 API 并移除部分 1.x 废弃接口← 正确答案
- B.不再支持 Kubernetes CRI 协议
- C.支持插件化快照器与可扩展平台能力← 正确答案
- D.强制要求使用 Podman 作为客户端工具
答案:AC。containerd 2.0 的核心变化是 v2 API 成为默认并清理 1.x 废弃接口,同时将快照器、运行时等进一步插件化。CRI 依然是默认启用的核心插件(B 错误),客户端仍为 ctr/nerdctl/crictl(D 与 Podman 无关)。
Q6. 验证 containerd 是否安装成功,最直接的方式是?
- A.运行 containerd --version 查看版本← 正确答案
- B.执行 docker version 查看守护进程
- C.执行 kubectl version 查看集群状态
- D.运行 runc --help 查看帮助
答案:A。containerd --version 输出 Client 与 Server 版本号即确认二进制与守护进程可用。docker version 只验证 Docker(可能与 containerd 并存但无直接关系),kubectl 验证的是集群 API,runc 是底层运行时,都不作为 containerd 安装成功的依据。
Q7. 关于 containerd 的 namespace,说法正确的是?
- A.隔离不同租户的镜像与容器配置对象← 正确答案
- B.等同 Linux 内核命名空间的进程资源隔离
- C.区分 Kubernetes 使用与本地调试的操作域← 正确答案
- D.提升容器网络的吞吐带宽
答案:AC。containerd 的 namespace 是控制面逻辑隔离,把 k8s.io 与 default 等对象空间分开,便于一台机器同时服务多个使用方。B 是 Linux 内核 namespace(PID/Mount/Net 等),与 containerd 的 namespace 是两回事;D 与网络性能无关。
Q8. kubelet 与 containerd 的 cgroup 驱动不一致会导致?
- A.镜像在拉取时出现签名验证失败
- B.kubelet 无法获取容器 cgroup 统计导致节点异常← 正确答案
- C.CNI 插件加载不成功且网络不可用
- D.容器存储层大小超出预分配配额
答案:B。kubelet 与运行时之间必须保持 cgroup 驱动一致(推荐 systemd)。若 containerd 保持 cgroupfs 而 kubelet 使用 systemd,节点会出现无法获取容器 cgroup 数据、Pod 调度异常或 NotReady。A 是镜像签名问题,C 与 CNI/nri 相关,D 与快照存储配额相关,均与 cgroup 无关。
Q9. 想在 containerd 之上获得接近 Docker 的命令行体验,可选?
- A.nerdctl 提供 Docker 兼容命令← 正确答案
- B.crictl 适配 CRI 构建镜像
- C.BuildKit 提供镜像构建能力← 正确答案
- D.kubeadm 管理节点上的容器
答案:AC。nerdctl 专为 containerd 提供 Docker 兼容语法(run/build/compose),BuildKit 提供底层构建引擎,二者配合即可替代 docker 构建与运行体验。crictl 是 CRI 调试而非构建工具(B 错误),kubeadm 是 K8s 集群安装工具,不管理单个容器(D 错误)。
Q10. 将 containerd 配置中的 SystemdCgroup 设为 true 的主要原因是?
- A.让容器使用与 kubelet 一致的 systemd cgroup 驱动← 正确答案
- B.启用 systemd 的持久化日志采集
- C.使守护进程以 systemd 方式开机自启
- D.替代 swap 关闭的另一种实现方式
答案:A。SystemdCgroup=true 让 containerd 通过 systemd 管理 cgroup,与 kubelet 推荐的 systemd cgroup 驱动保持一致,避免节点在资源统计与驱逐机制上出问题。B 是日志配置,C 由 systemd unit 的 enable 实现,D 与 swap 无关。
参考来源
- webpagecontainerd 官网项目介绍、博客与版本发布入口
- webpagecontainerd GitHub 仓库源码、Issue 与 Release 记录
- webpagenerdctl GitHub 仓库Docker 兼容 CLI 的安装与用法