一、containerd简介
早期Containerd是在Docker Engine中,目前将containerd从Docker中拆分出来,作为一个独立的开源项目,目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的containerd将具有更多的功能,覆盖整个容器运行时的所有需求,提供更强大的支持。
Containerd是一个工业级标准的容器运行时,它强调简单性、可移植性``
管理容器的生命周期 (从create到delete)``
拉取/推送镜像容器``
存储管理``
调用runc运行容器``
管理容器网络接口
在企业级生产环境中,Containerd 通常不会作为独立的容器运行时单独使用,而是作为 Kubernetes 等容器编排平台的底层运行时,通过 CRI(Container Runtime Interface)接口与其集成。
若需在单机环境运行容器(如开发、测试或小型生产场景),Docker 仍是更推荐的选择,原因包括:
长期生产环境验证:经过多年大规模生产环境的打磨,稳定性有保障。
完善的工具链生态:CLI、日志、存储、网络等周边工具成熟。
更友好的开发者体验:Docker Compose、BuildKit 等工具链完整。
更低的运维成本:调试、监控、排错等运维体系成熟。
二、containerd部署
containerd 是一个高度模块化的容器运行时,专为性能和简洁性而设计。安装 containerd 需要手动下载和安装多个组件,包括 containerd 本身、Runc 和 CNI 插件。
Github上提供containerd两种安装包,分别是containerd与cni-containerd的安装包。其中,cni-containerd是包含contianerd本身还提供了Runc和CNI插件属于全量包
1.环境准备
1.1 本次环境
bash
[root@node-3 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@node-3 ~]# uname -r
3.10.0-862.el7.x86_64
[root@node-3 ~]# rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.x86_64
1.2 解决containerd不兼容问题
containerd需要libseccomp的特定版本以确保兼容性和功能完整性。例如,在 CentOS 7 上,默认的libseccomp版本是2.3,这可能不满足最新版containerd的需求。因此,需要升级到2.4或更高版本的libseccomp,例如2.5.1版本。
解决方案:
需要安装依赖(CentOS 安装 libseccomp-devel;Ubuntu 安装 libseccomp-dev)。
下载包含 libseccomp 依赖的 runc 二进制文件。
方案实施:以下两种当时任选其一即可
bash
#方式一 1.主机安装依赖libseccomp
#卸载旧libseccomp
rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps
#下载新版本wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
#安装
rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm
#检查版本
rpm -qa | grep libseccomp
#方式二 2. 下载包含 libseccomp 依赖的 runc 二进制文件
wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64
#安装
cp runc.amd64 /usr/bin/runc
chmod +x /usr/bin/runc
1.3 加载内核模块
bash
[root@node-3 ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
#手工加载,临时生效
[root@node-3 ~]# modprobe overlay
[root@node-3 ~]# modprobe br_netfilter
1.4 添加sysctl 系统内核参数
bash
[root@node-3 ~]# cat <<EOF | sudo tee /etc/sysctl.d/containerd.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
#应用生效
[root@node-3 ~]# sysctl -p /etc/sysctl.d/containerd.conf
2.安装部署
bash
#下载安装包
wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz
wget https://d.frps.cn/file/kubernetes/containerd/cri-containerd-cni-1.6.4-linux-amd64.tar.gz
#解压安装包 直接给对应目录替换调
[root@node-3 ~]# tar zxvf cri-containerd-cni-1.6.4-linux-amd64.tar.gz -C /
3.修改containerd配置文件
bash
# 生成默认配置文件
[root@demo ~]# mkdir -p /etc/containerd
[root@demo ~]# containerd config default | sudo tee /etc/containerd/config.toml
#修改配置文件
#修改数据存储目录
[root@node-3 etc]# sed -ri 's@^(root).*@\1 = "/data/containerd"@g' /etc/containerd/config.toml
[root@node-3 etc]# grep '/data/containerd' /etc/containerd/config.toml
root = "/data/containerd"
#修改containerd沙盒镜像
[root@node-3 etc]# grep sandbox_image /etc/containerd/config.toml
sandbox_image = "registry.k8s.io/pause:3.6"
[root@node-3 etc]# sudo sed -ri 's@(sandbox_image).*@\1 = "registry.aliyuncs.com/google_containers/pause:3.9"@g' /etc/containerd/config.toml
[root@node-3 etc]# grep sandbox_image /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
#containerd开启cgroup功能
#当主机使用 systemd 作为 init 系统时,启用这个选项可以使容器资源管理(CPU/内存等)与 systemd 更好地集成
[root@node-3 etc]# sed -ri 's@(SystemdCgroup).*@\1 = true@g' /etc/containerd/config.toml
[root@node-3 etc]# grep SystemdCgroup /etc/containerd/config.toml
SystemdCgroup = true
#containerd设置registry配置目录
#指定 containerd 查找容器镜像仓库证书(TLS 配置)的目录,如配置私有镜像仓库(如 Harbor、Nexus)的 TLS 证书时
[root@node-3 opt]# sed -ri 's@(config_path).*@\1 = "/etc/containerd/certs.d"@g' /etc/containerd/config.toml
[root@node-3 opt]# grep config_path /etc/containerd/config.toml
config_path = "/etc/containerd/certs.d"
#
4.配置systemd服务
默认cri-containerd-cni
包中会有containerd启动脚本,我们已经解压到对应的目录,可以直接调用启动
bash
[root@web01 ~]# systemctl enable containerd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /etc/systemd/system/containerd.service.
#查看containerd启动状态
[root@web01 ~]# systemctl status containerd
5.配置镜像加速器
从 containerd 1.5+ 版本开始,官方推荐使用 certs.d 目录结构来管理镜像加速器(替代传统的 config.toml 配置)。
每个镜像仓库(如 docker.io)的配置位于独立文件 /etc/containerd/certs.d/<仓库域名>/hosts.toml。
server:指定默认的 Docker Hub 官方地址 (docker.io)。
[host."..."]:每个镜像加速器的地址。
capabilities:允许 pull(拉取)和 resolve(解析)。
containerd 会按顺序尝试这些镜像源,直到成功拉取。
bash
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"
[host."https://k0jntw7k.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://dockerpull.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.registry.cyou"]
capabilities = ["pull", "resolve"]
[host."https://atomhub.openatom.cn"]
capabilities = ["pull", "resolve"]
[host."https://docker.1panel.live"]
capabilities = ["pull", "resolve"]
[host."https://hub.rat.dev"]
capabilities = ["pull", "resolve"]
[host."https://docker.awsl9527.cn"]
capabilities = ["pull", "resolve"]
[host."https://do.nark.eu.org"]
capabilities = ["pull", "resolve"]
[host."https://docker.ckyl.me"]
capabilities = ["pull", "resolve"]
[host."https://hub.uuuadc.top"]
capabilities = ["pull", "resolve"]
[host."https://docker.chenby.cn"]
capabilities = ["pull", "resolve"]
EOF
#重启containerd生效
systemctl restart containerd
#测试
crictl pull nginx
nerdctl --insecure-registry pull nginx
三、containerd工具使用
1.ctr工具使用
ctr是containerd自带的客户端工具,在containerd中拉取docker的相关镜像需要补全。ctr 默认操作的是 default 命名空间
bash
#查看版本
[root@node-3 docker.io]# ctr version
Client:
Version: v1.6.4
Revision: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
Go version: go1.17.9
Server:
Version: v1.6.4
Revision: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
UUID: 6af5e48b-d215-47c4-bb53-00f8144aa82b
#拉取镜像
[root@node-3 docker.io]# ctr -n k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/pause:3.9: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097: exists |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:8d4106c88ec0bd28001e34c975d65175d994072d65341f62a8ab0754b0fafe10: exists |++++++++++++++++++++++++++++++++++++++|
layer-sha256:61fec91190a0bab34406027bbec43d562218df6e80d22d4735029756f23c7007: exists |++++++++++++++++++++++++++++++++++++++|
config-sha256:e6f1816883972d4be47bd48879a08919b96afcd344132622e4d444987919323c: exists |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.7 s total: 0.0 B (0.0 B/s)
unpacking linux/amd64 sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097...
done: 11.142817ms
#查看镜像
[root@node-3 docker.io]# ctr -n k8s.io image ls
#其他操作命令请查看帮助信息
[root@node-3 docker.io]# ctr -h
2.crictl工具使用
由于ctr 命令设计的 [registry/]repository:tag 格式确实不够直观,尤其是默认镜像(如 nginx)需要完整路径 docker.io/library/nginx,使用起来比较繁琐,个人觉得可以使用crictl替代。
crictl是kubernetes cri-tools的一部分,是专门为kubernetes使用containerd而专门制作的,提供了Pod、容器和镜像等资源的管理命令。
crictl主要用于Kubernetes环境中,适用于集群管理,特别是在Kubernetes中进行容器管理时更加高效。
crictl 是 Kubernetes 社区维护的 CLI,默认兼容 Docker 镜像格式,自动补全 docker.io/library/。
crictl 是 Kubernetes 中用于与容器运行时接口(CRI)交互的命令行工具,支持 containerd、CRI-O 等 CRI 兼容的运行时。它主要用于节点级容器和 Pod 的调试、状态查看及资源管理,提供比 kubectl 更底层的操作能力。
2.1 安装
bash
#下载
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.21.0/crictl-v1.21.0-linux-amd64.tar.gz
#安装
tar zxvf crictl-v1.21.0-linux-amd64.tar.gz -C /usr/local/bin
#查看版本
[root@node-3 ~]# crictl --version
crictl version 1.20.0-24-g53ad8bb7
2.2 配置/etc/crictl.yaml
bash
[root@node-3 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
2.3 常用命令解读
bash
#查看运行中的容器(-a 包含已停止的)
crictl ps
#查看容器详细信息
crictl inspect <container-id>
#查看容器日志
crictl logs <container-id>
#在容器内执行命令
crictl exec -it <container-id> <command>
#停止容器
crictl stop <container-id>
#删除容器
crictl rm <container-id>
#更多其他命令查看帮助
crictl --help
3.nerdctl工具使用
nerdctl 是专为 containerd 设计的命令行工具,提供与 Docker 相似的体验,同时支持 containerd 的高级特性(如命名空间管理、OCI 镜像转换、Compose 等)。适用于 Kubernetes 环境或直接管理 containerd 容器。
nerdctl 作为 containerd 的友好 CLI 工具,完美适配 Kubernetes 环境,同时保留了 Docker 的使用习惯。
核心优势:
-
兼容 Docker 命令:如 run、build、compose。
-
支持 Kubernetes 命名空间:直接管理 k8s.io 命名空间下的容器。
-
集成 BuildKit:支持高效镜像构建和懒加载(lazy-pulling)。
3.1 安装部署
bash
[root@node-3 ~]# wget https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-1.2.1-linux-amd64.tar.gz
[root@node-3 ~]# tar xvf nerdctl-1.2.1-linux-amd64.tar.gz -C /usr/local/bin
3.2 基础命令使用
bash
#1. 容器管理
#启动临时容器
nerdctl run -it --rm alpine
#查看所有容器
nerdctl ps -a
#查看容器日志
nerdctl logs <容器ID>
#进入容器 Shell
nerdctl exec -it <容器ID> sh
#停止/删除容器
nerdctl stop/rm <容器ID>
#2. 镜像管理
#拉取镜像
nerdctl pull nginx:latest
#查看本地镜像
nerdctl images
#删除镜像
nerdctl rmi <镜像ID>
#推送镜像到仓库
nerdctl push myimage:latest
#3. 管理 Kubernetes 命名空间
# 拉取镜像到 k8s.io 命名空间(Kubernetes 可见)
nerdctl -n k8s.io pull nginx:latest
# 查看命名空间
nerdctl namespace ls
四、安全与优化
生产环境中,确保Containerd的安全性和性能至关重要:``
1.最小权限:运行Containerd服务的账户应具有最小权限。``
2.监控与日志:设置日志记录和实时监控,以便快速响应异常情况。``
3.资源管理:合理分配CPU和内存资源,避免资源竞争导致的性能瓶颈。
以上内容详细介绍了在生产环境中专业部署和配置 Containerd 的方法,下一章节我们将深入探讨 Kubernetes 容器运行时从 Docker 迁移到 Containerd 的完整方案。