0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

K8s集群中Containerd和Docker的对比

马哥Linux运维 ? 来源:博客园夜夜漫笔 ? 2025-03-12 14:31 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前景提要

Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。

为了防止docker一家独大,docker当年的实现被拆分出了几个标准化的模块,标准化的目的是模块是可被其他实现替换的,不由任何一个厂商控制。

docker由 docker-client ,dockerd,containerd,docker-shim,runc组成,所以containerd是docker的基础组件之一,docker 对容器的管理和操作基本都是通过 containerd 完成的。那么,containerd 是什么呢?

Containerd 是一个工业级标准的容器运行时(Container Runtime Interface),它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。详细点说,Containerd 负责干下面这些事情:

管理容器的生命周期(从创建容器到销毁容器)

拉取/推送容器镜像

存储管理(管理镜像及容器数据的存储)

调用 runC 运行容器(与 runC 等容器运行时交互)

管理容器网络接口及网络

8c5b818a-fceb-11ef-9310-92fbcf53809c.png

从k8s的角度看,可以选择 containerd 或 docker 作为运行时组件:Containerd 调用链更短,组件更少,更稳定,占用节点资源更少调用链

containerd 跟 docker 调用关系

8c779db6-fceb-11ef-9310-92fbcf53809c.png

8c8832fc-fceb-11ef-9310-92fbcf53809c.png

配置参数区别

日志配置

对比项 docker containerd
储路径 docker作为k8s容器运行时的情况下,容器日志的落盘由docker来完成,
保存在类似/var/lib/docker/containers/CONTAINERID目录下。
kubelet会在/var/log/pods和/var/log/containers下面建立软链接,
指向/var/lib/docker/containers/CONTAINERID目录下。
kubelet会在/var/log/pods和/var/log/containers下面建立软链接,
指向/var/lib/docker/containers/CONTAINERID目录下的容器日志文件
containerd作为k8s容器运行时的情况下, 容器日志的落盘由kubelet来完成,保存到/var/log/pods/$CONTAINER_NAME目录下,同时在/var/log/containers目录下创建软链接,指向日志文件
配置参数 在docker配置文件中指定:"log-driver": "json-file", "log-opts": {"max-size": "100m","max-file": "5"} 方法一:在kubelet参数中指定:--container-log-max-files=5 --container-log-max-size="100Mi" 方法二:在KubeletConfiguration中指定:"containerLogMaxSize": "100Mi","containerLogMaxFiles": 5,
把容器日志保存到数据盘 把数据盘挂载到"data-root"(缺省是/var/lib/docker)即可 创建一个软链接/var/log/pods指向数据盘挂载点下的某个目录在TKE中选择"将容器和镜像存储在数据盘",会自动创建软链接/var/log/pods

stream server
kubectl exec/logs等命令需要在apiserver跟容器运行时之间建立流转发通道。
docker API本身提供stream服务,kubelet内部的docker-shim会通过docker API做流转发。
containerd的stream服务需要单独配置:

[plugins.cri]

stream_server_address="127.0.0.1"

stream_server_port="0"

enable_tls_streaming=false

在k8s 1.11之前,kubelet并不会做stream proxy, 只会做redirect。也就是把containerd暴露的stream server地址告诉apiserver, 让apiserver直接来访问containerd的stream server。这种情况下,需要给stream server使能tle认证来做安全防护。

从k8s1.11引入了kubelet stream proxy (https://github.com/kubernetes/kubernetes/pull/64006), 从而使得containerd stream server只需要监听本地地址即可。

CNI网络

对比项 docker containerd
谁负责调用CNI kubelet内部的docker-shim containerd内置的cri-plugin(containerd 1.1以后)
如何配置CNI kubelet参数 --cni-bin-dir 和 --cni-conf-dir containerd配置文件(toml):plugins.cri.cni bin_dir = "/opt/cni/bin" conf_dir = "/etc/cni/net.d"

命令对比

containerd不支持docker API和docker CLI, 但是可以通过cri-tool实现类似的功能。

镜像相关功能 docker containerd
显示本地镜像列表 docker images crictl images
下载镜像 docker pull crictl pull
上传镜像 docker push
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect crictl inspecti
容器相关功能 docker containerd
显示容器列表 docker ps crictl ps
创建容器 docker create crictl create
启动容器 docker start crictl start
停止容器 docker stop crictl stop
删除容器 docker rm crictl rm
查看容器详情 docker inspect crictl inspect
attach docker attach crictl attach
exec docker exec crictl exec
logs docker logs crictl logs
stats docker stats crictl stats
POD相关功能 docker containerd
显示POD列表 crictl pods
查看POD详情 crictl inspectp
运行POD crictl runp
停止POD crictl stopp

拓展阅读

接下来就是crictl的的常见命令,其中能完全替代docker命令的参照下列表格

8c980006-fceb-11ef-9310-92fbcf53809c.png

crictl对容器生命周期的管理基本已经覆盖,不过在crictl我们不能完成操作也比较多,比如对镜像的管理就不属于它的管理范围。这部分还得依靠ctr来实现,操作方式同样可以参照下表

8cbe8154-fceb-11ef-9310-92fbcf53809c.png

需注意的是,由于Containerd也有namespaces的概念,对于上层编排系统的支持,主要区分了3个命名空间分别是k8s.io、moby和default,以上我们用crictl操作的均在k8s.io命名空间完成如查看镜像列表就需要加上-n参数

ctr -n k8s.io images list

8cd08462-fceb-11ef-9310-92fbcf53809c.png

链接:https://www.cnblogs.com/xiexun/p/18268677

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1423

    浏览量

    41663
  • Linux
    +关注

    关注

    88

    文章

    11536

    浏览量

    214924
  • 容器
    +关注

    关注

    0

    文章

    516

    浏览量

    22556
  • Docker
    +关注

    关注

    0

    文章

    520

    浏览量

    13128

原文标题:Containerd vs Docker:谁才是K8s集群的最佳容器运行时

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是 K8S,如何使用 K8S

    连续性。 适用场景: 大规模容器集群管理。 微服务架构的部署与运维。 需要弹性伸缩的在线服务。 多租户环境(如开发测试、生产环境隔离)。 总的来说,K8S 通过标准化容器管理,极大降低了分布式系统的运维复杂度,是云原生时代的核心基础设施。
    发表于 06-25 06:45

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    查看原文:http://click.aliyun.com/m/42852/背景众所周知,Docker很火,DockerKubernetes(简称k8s)最火。相对物理机、VM,
    发表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    查看原文:http://click.aliyun.com/m/42852/背景众所周知,Docker很火,DockerKubernetes(简称k8s)最火。相对物理机、VM,
    发表于 02-28 12:50

    k8s容器运行时演进历史

    docker/k8s时代,经常听到CRI, OCI,containerd和各种shim等名词,看完本篇博文,您会有个彻底的理解。 典型的K8S Runtime架构 从最常见的
    的头像 发表于 02-02 13:50 ?2234次阅读
    <b class='flag-5'>k8s</b>容器运行时演进历史

    Docker不香吗为什么还要用K8s

    Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。 这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营
    的头像 发表于 06-02 11:56 ?3751次阅读

    简单说明k8sDocker之间的关系

    这篇文章主要介绍了k8sDocker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到kubernetes(以下简称k8sk
    的头像 发表于 06-24 15:48 ?3799次阅读

    K8S集群服务访问失败怎么办 K8S故障处理集锦

    问题1:K8S集群服务访问失败? ? ? 原因分析:证书不能被识别,其原因为:自定义证书,过期等。 解决方法:更新证书即可。 问题2:K8S集群服务访问失败? curl: (7) Fa
    的头像 发表于 09-01 11:11 ?1.6w次阅读
    <b class='flag-5'>K8S</b><b class='flag-5'>集群</b>服务访问失败怎么办 <b class='flag-5'>K8S</b>故障处理集锦

    k8s集群环境工作有多快

    命令就会很低效。 今天介绍3个工具会让你在多k8s集群环境工作的很轻松。我将从以下几个方面来评估工具实用性: 速度 如果你有多个k8s集群
    的头像 发表于 05-29 14:28 ?840次阅读
    多<b class='flag-5'>k8s</b><b class='flag-5'>集群</b>环境<b class='flag-5'>中</b>工作有多快

    k8s是什么意思?kubeadm部署k8s集群k8s部署)|PetaExpres

    ),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 在Kubernetes,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。 kubernetes(
    发表于 07-19 13:14 ?1362次阅读

    K8s集群管理:为什么需要多集群、多集群的优势是什么

    随着K8s和云原生技术的快速发展,以及各大厂商在自己的数据中心使用K8s的API进行容器化应用编排和管理,让应用交付本身变得越来越标准化和统一化,并且实现了与底层基础设施的完全解耦,为多集群和混合云提供了一个坚实技术基础。
    发表于 09-14 10:48 ?2196次阅读
    <b class='flag-5'>K8s</b>多<b class='flag-5'>集群</b>管理:为什么需要多<b class='flag-5'>集群</b>、多<b class='flag-5'>集群</b>的优势是什么

    k8s云原生开发要求

    IO性能。网络要求稳定,建议使用私有网络VPC,并配置与Kubernetes兼容的网络插件。操作系统需与K8s版本匹配,虚拟化平台支持Docker等。此外,还需关注安全配置,如禁用Swap、调整Sysctl等,以及etcd数据存储后端的配置。合理配置硬件可确保
    的头像 发表于 10-24 10:03 ?690次阅读
    <b class='flag-5'>k8s</b>云原生开发要求

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地与公有云分别建立K8s集群,并确保网络连接。接着,配置kubeconfig文件连接两集群,并安装云服务
    的头像 发表于 11-07 09:37 ?571次阅读

    k8sdocker区别对比,哪个更强?

    部署、扩展、管理和应用生命周期管理能力,可实现高可用性和自动伸缩,两者常结合使用以优化容器化和应用管理。UU云小编将对k8sdocker区别进行详细对比
    的头像 发表于 12-11 13:55 ?797次阅读

    自建K8S集群认证过期

    今天使用kubectl命令查看pod信息时,一直正常运行的k8s集群突然不能访问了,输入任何命令都提示以下报错。
    的头像 发表于 02-07 12:32 ?463次阅读

    如何通过DockerK8S集群实现高效调用GPU

    在有GPU资源的主机安装,改主机作为K8S集群的Node。
    的头像 发表于 03-18 16:50 ?547次阅读
    如何通过<b class='flag-5'>Docker</b>和<b class='flag-5'>K8S</b><b class='flag-5'>集群</b>实现高效调用GPU