Container

目录

一、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-servicetasks-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)功能对比
功能DockerContainerd
镜像构建原生支持(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中导入仪表盘
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86379.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#设计模式-Builder-生成器-对象创建型模式

using System; using System.Collections.Generic;namespace A4_Builder_生成器_对象创建型模式 {// 产品类&#xff1a;最终要构建的复杂对象public class Computer{public string CPU { get; set; }public string GPU { get; set; }public int RAM { get; set; } // GBpublic…

C语言堆内存管理详解:malloc和free的使用指南

在C语言程序设计中&#xff0c;内存管理是一个重要的话题。本文将详细介绍堆内存的分配和释放&#xff0c;重点讲解malloc和free函数的使用方法&#xff0c;并通过实例说明相关注意事项。 一、堆内存与栈内存的区别 在C语言中&#xff0c;内存主要分为堆内存和栈内存&#xf…

探索 Oracle Database 23ai 中的 SQL 功能

探索 Oracle Database 23ai 中的 SQL 功能 介绍目标前提条件 功能 1&#xff1a;使用 FROM 子句功能 2&#xff1a;使用 BOOLEAN 数据类型功能 3&#xff1a;使用 IF NOT EXISTS DDL 子句功能 4&#xff1a;使用 INSERT 插入多行功能 5&#xff1a;使用新的 VALUE 构造函数功能…

SQL(6)

! 会排除null数据 select name from Customer where referee_id ! 2 or referee_id is null; 交叉联结 交叉连接&#xff08;CROSS JOIN&#xff09;-CSDN博客 197. 上升的温度 select a.id from weather as a cross join weather as b on datediff(a.recordDate ,b.recordD…

【Java面试题】cookie、session、jwt/token的异同

以下是对Cookie、Session、Token与JWT的异同的完善分析&#xff0c;结合技术原理、安全性和应用场景进行系统性对比&#xff1a; &#x1f50d; 一、核心概念与工作流程 机制定义工作流程核心特点Cookie客户端存储的小型文本数据1. 服务器通过Set-Cookie响应头下发数据2. 浏览…

数字经济时代科技创业的巨大潜力

2025年3月&#xff0c;42岁的字节跳动创始人张一鸣以655亿美元身家成为中国新首富。这位"80后"企业家白手起家的故事&#xff0c;展现了数字经济时代科技创业的巨大潜力。本文将带您了解张一鸣的成功秘诀&#xff0c;分析网络安全行业的最新趋势&#xff0c;并为计算…

深入剖析Nginx架构及其不同使用场景下的配置

一、Nginx 整体架构概览 1. Nginx简介 Nginx 是采用 C 语言 编写的高性能 Web 服务器、反向代理服务器及邮件代理服务器&#xff0c;特点是&#xff1a;高并发、高可用、低内存占用、模块化设计。 架构核心理念&#xff1a; Master-Worker 多进程模型 事件驱动&#xff08;…

单元测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于软件测试&#xff0c;我们先按照开发阶段来进行划分&#xff0c;将软件测试分为单元测试、集成测试、系统测试、验收测试&#xff0c;下面我们来聊聊单元测试。…

四款好用的Windows虚拟打印机,文档转PDF

1&#xff0c;Microsoft Print To PDF 2&#xff0c;Foxit Reader PDF Printer 3&#xff0c;Adobe PDF 4&#xff0c;clawPDF 参考文档&#xff1a; https://mp.weixin.qq.com/s/_mt4J2RwhqQE36DRAvc-Rg

《map和set的使用介绍》

引言&#xff1a; 上次我们学习了第一个高阶数据结构—二叉搜索树&#xff0c;趁热打铁&#xff0c;今天我们就再来学习两个数据结构—map和set。 一&#xff1a;序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、arra…

PostgreSQL(二十六)分区表管理

目录 一、分区表特点 1、概念&#xff1a; 2、好处&#xff1a; 3、特点&#xff1a; 二、范围分区介绍 1、简介 2、范围分区实验&#xff1a; 三、list分区介绍 1、简介 2、list分区表实验 四、hash分区介绍 1、简介 2、hash分区表实验 五、混合分区介绍 1、简…

概率论中的生日问题,违背直觉?如何计算? 以及从人性金融的角度分析如何违背直觉的?

一、生日问题的概率计算&#xff1a;为何23人就有50%概率撞生日&#xff1f; 1. 问题背景与直觉矛盾 生日问题指&#xff1a;在n个人中&#xff0c;至少有两人生日相同的概率超过50%时&#xff0c;n的最小值是多少&#xff1f; 直觉判断&#xff1a;因一年有365天&#xff0c…

Qt for WebAssembly官方说明文档

链接 Qt for WebAssembly | Qt 5.15

前端自主实现将vue页面转为pdf文件下载

1.vue 转 PDF 在 Vue 项目中将 HTML 页面转换为 PDF 文件是一个常见需求&#xff0c;特别是在需要生成报告或打印页面时。本文将介绍如何使用 html2canvas 和 jspdf 库实现这一功能。 2.安装依赖 首先&#xff0c;我们需要安装两个库&#xff1a;html2canvas 和 jspdf 。可以…

TCP 坚持定时器详解:原理、配置与最佳实践​

一、TCP 坚持定时器基础原理 1.1 坚持定时器的设计目的 TCP 坚持定时器 (TCP Persist Timer) 是 TCP 协议中用于处理接收窗口为零情况的重要机制&#xff0c;其核心设计目的是防止 TCP 连接在窗口更新 ACK 丢失时陷入死锁状态。当 TCP 连接的接收方通告一个窗口大小为 0 的 A…

大厂测开实习和小厂开发实习怎么选

先说选择&#xff0c;这个可以百分百确定选大厂&#xff0c;title很重要。 要想弄清楚那个选择对自己最有利&#xff0c;可以思考下实习的意义是什么&#xff1f; 实习无非就是给简历加分&#xff0c;拿到好offer&#xff0c;高薪offer。 那这就需要思考&#xff0c;简历怎么让…

Unity中的urp和普通的标准渲染管线区别在哪

Unity中的URP&#xff08;Universal Render Pipeline&#xff09;与内置标准渲染管线&#xff08;Built-in Render Pipeline&#xff09;的区别深刻反映了Unity渲染技术的演进方向。以下从架构、性能、功能、工作流等多个维度进行深度分析&#xff1a; 1. 底层架构与设计哲学 标…

Vscode 编写Markdown支持 plantuml书写

1&#xff1a; 下载PlantUml 插件&#xff1a; 2&#xff1a; 安装java https://www.oracle.com/java/technologies/downloads/ 3&#xff1a; 安装Graphviz https://graphviz.org/download/ 4&#xff1a; 下载plantuml.jar https://plantuml.com/zh/download 5&…

设计模式(C++/Qt)-工厂模式

在软件开发中&#xff0c;对象创建是基础但关键的任务——工厂模式提供了一种优雅的解决方案&#xff0c;让您的代码摆脱硬编码的依赖关系 一、为什么需要工厂模式&#xff1f; 在C/Qt开发中&#xff0c;我们经常面临这样的困境&#xff1a; 对象创建逻辑分散在代码各处新增…

Pydantic 模型

本文将详细介绍 Pydantic 模型 和 BaseModel 的核心概念&#xff0c;并通过实际代码示例如何从零开始编写自己的 Pydantic 模型。 1. Pydantic 是什么&#xff1f; Pydantic 是一个 Python 库&#xff0c;主要用于&#xff1a; 数据验证&#xff1a;确保输入数据符合预期的类…