✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑
文章目录
- Containerd
- 引言
- 安装 Containerd
- 方法一:使用官方二进制文件
- 方法二:使用包管理器
- Containerd 的常用命令
- ctr
- 停止容器
- 容器和镜像的高级操作
- 导出和导入镜像
- 标签和标签管理
- 容器快照管理
- 配置文件详解
- 结合实际案例:使用 Containerd 部署 Web 应用
- 深入 Containerd 的高级功能
- 镜像管理
- 网络配置
- 存储卷和持久化存储
- 安全性和隔离性
- 监控和日志
- 结合 Kubernetes 使用 Containerd
- k8s使用containerd具体原因
- 总结
Containerd
引言
Containerd 是一个高性能、高度可扩展的容器运行时,由 Docker 团队开发并开源,现已成为 Cloud Native Computing Foundation (CNCF) 的顶级项目之一。Containerd 专注于容器的生命周期管理和资源隔离,支持 OCI (Open Container Initiative) 标准,提供了一套丰富的 API 用于容器的创建、启动、停止和销毁等操作。本文将结合实际案例,详细介绍 containerd 的安装、配置、常用命令及高级功能。
安装 Containerd
方法一:使用官方二进制文件
对于基于 glibc 的系统(如 Ubuntu 或 Rocky Linux),推荐使用官方提供的二进制文件进行安装。以下步骤以 Ubuntu 为例:
-
下载 Containerd
从 GitHub 上下载 containerd 的最新版本(以 v1.3.9 为例):
cd /home/work wget https://github.com/containerd/containerd/releases/download/v1.3.9/containerd-1.3.9-linux-amd64.tar.gz
-
解压并安装
将下载的压缩包解压到
/usr/local
目录下:sudo tar -C /usr/local -xf containerd-1.3.9-linux-amd64.tar.gz
并将 containerd 的可执行文件链接到
/usr/bin
目录下,方便后续使用:sudo ln -s /usr/local/bin/containerd /usr/bin/containerd sudo ln -s /usr/local/bin/ctr /usr/bin/ctr
-
安装 runc
Containerd 需要调用 runc 来启动容器,因此需先安装 runc。可以通过包管理器安装:
sudo apt-get update sudo apt-get install runc
-
配置 Containerd
Containerd 的配置文件默认为
/etc/containerd/config.toml
。可以通过以下命令生成一个默认的配置文件:sudo mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml
你可以根据需要修改配置文件中的各项参数。
-
将 Containerd 配置为服务
创建一个 systemd 服务文件来管理 containerd:
sudo touch /lib/systemd/system/containerd.service sudo vi /lib/systemd/system/containerd.service
在
containerd.service
文件中,添加以下内容:[Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target [Service] ExecStartPre=/sbin/modprobe overlay ExecStart=/usr/bin/containerd Delegate=yes KillMode=process LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity [Install] WantedBy=multi-user.target
保存并退出编辑器,然后重新加载 systemd 配置并启动 containerd 服务:
sudo systemctl daemon-reload sudo systemctl enable containerd.service sudo systemctl start containerd.service sudo systemctl status containerd.service
方法二:使用包管理器
对于某些 Linux 发行版,可以直接使用包管理器安装 containerd。例如,在 Ubuntu 上:
sudo apt-get update
sudo apt-get install containerd.io
Containerd 的常用命令
ctr
ctr 是 containerd 的命令行工具,主要用于调试和简单的容器操作。以下是一些常用的 ctr 命令:
-
列出所有镜像
ctr images ls
-
拉取镜像
ctr image pull docker.io/library/nginx:latest
-
列出所有容器
ctr containers ls
-
创建并运行容器
ctr run --rm docker.io/library/nginx:latest nginx nginx -g 'daemon off;'
注意:
--rm
参数表示容器退出后自动删除。 -
停止容器
ctr 本身不提供直接停止容器的命令,因为容器管理通常通过容器的生命周期钩子(如 Docker 的
docker stop
)实现。不过,你可以通过向容器内发送信号或使用ctr tasks
命令来管理容器的任务(即进程)。
停止容器
虽然 ctr
没有直接的 stop
命令,但你可以通过 ctr tasks kill
命令来向容器的主进程发送信号,通常是 SIGTERM(信号15),来请求容器停止。例如:
# 首先,获取容器的ID或名称
ctr containers ls
# 假设容器的ID是 "your_container_id"
ctr tasks kill your_container_id SIGTERM
# 如果需要强制停止,可以发送 SIGKILL(信号9)
ctr tasks kill your_container_id SIGKILL
容器和镜像的高级操作
导出和导入镜像
虽然 ctr
没有直接的 export
和 import
命令,但你可以使用 ctr images export
和 ctr images import
来导出和导入镜像。
-
导出镜像
ctr images export -o nginx.tar docker.io/library/nginx:latest
-
导入镜像
ctr images import nginx.tar
标签和标签管理
Containerd 允许你为镜像添加标签,以便更容易地引用它们。然而,ctr
命令行工具没有直接的命令来添加或删除镜像标签。这通常是通过修改镜像的引用或重新拉取带有新标签的镜像来实现的。
容器快照管理
Containerd 使用快照来存储容器的文件系统状态。虽然直接管理这些快照不是 ctr
的主要用例,但了解它们对于理解容器的工作原理和进行故障排除很有帮助。
配置文件详解
Containerd 的配置文件(通常位于 /etc/containerd/config.toml
)包含了运行时的各种配置选项,如插件配置、网络配置、存储配置等。以下是一些重要的配置项:
- 插件配置:Containerd 使用插件系统来扩展其功能,如支持不同的存储驱动程序或网络插件。
- 网络配置:可以配置 CNI(容器网络接口)插件以管理容器的网络。
- 存储配置:配置镜像和容器快照的存储位置及使用的存储驱动程序。
结合实际案例:使用 Containerd 部署 Web 应用
假设我们要使用 Containerd 部署一个简单的 Nginx Web 服务器。以下是步骤:
-
拉取 Nginx 镜像:
ctr image pull docker.io/library/nginx:latest
-
创建并运行 Nginx 容器:
ctr run -d --name nginx_web_server docker.io/library/nginx:latest nginx nginx -g 'daemon off;'
这里,
-d
参数表示在后台运行容器,--name
用于指定容器的名称。 -
验证容器是否正在运行:
ctr containers ls
你应该能看到名为
nginx_web_server
的容器在列表中。 -
查看容器日志:
ctr containers logs nginx_web_server
这将显示 Nginx 容器的日志输出。
-
停止并删除容器:
ctr tasks kill nginx_web_server SIGTERM ctr containers rm nginx_web_server
首先发送 SIGTERM 信号请求 Nginx 优雅地停止,然后删除容器。
通过以上步骤,你已经了解了如何使用 Containerd 来部署和管理一个简单的 Web 应用。Containerd 的强大功能和灵活性使其成为构建云原生应用和服务的理想选择。
深入 Containerd 的高级功能
镜像管理
Containerd 的镜像管理功能非常强大,支持多种存储驱动程序,能够高效地管理大量镜像的存储和检索。
-
镜像存储驱动:Containerd 支持多种存储驱动,如 overlayfs、btrfs、zfs 等,这些驱动在文件系统层面提供了镜像层的堆叠和管理。你可以通过修改
config.toml
文件中的[plugins.storage.driver]
部分来选择不同的存储驱动。 -
镜像清理:随着时间的推移,系统上可能会积累大量不再使用的镜像和快照。Containerd 提供了垃圾回收(GC)机制来自动清理这些不再需要的资源。你可以通过运行
ctr garbage-collect
命令来手动触发垃圾回收,或者配置 Containerd 定期自动执行。
网络配置
Containerd 使用 CNI(Container Network Interface)插件来管理容器的网络。通过配置 CNI 插件,你可以定义容器的网络模式、IP 地址分配策略等。
-
CNI 插件配置:CNI 插件的配置文件通常位于
/etc/cni/net.d/
目录下。你可以通过修改这些配置文件来定制容器的网络设置。 -
网络策略:除了基本的网络配置外,你还可以使用网络策略来限制容器之间的网络访问,提高系统的安全性。
存储卷和持久化存储
虽然 Containerd 本身不直接管理存储卷,但它可以与外部存储系统(如 Ceph、NFS、GlusterFS 等)集成,为容器提供持久化存储。
-
挂载存储卷:在创建容器时,你可以通过
--mount
参数将外部存储卷挂载到容器内部。这样,即使容器被删除,存储卷中的数据也会保留下来。 -
动态卷管理:对于需要动态创建和销毁存储卷的场景,你可以使用第三方工具(如 Kubernetes 的 CSI 插件)来管理存储卷的生命周期。
安全性和隔离性
Containerd 提供了多种机制来增强容器的安全性和隔离性。
-
SELinux 和 AppArmor:这些安全模块可以在 Linux 系统上提供额外的安全层。通过配置 SELinux 或 AppArmor 策略,你可以限制容器对宿主机的访问权限。
-
资源限制:Containerd 支持对容器的 CPU、内存、磁盘 I/O 等资源进行限制,以防止单个容器占用过多资源而影响其他容器的运行。
-
命名空间隔离:Containerd 使用 Linux 命名空间(如 PID、网络、IPC、UTS、用户命名空间等)来隔离容器的进程、网络和文件系统视图。
监控和日志
为了有效地监控和管理容器,Containerd 支持多种监控和日志收集工具。
-
Prometheus 集成:你可以通过 Prometheus 监控 Containerd 的性能指标,如容器创建时间、镜像拉取速度等。
-
日志收集:虽然 Containerd 本身不提供日志收集功能,但你可以使用第三方日志收集工具(如 Fluentd、Logstash、Fluent Bit 等)来收集容器的日志输出。
结合 Kubernetes 使用 Containerd
Kubernetes 是云原生应用的编排平台,而 Containerd 作为其底层的容器运行时,两者结合使用可以构建高效、可扩展的云原生应用。
-
集成方式:Kubernetes 通过 CRI(容器运行时接口)与 Containerd 交互。CRI 定义了 Kubernetes 与容器运行时之间的通信协议,使得 Kubernetes 能够管理跨多个节点的容器生命周期。
-
高级功能:当与 Kubernetes 结合使用时,Containerd 可以利用 Kubernetes 的网络插件(如 Calico、Flannel、Weave Net 等)和存储插件(如 Ceph、Rook、CSI 插件等)来提供复杂的网络配置和持久化存储解决方案。
-
运维和管理:Kubernetes 提供了丰富的运维和管理工具(如 kubectl、Dashboard、Metrics Server 等),使得运维人员可以轻松地监控、管理和扩展基于 Containerd 的容器化应用。
k8s使用containerd具体原因
Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI),
比如 containerd,CRI- O,通过容器运行时来完成容器的创建、运行、销毁等实际工作,
Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 docker(在 k8s1.24 版本之前用,1.24 开始废弃了)、containerd, CRI-O 等多种容器运行时,这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行。
如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker, 再通过 Dockerd 去调用containerd。
如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。
使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。
调用链
Docker 作为 k8s 容器运行时,调用关系如下:
kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd Containerd 作为 k8s 容器运行时,调用关系如下:
kubelet --> cri plugin(在 containerd 进程中) --> containerd
总结
Containerd 作为云原生计算的核心组件之一,提供了高性能、可扩展的容器运行时解决方案。通过本文的介绍,你应该已经对 Containerd 的安装、配置、常用命令以及高级功能有了深入的了解。无论是单独使用还是与 Kubernetes 结合使用,Containerd 都能够为你提供强大而灵活的容器管理能力。随着云原生技术的不断发展,Containerd 的功能和性能也将持续提升,为构建更加高效、可靠、安全的云原生应用奠定坚实的基础。