目录
一、Containerd 概述
1. 什么是 Containerd
主要特点和功能:
2. Containerd 的起源与背景
二、Containerd 架构
1. 架构概述
2. 核心组件解析
(1)Storage(存储)
(2)Metadata(元数据)
(3)Runtime(运行时)
三、安装配置 Containerd
1. 安装 Containerd
2. 配置 Containerd
(1)生成配置文件
(2)配置镜像加速
(3)启动服务
四、Containerd 基本操作
1. 镜像类操作
(1)拉取镜像
(2)查看镜像
(3)检测本地镜像
(4)重新打标签
(5)删除镜像
(6)镜像挂载到主机目录
(7)镜像从主机目录卸载
(8)镜像导出
(9)镜像导入
2. 容器类操作
(1)创建容器
(2)列出容器
(3)查看容器详细信息
(4)删除容器
3. 任务类操作
(1)启动容器
(2)查看容器
(3)进入容器
(4)暂停容器
(5)恢复容器
(6)杀死容器
(7)删除任务
(8)删除容器
(9)获取容器资源使用情况0
(10)查看容器进程在宿主机的 PID
4. 其他操作
(1)插件
(2)命名空间
五、总结
六、Containerd 插件机制详解
1. 插件体系结构概述
2. 常见插件类型及功能
(1)Shim 插件
(2)Snapshotter 插件
(3)Task 插件
(4)Image 插件
(5)Content Store 插件
3. 插件管理命令实践
(1)查看系统已加载插件
(2)配置 Snapshotter 插件
(3)自定义插件加载
七、Linux 命名空间在 Containerd 中的应用
1. 命名空间隔离机制
2. 主要命名空间类型及作用
(1)PID 命名空间
(2)Network 命名空间
(3)Mount 命名空间
(4)UTS 命名空间
(5)IPC 命名空间
(6)User 命名空间
3. 命名空间操作实践
(1)查看系统命名空间
(2)创建自定义命名空间
(3)在指定命名空间操作容器
(4)命名空间资源隔离验证
八、Containerd 与 Kubernetes 集成
1. 集成架构概述
2. 集成配置步骤
(1)配置 CRI 插件
(2)配置 Kubelet 使用 Containerd
(3)验证集成状态
3. CRI 接口与 Containerd 的映射关系
九、Containerd 安全机制深度解析
1. 容器隔离增强措施
(1)Seccomp 配置
(2)AppArmor/SELinux 支持
2. 资源限制与监控
(1)CPU 和内存限制
(2)PIDS 限制
3. 安全审计与日志
(1)事件日志收集
(2)审计日志配置
十、Containerd 性能优化实践
1. 存储性能优化
(1)选择高效 Snapshotter
(2)启用块设备快照
2. 网络性能优化
(1)配置高性能网络插件
(2)启用 TCP 参数优化
3. 系统参数调优
(1)内核参数优化
(2)Cgroup v2 配置
十一、Containerd 故障排查与维护
1. 常见问题诊断
(1)Containerd 服务启动失败
(2)镜像拉取失败
(3)容器启动失败
2. 性能问题排查
(1)CPU 性能瓶颈分析
(2)内存泄漏排查
(3)磁盘 I/O 性能问题
3. 日志收集与分析
(1)Containerd 服务日志
(2)容器运行日志
4. 版本升级与回滚
(1)升级 Containerd
(2)回滚 Containerd 版本
十二、Containerd 高级应用场景
1. 多架构容器部署
(1)构建多平台镜像
(2)跨架构部署容器
2. 容器镜像分层优化
(1)分析镜像分层
(2)优化镜像分层
3. 容器持久化存储
(1)使用快照管理持久化数据
(2)配置持久化存储卷
十三、Containerd 与其他容器技术对比
1. Containerd vs Docker
(1)架构差异
(2)功能对比
(3)迁移指导
2. Containerd vs CRI-O
(1)设计目标
(2)性能对比
(3)场景选择
十四、Containerd 生态工具链
1. 镜像管理工具
(1)Skopeo
(2)Dive
2. 容器运行时工具
(1)CRI-tools
(2)nerdctl
3. 监控与管理工具
(1)Prometheus + ctr metrics
(2)Grafana 仪表盘
一、Containerd 概述
1. 什么是 Containerd
Containerd(Container Daemon)是一个开源的容器运行时,提供了标准化的方式来管理容器的生命周期。它最初由 Docker 开发团队创建,后来成为 CNCF(云原生计算基金会)的孵化项目。
主要特点和功能:
- 容器生命周期管理:涵盖容器的创建、运行、暂停、恢复、停止和销毁等操作。
- 标准化接口:提供标准化的容器运行时接口,可与 Kubernetes、Docker Compose 等多种容器编排系统和工具集成。
- 镜像管理:支持容器镜像的拉取、推送、保存和加载等操作,遵循 OCI(Open Container Initiative)规范。
- 插件体系结构:具备可扩展的插件体系结构,允许通过插件扩展功能,如存储驱动、网络插件等。
- 跨平台支持:可在不同操作系统上运行,提供跨平台支持。
- 与 Kubernetes 集成:作为 Kubernetes 的默认容器运行时,与 Kubernetes 紧密集成。
- 安全性和隔离:实现严格的容器隔离和安全性措施,确保容器之间及对主机系统的安全。
2. Containerd 的起源与背景
Containerd 的起源可追溯到 Docker 项目。随着 Docker 的发展,其架构变得复杂,包含镜像构建、服务编排等众多功能。为了更好地组织和管理这些功能,Docker 团队决定将 Docker 引擎拆分成多个组件,Containerd 就是其中关键的组件,被定位为 Docker 的核心容器运行时。
之后,Docker 团队将 Containerd 的代码捐赠给 CNCF,使其成为 CNCF 的孵化项目。Containerd 的设计遵循 OCI 规范,可与符合 OCI 规范的其他容器工具和运行时互操作,不仅服务于 Docker 生态系统,还作为独立的容器运行时,与多个容器编排系统和工具集成。
二、Containerd 架构
1. 架构概述
Containerd 采用 C/S 架构,服务端通过 Unix Domain Socket 暴露低层的 gRPC API,客户端通过这些 API 管理节点上的容器。每个 Containerd 只负责一台机器,承担拉取镜像、容器操作(启动、停止等)、网络和存储等任务,具体运行容器由 runc 负责。
为了实现解耦,Containerd 将系统划分为不同组件,每个组件由一个或多个模块协作完成,这些模块以插件形式集成到 Containerd 中,体现了模块化和可扩展性的设计理念。
2. 核心组件解析
Containerd 组件主要分为 Storage、Metadata 和 Runtime 三个方面:
(1)Storage(存储)
- Content(内容):存储容器镜像的实际数据,包括文件系统层和元数据,用于创建和管理容器的基础文件系统。
- Snapshot(快照):存储容器的快照数据,每个容器可以有一个或多个快照,实现相同文件系统层的共享,提高效率。
- Diff(差异):存储容器文件系统层之间的差异,当容器运行时修改文件系统时,在已有文件系统层上创建差异层保存变更。
(2)Metadata(元数据)
- Images(镜像):存储容器镜像的元数据,如镜像标签、大小、创建时间等,支持对镜像的管理和操作。
- Containers(容器):有效管理容器的生命周期。
(3)Runtime(运行时)
- Tasks(任务):包含容器内的进程组,每个容器运行时都有关联的 Task,负责管理容器内的所有进程,与 Shim 一起维护容器状态。
- Events(事件):记录容器的各种事件,如创建、启动、停止等,用于监控和日志记录。
三、安装配置 Containerd
1. 安装 Containerd
# Step2: 添加软件源信息
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo# 列出可用版本
yum list containerd.io --showduplicates# 安装containerd
yum -y install containerd.io
2. 配置 Containerd
(1)生成配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 或
containerd config default > /etc/containerd/config.toml
(2)配置镜像加速
vim /etc/containerd/config.toml
# 首先修改配置文件
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" # 添加mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.iocat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOFcat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
(3)启动服务
systemctl restart containerd
systemctl status containerd# 查看版本
ctr version
四、Containerd 基本操作
1. 镜像类操作
(1)拉取镜像
# 全平台拉取镜像
ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/# 指定平台拉取镜像
ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
(2)查看镜像
# 查看本地镜像(默认查default命名空间)
ctr images ls# 查看crictl拉取的镜像
ctr -n k8s.io images ls
(3)检测本地镜像
ctr images check
(4)重新打标签
ctr images tag 当前镜像名称 新镜像名称
# 示例
ctr images tag docker.io/library/nginx:latest nginx:v1
ctr images tag docker.io/library/nginx:latest nginx:v2
(5)删除镜像
ctr images rm 镜像名称:[镜像标签]
# 示例
ctr images rm nginx:v2
(6)镜像挂载到主机目录
ctr images mount 镜像 挂载点
# 示例
ctr images mount nginx:v1 /mnt
(7)镜像从主机目录卸载
ctr images unmount 挂载点
# 示例
ctr images unmount /mnt/
(8)镜像导出
# 全平台导出
ctr images export --all-platforms 文件名 镜像名称:[镜像标签]
# 示例
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest# 指定平台导出
ctr images export --platform linux/amd64 文件名 镜像名称:[镜像标签]
(9)镜像导入
# 全平台导入
ctr images import 文件名# 指定平台导入
ctr images import --platform linux/amd64 文件名
2. 容器类操作
(1)创建容器
ctr containers create 镜像名称 容器名称
# 示例
ctr containers create nginx:v1 nginx
(2)列出容器
ctr containers ls
(3)查看容器详细信息
ctr containers info 容器名称
(4)删除容器
ctr containers rm 容器名称
3. 任务类操作
(1)启动容器
# 先创建容器
ctr containers create nginx:v1 nginx# 启动任务(-d放入后台)
ctr task start -d 容器名称
(2)查看容器
ctr task ls
(3)进入容器
ctr task exec --exec-id 自定义ID -t 容器名称 sh
(4)暂停容器
ctr task pause 容器名称
(5)恢复容器
ctr task resume 容器名称
(6)杀死容器
ctr task kill 容器名称
(7)删除任务
ctr task rm 容器名称
(8)删除容器
ctr task kill 容器名称
ctr container rm 容器名称
(9)获取容器资源使用情况0
# 先创建并启动容器
ctr containers create nginx:v1 nginx
ctr task start -d nginx# 获取 metrics
ctr task metrics nginx
(10)查看容器进程在宿主机的 PID
# 启动容器
ctr task start -d nginx# 查看容器进程PID
ctr task ps nginx# 在宿主机查看进程
ps -ef | grep PID
4. 其他操作
(1)插件
- 列出当前所有插件
ctr plugins ls
(2)命名空间
- 查看命名空间
ctr ns ls
- 创建命名空间
ctr ns create 命名空间名称
- 删除命名空间
ctr ns rm 命名空间名称
- 在指定命名空间操作
# 示例:在test命名空间拉取镜像
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/# 示例:在test命名空间打标签
ctr -n test images tag docker.io/library/nginx:latest nginx:v1# 示例:在test命名空间创建容器
ctr -n test containers create nginx:v1 nginx03# 示例:在test命名空间启动容器
ctr -n test task start -d nginx03# 示例:在test命名空间查看任务
ctr -n test task ls
五、总结
Containerd 作为云原生时代重要的容器运行时,提供了轻量级、高度可定制的容器管理能力。通过本章学习,我们深入了解了 Containerd 的基本概念、运行架构、环境部署、镜像管理和容器管理等核心内容。
Containerd 的模块化和插件化设计使其具有强大的可扩展性,能够通过加载不同插件满足多样化的需求。同时,它与 Kubernetes 等容器编排系统紧密集成,成为现代容器化应用部署和管理的重要基础。
六、Containerd 插件机制详解
1. 插件体系结构概述
Containerd 采用插件化设计,这种设计使得其功能可以通过加载不同的插件进行灵活扩展。插件体系结构是 Containerd 实现高度可定制化的核心机制,允许用户根据实际需求选择性地配置 Containerd,以适应不同的容器运行时和编排系统需求2。
每个插件都提供标准化接口,这使得插件可以轻松替换或新增,满足不同用户和组织的需求。插件化设计让 Containerd 能够灵活适应各种使用场景,例如通过选择不同的存储驱动插件或网络插件,用户可以定制符合自身环境的容器运行时行为3。
2. 常见插件类型及功能
(1)Shim 插件
- 功能:负责管理容器的生命周期。当容器任务启动时,Containerd 调用 Shim 插件创建并监管容器进程,处理与容器进程的通信及监控容器状态4。
- 典型应用:runc shim 是最常用的 Shim 插件,用于启动和管理基于 runc 的容器进程。
(2)Snapshotter 插件
- 功能:处理容器的文件系统快照,定义容器文件系统结构,支持创建、管理和销毁快照,以及在容器间共享文件系统层5。
- 常见类型:
overlayfs
:基于 OverlayFS 文件系统的快照插件,支持分层存储和写时复制。btrfs
:基于 Btrfs 文件系统的快照插件,提供快照和克隆功能。devmapper
:基于 Device Mapper 的快照插件,适用于 LVM 管理的存储设备6。
(3)Task 插件
- 功能:管理容器中的任务(Task),任务表示容器内运行的一个或多个进程,与容器生命周期直接相关7。
- 核心作用:协调容器进程的启动、暂停、恢复和终止等操作。
(4)Image 插件
- 功能:处理容器镜像的拉取、推送、删除等操作,定义镜像的存储和元数据结构8。
- 集成点:与 OCI 镜像规范兼容,支持从 Docker Hub、私有 Registry 等多源获取镜像。
(5)Content Store 插件
- 功能:管理容器内容(如镜像层和元数据),定义内容的存储和检索方式9。
- 底层支持:为镜像分层存储和分发提供基础架构支持。
3. 插件管理命令实践
(1)查看系统已加载插件
# 列出所有插件及其状态
ctr plugins ls
输出示例:
TYPE ID PLATFORMS STATUS
io.containerd.content.v1 content - ok
io.containerd.snapshotter.v1 aufs linux/amd64 skip
io.containerd.snapshotter.v1 btrfs linux/amd64 skip
io.containerd.snapshotter.v1 devmapper linux/amd64 error
io.containerd.snapshotter.v1 native linux/amd64 ok
io.containerd.snapshotter.v1 overlayfs linux/amd64 ok
...(省略其他插件)
(2)配置 Snapshotter 插件
# 修改配置文件启用overlayfs插件
vim /etc/containerd/config.toml
# 找到[snapshots]部分,设置default_snapshotter为overlayfs
[snapshots]default_snapshotter = "overlayfs"# 重启Containerd使配置生效
systemctl restart containerd
(3)自定义插件加载
# 在配置文件中添加自定义插件路径
vim /etc/containerd/config.toml
[plugins]# 示例:加载自定义网络插件[plugins."io.containerd.network.v1"]plugin_dir = "/usr/lib/containerd/plugins"
七、Linux 命名空间在 Containerd 中的应用
1. 命名空间隔离机制
Containerd 利用 Linux 内核的命名空间(Namespaces)实现容器的资源隔离,这是容器技术实现隔离性的核心基础。命名空间允许同一主机上的进程拥有不同的资源视图,从而避免容器之间及容器与主机系统的干扰10。
2. 主要命名空间类型及作用
(1)PID 命名空间
- 隔离范围:进程 ID 空间。
- 作用:使不同 PID 命名空间中的进程拥有独立的 PID 编号,容器内的进程无法看到或影响主机及其他容器的进程11。
- 实现原理:每个 PID 命名空间维护独立的进程树,容器进程在自身命名空间中显示为 PID 1,但在主机中对应真实 PID。
(2)Network 命名空间
- 隔离范围:网络栈(网络接口、IP 地址、路由表等)。
- 作用:每个容器拥有独立的网络环境,可配置私有 IP、端口等,不影响主机及其他容器的网络配置12。
- 典型应用:容器内运行 Web 服务时,可独立绑定端口,与主机端口通过 NAT 或端口映射关联。
(3)Mount 命名空间
- 隔离范围:文件系统挂载点。
- 作用:使容器拥有独立的文件系统视图,可自定义挂载点而不影响主机及其他容器13。
- 实现方式:Containerd 通过 Snapshotter 插件为容器创建独立的文件系统快照,基于 Mount 命名空间隔离。
(4)UTS 命名空间
- 隔离范围:主机名和域名。
- 作用:允许容器拥有独立的主机名和域名,与主机及其他容器隔离14。
- 配置方式:创建容器时通过参数指定
--hostname
即可设置 UTS 命名空间内的主机名。
(5)IPC 命名空间
- 隔离范围:进程间通信资源(如共享内存、信号量等)。
- 作用:防止容器内进程与主机或其他容器共享 IPC 资源,增强安全性15。
(6)User 命名空间
- 隔离范围:用户和用户组的视图。
- 作用:使容器内进程以不同的用户和组身份运行,而不影响主机实际用户权限16。
- 安全价值:通过 User 命名空间,容器可实现 "特权隔离",避免容器内 root 用户直接获取主机 root 权限。
3. 命名空间操作实践
(1)查看系统命名空间
# 列出所有命名空间
ctr ns ls
(2)创建自定义命名空间
# 创建test命名空间
ctr ns create test# 验证命名空间创建
ctr ns ls
(3)在指定命名空间操作容器
# 在test命名空间拉取镜像
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/# 在test命名空间创建容器
ctr -n test containers create nginx:latest nginx-test# 在test命名空间启动容器
ctr -n test task start -d nginx-test# 查看test命名空间的任务
ctr -n test task ls
(4)命名空间资源隔离验证
# 在默认命名空间启动容器
ctr containers create nginx:latest nginx-default
ctr task start -d nginx-default# 在test命名空间启动容器
ctr -n test containers create nginx:latest nginx-test
ctr task start -d nginx-test# 查看主机网络接口(两个容器的网络命名空间独立)
ip link show
八、Containerd 与 Kubernetes 集成
1. 集成架构概述
Containerd 作为 Kubernetes 的默认容器运行时,与 Kubernetes 实现了深度集成。Kubernetes 通过 CRI(容器运行时接口)与 Containerd 通信,CRI 是 Kubernetes 定义的标准化接口,用于解耦上层编排系统与底层容器运行时1。
2. 集成配置步骤
(1)配置 CRI 插件
# 修改Containerd配置文件启用CRI
vim /etc/containerd/config.toml
# 找到[plugins."io.containerd.grpc.v1.cri"]部分,取消注释并配置
[plugins."io.containerd.grpc.v1.cri"]disable = falsestream_server = truestream_server_address = "/run/containerd/containerd.sock"# 其他配置(如镜像加速、PodSandbox配置等)
(2)配置 Kubelet 使用 Containerd
# 修改Kubelet配置文件
vim /etc/systemd/system/kubelet.service.d/10-containerd.conf
# 添加以下内容
[Service]
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --image-service-endpoint=unix:///run/containerd/containerd.sock"# 重载配置并重启Kubelet
systemctl daemon-reload
systemctl restart kubelet
(3)验证集成状态
# 查看Kubelet运行时信息
kubelet --version# 查看节点状态
kubectl get nodes# 部署测试Pod
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
kubectl describe pod simple-pod
3. CRI 接口与 Containerd 的映射关系
CRI 定义了两组主要接口:
- RuntimeService:管理 Pod 和容器的生命周期,对应 Containerd 的
containers-service
和tasks-service
插件。 - ImageService:管理镜像的拉取和管理,对应 Containerd 的
images-service
插件。
九、Containerd 安全机制深度解析
1. 容器隔离增强措施
(1)Seccomp 配置
- 作用:通过系统调用过滤限制容器内进程可执行的系统调用,减少攻击面。
- 配置方式:
# 在Containerd配置文件中添加Seccomp规则 vim /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]seccomp = trueseccomp_profile = "/path/to/seccomp/profile.json"
(2)AppArmor/SELinux 支持
- AppArmor:通过配置文件限制容器内进程的文件访问和操作权限。
# 在Containerd配置中启用AppArmor vim /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]apparmor_profile = "container-default"
- SELinux:通过安全上下文标签控制容器对主机资源的访问。
# 在启动容器时指定SELinux标签 ctr run --security-opt label=type:container_t nginx:latest nginx-container
2. 资源限制与监控
(1)CPU 和内存限制
# 创建容器时指定资源限制
ctr containers create \--cpu 2 \--memory 2GB \nginx:latest nginx-resource# 启动容器并查看资源使用
ctr task start -d nginx-resource
ctr task metrics nginx-resource
(2)PIDS 限制
# 创建容器时限制最大进程数
ctr containers create \--pids-limit 100 \nginx:latest nginx-pids# 启动容器并验证PIDS限制
ctr task start -d nginx-pids
# 通过压力测试验证进程数上限
3. 安全审计与日志
(1)事件日志收集
# 配置Containerd事件日志输出
vim /etc/containerd/config.toml
[plugins."io.containerd.event.v1.exchange"]enable = truepath = "/var/log/containerd/events.log"# 重启Containerd
systemctl restart containerd# 查看事件日志
tail -f /var/log/containerd/events.log
(2)审计日志配置
# 启用审计日志(需要Containerd编译时支持)
vim /etc/containerd/config.toml
[plugins."io.containerd.audit.v1"]enable = truepath = "/var/log/containerd/audit.log"level = "info"
十、Containerd 性能优化实践
1. 存储性能优化
(1)选择高效 Snapshotter
# 配置overlayfs作为默认Snapshotter
vim /etc/containerd/config.toml
[snapshots]default_snapshotter = "overlayfs"# 或使用btrfs(需文件系统支持)
[snapshots]default_snapshotter = "btrfs"
(2)启用块设备快照
# 配置devmapper插件(适用于LVM场景)
vim /etc/containerd/config.toml
[plugins."io.containerd.snapshotter.v1.devmapper"]root_path = "/dev/mapper/containerd--pool"base_image_size = "10GB"block_size = "512KB"
2. 网络性能优化
(1)配置高性能网络插件
# 安装并配置CNI插件(如Calico、Flannel)
# 以Calico为例:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml# 在Containerd中配置CNI插件路径
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d"
(2)启用 TCP 参数优化
# 在容器运行时配置中添加TCP参数
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.network]options = ["tcp_fastopen=3", "tcp_fin_timeout=15"]
3. 系统参数调优
(1)内核参数优化
# 创建sysctl配置文件
vim /etc/sysctl.d/99-containerd-tuning.conf
# 添加以下参数
net.core.somaxconn = 65535
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
vm.swappiness = 0
vm.overcommit_memory = 1# 应用参数
sysctl -p /etc/sysctl.d/99-containerd-tuning.conf
(2)Cgroup v2 配置
# 检查Cgroup v2支持
ls /sys/fs/cgroup/ -la | grep cgroup2# 若支持,修改grub配置启用Cgroup v2
vim /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1"# 重新生成grub配置并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot# 配置Containerd使用Cgroup v2
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]cgroup = "cgroup2"
十一、Containerd 故障排查与维护
1. 常见问题诊断
(1)Containerd 服务启动失败
# 查看服务日志
journalctl -u containerd -n 100# 检查配置文件语法
containerd config validate /etc/containerd/config.toml# 重置配置为默认值
containerd config default > /etc/containerd/config.toml
(2)镜像拉取失败
# 检查网络连接
ping docker.io# 查看镜像拉取日志
ctr images pull --debug docker.io/library/nginx:latest# 验证镜像仓库认证
ctr registry login docker.io -u username -p password
(3)容器启动失败
# 查看容器创建日志
ctr containers create --debug nginx:latest nginx-debug# 检查容器运行时日志
journalctl -u containerd | grep "runc create"# 手动运行runc调试
runc create --debug <container-id>
runc start <container-id>
2. 性能问题排查
(1)CPU 性能瓶颈分析
# 查看容器CPU使用情况
ctr task metrics <容器名称># 使用top命令查看容器内进程
ctr task exec --exec-id top -t <容器名称> top -c# 主机层面查看容器CPU占用
pid=$(ctr task ps <容器名称> | awk '{print $1}')
top -p $pid
(2)内存泄漏排查
# 监控容器内存变化
watch -n 5 ctr task metrics <容器名称> | grep memory# 查看容器内存分配详情
ctr task exec --exec-id mem -t <容器名称> ps aux | sort -k4 -r# 使用memory-profiler工具分析(需在容器内安装)
ctr task exec --exec-id prof -t <容器名称> memory-profiler --profile heap
(3)磁盘 I/O 性能问题
# 查看容器磁盘使用情况
ctr task exec --exec-id df -t <容器名称> df -h# 监控容器磁盘I/O
pid=$(ctr task ps <容器名称> | awk '{print $1}')
iotop -p $pid# 主机层面查看块设备I/O
iostat -x 1
3. 日志收集与分析
(1)Containerd 服务日志
# 查看系统日志中的Containerd记录
journalctl -u containerd --since "1h ago"# 查看Containerd运行时日志
tail -f /var/log/containerd/containerd.log# 配置日志级别(临时修改)
ctr config set log.level debug
(2)容器运行日志
# 查看容器标准输出日志
ctr task logs <容器名称># 查看容器错误输出日志
ctr task logs -e <容器名称># 配置容器日志持久化(在配置文件中)
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.logging]type = "file"path = "/var/log/containers/<container-name>.log"max_size = 100 # MBmax_file = 5
4. 版本升级与回滚
(1)升级 Containerd
# 查看可用版本
yum list containerd.io --showduplicates | sort -r# 备份当前配置
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak# 升级软件包
yum update -y containerd.io# 检查新版本兼容性
containerd config validate /etc/containerd/config.toml# 重启服务
systemctl restart containerd# 验证升级结果
ctr version
(2)回滚 Containerd 版本
# 查看已安装版本
yum list installed containerd.io# 回滚到指定版本
yum downgrade containerd.io-<version># 恢复配置文件
cp /etc/containerd/config.toml.bak /etc/containerd/config.toml# 重启服务
systemctl restart containerd
十二、Containerd 高级应用场景
1. 多架构容器部署
(1)构建多平台镜像
# 使用buildkit构建多架构镜像
ctr build \--platform linux/amd64,linux/arm64 \-t docker.io/library/nginx:multiarch \.# 查看镜像支持的平台
ctr images inspect docker.io/library/nginx:multiarch | grep -i platforms
(2)跨架构部署容器
# 在x86_64主机上运行arm64镜像(需QEMU支持)
# 安装QEMU
yum install -y qemu-user-static# 注册binfmt_misc支持
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes# 拉取并运行arm64镜像
ctr images pull docker.io/library/nginx:arm64
ctr run --rm -t docker.io/library/nginx:arm64 nginx-arm64
2. 容器镜像分层优化
(1)分析镜像分层
# 查看镜像分层结构
ctr images layers docker.io/library/nginx:latest# 使用dive工具可视化分层(需安装)
dive docker.io/library/nginx:latest
(2)优化镜像分层
# 使用buildkit进行分层优化
ctr build \--optimize \-t docker.io/library/nginx:optimized \.# 对比优化前后的分层数量和大小
ctr images layers docker.io/library/nginx:latest
ctr images layers docker.io/library/nginx:optimized
3. 容器持久化存储
(1)使用快照管理持久化数据
# 创建容器数据快照
ctr snapshot create my-data-snapshot /data# 在容器中使用快照
ctr containers create \--snapshot my-data-snapshot \nginx:latest nginx-persistent# 备份快照
ctr snapshot export my-data-snapshot my-data-snapshot.tar
(2)配置持久化存储卷
# 创建主机目录作为数据卷
mkdir -p /data/nginx# 运行容器并挂载数据卷
ctr run \-v /data/nginx:/usr/share/nginx/html \nginx:latest nginx-data
十三、Containerd 与其他容器技术对比
1. Containerd vs Docker
(1)架构差异
- Docker:单体架构,集成镜像构建、容器运行、网络管理等功能。
- Containerd:模块化架构,专注于容器运行时,通过插件扩展功能。
(2)功能对比
功能 | Docker | Containerd |
---|---|---|
镜像构建 | 原生支持(docker build) | 需集成 BuildKit |
服务编排 | 内置 Compose 支持 | 依赖 Kubernetes 等编排工具 |
容器网络 | 内置 Docker Network | 依赖 CNI 插件 |
生态系统成熟度 | 更成熟,用户基数大 | 快速发展,Kubernetes 默认 |
(3)迁移指导
# 停止Docker服务
systemctl stop docker# 安装Containerd
yum install -y containerd.io# 迁移Docker镜像到Containerd
ctr images import docker-image.tar# 配置Kubernetes使用Containerd
# (参考前文Kubernetes集成部分)
2. Containerd vs CRI-O
(1)设计目标
- Containerd:通用容器运行时,支持多编排系统,功能丰富。
- CRI-O:专注于 Kubernetes 集成,轻量级设计,减少依赖。
(2)性能对比
- 启动速度:CRI-O 略快,因简化了非 Kubernetes 相关功能。
- 资源占用:CRI-O 内存占用更低,适合资源受限环境。
(3)场景选择
- 推荐 Containerd:需要支持多编排系统(如 Docker Compose、Kubernetes),或需要丰富插件扩展功能。
- 推荐 CRI-O:纯 Kubernetes 环境,追求最小化依赖和资源占用。
十四、Containerd 生态工具链
1. 镜像管理工具
(1)Skopeo
- 功能:镜像仓库操作,支持跨仓库复制、镜像检查等。
- 示例命令:
# 复制镜像到另一个仓库 skopeo copy docker://docker.io/library/nginx:latest oci-archive:/path/nginx.tar# 检查镜像是否存在 skopeo list-tags docker://docker.io/library/nginx
(2)Dive
- 功能:镜像分层可视化分析,帮助优化镜像构建。
- 示例命令:
dive docker.io/library/nginx:latest
2. 容器运行时工具
(1)CRI-tools
- 功能:CRI 接口调试工具,用于测试 Containerd 与 Kubernetes 的集成。
- 示例命令:
# 列出所有容器 crictl ps# 查看容器日志 crictl logs <container-id>
(2)nerdctl
- 功能:兼容 Docker CLI 的 Containerd 命令行工具。
- 示例命令:
# 拉取镜像 nerdctl pull docker.io/library/nginx:latest# 运行容器 nerdctl run -d -p 80:80 nginx:latest
3. 监控与管理工具
(1)Prometheus + ctr metrics
- 配置示例:
# Prometheus配置 - job_name: 'containerd'static_configs:- targets: ['localhost:10255'] # Kubelet metrics端口metrics_path: /containerd.metrics
(2)Grafana 仪表盘
- 导入 Containerd 专用仪表盘:
# 下载Containerd仪表盘JSON wget https://raw.githubusercontent.com/containerd/containerd/main/contrib/grafana/dashboard.json# 在Grafana中导入仪表盘