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
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
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 |