3. containerd 安装与部署:二进制安装、apt/yum 安装、systemd 服务配置、验证安装状态

本章聚焦 containerd 在生产环境中的三种主流部署方式:二进制手动安装、apt/yum 包管理器安装,以及systemd 服务托管配置。每种方式对应不同的运维场景,安装后的状态验证是确保控制面正常启动的关键步骤。

部署策略建议: 生产环境推荐使用二进制安装以获得版本精确控制;快速验证或开发环境可使用包管理器安装;所有场景均需通过 systemd 实现开机自启与故障恢复。

3.1 安装方式对比与选择

安装方式 适用场景 版本控制 依赖管理 推荐度
二进制安装 生产集群、离线环境、定制化部署 精确锁定版本 手动处理 ★★★★★
apt/yum 安装 开发测试、快速搭建、标准环境 跟随仓库版本 自动解决 ★★★★☆
源码编译 二次开发、功能验证 自定义分支 完全手动 ★★☆☆☆

3.2 二进制安装(推荐生产使用)

二进制安装不依赖系统包管理器,适合对 containerd 版本有严格要求的场景。以下步骤以 Linux amd64 架构为例。

3.2.1 下载与解压

# 下载 containerd 二进制包(以 v1.7.20 为例)
wget https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-amd64.tar.gz

# 解压到系统目录
sudo tar Cxzvf /usr/local containerd-1.7.20-linux-amd64.tar.gz

# 验证二进制文件
ls -la /usr/local/bin/ | grep containerd
# 输出应包含:containerd、containerd-shim、containerd-shim-runc-v2、ctr

3.2.2 安装 runc 与 CNI 插件

containerd 依赖 runc 作为默认运行时,同时需要 CNI 插件实现容器网络。

# 安装 runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

# 安装 CNI 插件
wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.4.0.tgz

3.2.3 生成默认配置文件

# 创建配置目录
sudo mkdir -p /etc/containerd

# 生成默认配置
containerd config default | sudo tee /etc/containerd/config.toml

# 关键参数预览(后续章节详解)
grep -E "^(version|root|state|grpc|debug)" /etc/containerd/config.toml
containerd 二进制安装组件关系图 containerd 二进制安装组件关系 containerd 二进制 runc 运行时 CNI 网络插件 config.toml 二进制安装需手动处理所有依赖,但可获得最干净的部署环境 与精确的版本控制能力,适合生产环境基线管理

3.3 apt/yum 包管理器安装

包管理器安装适合快速部署,系统会自动处理依赖关系。注意需要先添加官方仓库。

3.3.1 Ubuntu/Debian(apt)

# 安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥(containerd 仓库同源)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd.io

3.3.2 CentOS/RHEL(yum)

# 安装 yum-utils
sudo yum install -y yum-utils

# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 containerd
sudo yum install -y containerd.io
版本锁定注意事项: 包管理器安装的 containerd 版本可能滞后于官方最新版。如需特定版本,使用 apt-cache madison containerd.io 或 yum --showduplicates list containerd.io 查看可用版本,然后指定版本号安装。

3.4 systemd 服务配置

无论使用哪种安装方式,最终都需要通过 systemd 将 containerd 注册为系统服务,实现开机自启与进程守护。

3.4.1 创建 systemd unit 文件

二进制安装默认不包含 systemd 配置,需手动创建;包管理器安装通常已自动生成。

# 创建 containerd.service 文件
sudo tee /etc/systemd/system/containerd.service <

3.4.2 关键参数说明

参数 值 作用
Type notify containerd 启动完成后通知 systemd,避免服务状态误判
Delegate yes 将 cgroup 管理权委托给 containerd,支持容器资源隔离
KillMode process 只终止 containerd 主进程,不杀死其管理的容器子进程
Restart always 进程异常退出后自动重启,保障运行时高可用
LimitNOFILE infinity 解除文件描述符限制,避免高并发容器场景下资源耗尽

3.4.3 启动与启用服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用开机自启
sudo systemctl enable containerd

# 启动服务
sudo systemctl start containerd

# 查看服务状态
sudo systemctl status containerd
containerd systemd 服务生命周期 containerd systemd 服务生命周期 daemon-reload enable start status systemd 确保 containerd 在系统启动时自动运行,并在崩溃后自动恢复 Delegate=yes 是容器运行时与普通服务的关键区别

3.5 验证安装状态

安装完成后,通过以下分层验证方法确认 containerd 控制面正常工作。

3.5.1 进程与服务状态验证

# 检查进程是否存在
ps aux | grep containerd | grep -v grep

# 检查 systemd 服务状态(推荐)
sudo systemctl is-active containerd
# 输出应为:active

# 检查监听端口(默认 127.0.0.1:9090 用于 metrics,/run/containerd/containerd.sock 用于 gRPC)
sudo ss -tlnp | grep containerd
sudo ls -la /run/containerd/containerd.sock

3.5.2 客户端工具验证

# 使用 ctr 客户端连接 containerd
sudo ctr version
# 输出示例:
# Client:
#   Version:  v1.7.20
#   Revision: 8fc6bcff513189441796b22e1ccca2854e0d0b8b
#
# Server:
#   Version:  v1.7.20
#   Revision: 8fc6bcff513189441796b22e1ccca2854e0d0b8b

# 查看 containerd 命名空间
sudo ctr namespace ls
# 默认应包含:default

# 拉取测试镜像验证运行时
sudo ctr image pull docker.io/library/hello-world:latest
sudo ctr run --rm docker.io/library/hello-world:latest test

3.5.3 健康检查接口

# 通过 gRPC 健康检查(需安装 grpcurl)
grpcurl -plaintext -d '{"service": "containerd.services.containers.v1.Containers"}' \
  unix:///run/containerd/containerd.sock grpc.health.v1.Health/Check

# 检查 containerd 配置是否加载成功
sudo containerd config dump | head -20
验证清单速查:
  • ✅ systemctl is-active containerd → active
  • ✅ /run/containerd/containerd.sock 存在且可读写
  • ✅ ctr version 显示 Client 与 Server 版本一致
  • ✅ ctr run hello-world 正常输出打印
  • ✅ 无核心转储或 OOM 日志(journalctl -u containerd --no-pager | grep -i error)

3.6 常见安装问题与排查

现象 可能原因 解决方案
containerd 启动失败,提示 overlay 未加载 内核模块未启用 modprobe overlay && echo overlay >> /etc/modules
ctr 连接超时 containerd 未启动或 socket 路径错误 检查 systemctl status containerd 与 config.toml 中的 address 字段
版本不匹配警告 二进制与 runc/CNI 版本不兼容 参考 containerd 官方 release note 中的依赖版本矩阵
权限拒绝(Permission denied) socket 文件权限不足 sudo chmod 666 /run/containerd/containerd.sock 或使用 sudo