1.Containerd容器运行时初识与尝试腾讯云开发者社区

描述:目前Docker是Kubernetes默认的容器运行时(ContainerRuntime),由于k8s在2020年宣布1.20版本之后将弃用dockershim(其中也有kubernetes与Docker爱恨情仇)时,才把containerd拉回大众的视野之中,所以本章主要讲解containerd基础入门。

Q:什么是Containerd

答:Containerd是从Docker中分类出的容器运行时与runc一样被分解为Docke的高级运行时部分,它支持OCI的镜像标准、可以实现拉取和推送镜像、管理操作镜像负责容器的整个生命周期。例如当它需要运行一个容器时,它会将映像解压到一个OCI运行时包中,并将其发送给runc来运行它,Containerd还提供了一个API和客户端应用程序可以用来与之交互,containerd命令行客户端是ctr命令。官方介绍:Anindustry-standardcontainerruntimewithanemphasisonsimplicity,robustnessandportability-业界标准的容器运行时,强调简单性、健壮性和可移植性。

Q:Containerd有何特点

发展历史:(Containerd和Docker的前世今生以及爱恨情仇)

在几年之前Docker公司在容器技术领域强势崛起一家独大,Google、RedHat这样的巨头们都产生了很大的危机感,因此他们想与Docker公司一起联合研发推进一个开源的容器运行时作为Docker技术的核心依赖。然鹅Docker公司很高冷的表示:我不干!巨头们听到这个反馈就很不爽啊,因此通过一些手段对Docker公司软硬兼施,使其将libcontainer捐给了开源社区,也就是现在的runc,一个lowlevel的容器运行时。此外巨头们又成立了CNCF去对抗Docker公司的一家独大,CNCF成立的思路很明确:在容器领域干不过Docker,那就搞容器上层的建设——容器编排,从此K8s诞生了。虽然Docker公司也尝试使用Swarm去对抗K8s但最终也失败了。

自此K8s慢慢成为云原生领域的标配,其生态也越做越大、越做越完善。Docker公司为了融入生态,开源了Docker的核心依赖containerd。2019年2月28日containerd正式成为云原生计算基金会(CloudNativeComputingFoundation-CNCF)的一个毕业项目,紧随Kubernetes、Prometheus、Envoy和CoreDNS之后,在从containerd1.5开始,Kubernetes容器运行时接口(CRI)的containerd插件已经合并到containerd中。。

此外K8s为了对接下一层的容器,也因为其中立性搞了一个运行时接口,也就是CRI(ContainerRuntimeInterface),runc、containerd等运行时都去支持此接口。由于当时确实没有啥highlevel的runtime,oci-o虽然支持CRI接口,但其功能太弱;containerd也尚未成熟,而且其当时的定位是嵌入到系统中,并非给终端用户使用;rkt有自己的一套体系后来这个项目也失败了。只能暂时为了适配Docker搞了个shim,将CRI转换为DockerAPI。K8s和Docker进入了冷静期,双方都在各自优化自己,互不干扰。然而平静之下仍是暗潮汹涌,CNCF社区一直在不断完善containerd,其定位也发生了改变,由原来的系统嵌入组件,变成了今天的"工业标准容器运行时",并提供给终端用户使用。直到2020年12月K8s宣布废弃使用Docker,而改用Containerd。

总结:其实kubernetes宣布废弃dockershim,一方面是因为商业因素,而另一方面K8s已经提供了标准接口对接底层容器运行时,不再想单独维护一个类似于Dockershim的适配层去迎合不同的运行时。

Q:那什么是dockershim

正因为这样,只要Kubernetes的任何变动或者Docker的任何变动,都必须维护dockershim,这样才能保证足够的支持,但是通过dockershim操作Docker,其本质还是操作Docker的底层运行时Containerd,而且Containerd自身也是支持CRI(ContainerRuntimeInterface)交互,所以正如前面所说只是kubernetes不想单独维护一个类似于Dockershim的适配层去迎合不同的运行时。

Tips:在github存储库中的containerd基本项目级信息:

OCI

Docker公司与CoreOS和Google共同创建了OCI(OpenContainerInitial)并提供了两种规范:

Tips:文件系统束(filesystembundle):定义了一种将容器编码为文件系统束的格式,即以某种方式组织的一组文件,并包含所有符合要求的运行时对其执行所有标准操作的必要数据和元数据,即config.json与根文件系统。

Tips:CRI(ContainerRuntimeInterface,容器运行时接口):它是为了解决这些容器运行时和Kubernetes的集成问题在Kubernetes1.5版本中推出。

Docker、Google等开源了用于运行容器的工具和库runC作为OCI的一种实现参考,随后各种运行时和库也慢慢出现例如rkt、containerd(今天的主角)、cri-o,然而这些工具所拥有的功能却不尽相同,有的只有运行容器(runc、lxc),而有的除此之外也可以对镜像进行管理(containerd、cri-o),按照前面容器运行时进行分为两类,其不同容器运行时工具分类关系图如下。

Runtime

CRI

描述:CRI是Kubernetes定义的一组gRPC服务。Kubelet作为客户端,基于gRPC框架,通过Socket和容器运行时通信。它包括两类服务:镜像服务(ImageService)和运行时服务(RuntimeService)。镜像服务提供下载、检查和删除镜像的远程程序调用。运行时服务包含用于管理容器生命周期,以及与容器交互的调用(exec/attach/port-forward)的远程程序调用。

客户端工具

描述:containerd是Linux和Windows的守护程序。它管理其主机系统的完整容器生命周期,从图像传输和存储到容器执行和监督,再到低级存储到网络附件等等。

Containerd的设计是一个大的插件系统,下图中每一个虚线框其实就对应一个插件。

我们可以将上面的架构图简化如下,简化后的Containerd分为三大块Storage管理镜像文件的存储;Metadata管理镜像和容器的元数据;由Task触发运行时,并对外提供GRPC方式的API以及Metrics接口。

containerd-shim

描述:主要是用于剥离containerd守护进程与容器进程。目前已有shimv1和shimv2两个版本;它是containerd中的一个组件,其通过shim调用runc的包函数来启动容器。直白的说引入shim是允许runc在创建和运行容器之后退出,并将shim作为容器的父进程,而不是containerd作为父进程。

#-当我们执行pstree命令时可以看到如下的进程关系containerd-shim是独立于containerd进程运行的。pstreesystemd─┬─VGAuthService├─containerd───15*[{containerd}]├─containerd-shim─┬─sh│└─13*[{containerd-shim}]├─2*[containerd-shim─┬─sh]│└─12*[{containerd-shim}]]此种方式的目的是当containerd进程挂掉时保证容器不受影响,此外shim也可以收集和报告容器的退出状态,不需要containerd来wait容器进程。

Tips:我们有需求去替换runc运行时工具库时,例如替换为安全容器katacontainer或Google研发的gViser,则需要增加对应的shim(kata-shim)以上两者均有自己实现的shim。

CRI&OCI

如下图所示dockershim,containerd和cri-o都是遵循CRI的容器运行时,我们称他们为高层级运行时(High-levelRuntime)。

ContainerdvsCri-o

描述:前面我们说到过kubernetes为啥会替换掉Docker呢主要原因就是其复杂性,由于Docker的多层封装和调用,导致其在可维护性上略逊一筹,增加了线上问题的定位难度(貌似除了重启Docker,我们就毫无他法了);

-

Containerd

CRI-O

备注

性能

更优

功能

CRI与OCI兼容

稳定性

稳定

未知

DeviceMappervs.Overlayfs

描述:容器运行时使用存储驱动程序(storagedriver)来管理镜像和容器的数据。目前我们生产环境选用的是DeviceMapper。然而目前DeviceMapper在新版本的Docker中已经被弃用,containerd也放弃对DeviceMapper的支持。

当初选用DeviceMapper,也是有历史原因的。我们大概是在2014年开始Kubernetes这个项目的。那时候Overlayfs都还没合进kernel。当时我们评估了Docker支持的存储驱动程序,发现DeviceMapper是最稳定的。所以我们选用了DeviceMapper。但是实际使用下来,由DeviceMapper引起的Docker问题也不少。所以我们也借这个契机把DeviceMapper给换掉,换成现在containerd和Docker都默认的Overlayfs。

从下图的测试结果来看,Overlayfs的IO性能比DeviceMapper好很多。Overlayfs的IOPS大体上能比DeviceMapper高20%,和直接操作主机路径差不多。最终,我们选用了containerd,并以Overlayfs作为存储后端的文件系统,替换了原有的Docker加DeviceMapper的搭配。

我们在同一个节点上同时起10,30,50和80的Pod,然后再同时删除,去比较迁移前后创建和删除的用时。从下图可知,containerd用时明显优于Docker。

安装环境:已进行安全基线加固以及系统优化。

Tips:containerd默认的三个名称空间(Namespace)是default,docker.io,k8s.io

项目说明:

操作流程:

描述:在Docker我们常常需要将配置文件或者各类数据映射进入到docker容器之中,便于容器内部程序使用或者数据的持久化。

下面分别简单演示与宿主机或者其它容器共享目录;

ctr-nk8s.ioccreatedocker.io/library/busybox:latestbusybox-2--mounttype=bind,src=/tmp,dst=/host,options=rbind:rwctr-nk8s.iotstart-dbusybox-2shctr-nk8s.iotexec-t--exec-id$RANDOMbusybox-2sh#/#echo"WeiyiGeek">/host/name#/#root@containerd:~#cat/tmp/nameWeiyiGeek首先我们对docker的ns共享进行实验:

[root@dockerscripts]#dockerrun--rm-it-dbusyboxsh687c80243ee15e0a2171027260e249400feeeee2607f88d1f029cc270402cdd1[root@dockerscripts]#dockerrun--rm-it-d--pid="container:687c80243ee15e0a2171027260e249400feeeee2607f88d1f029cc270402cdd1"busyboxcatfa2.....d2[root@dockerscripts]#dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESfa2c09bd9c04busybox"cat"2secondsagoUp1secondpedantic_goodall687c80243ee1busybox"sh"22secondsagoUp21secondshopeful_franklin[root@dockerscripts]#dockerexec-it687c80243ee1sh/#psauxPIDUSERTIMECOMMAND1root0:00sh8root0:00cat15root0:00sh然后基于containerd的方式实现pidns共享:

$ctr-nk8s.iotls#TASKPIDSTATUS#busybox43908RUNNING#busybox-148850RUNNING#这里的48850即为已有task运行时的pid号#busybox-250314RUNNING$ctr-nk8s.ioccreate--with-ns"pid:/proc/48850/ns/pid"v4ehxdz8.mirror.aliyuncs.com/library/python:3.6-slimpython#将容器中运行的进程共享注入到48850pid之中$ctr-nk8s.iotstart-dpythonpython#启动了一个python的命令$ctr-nk8s.iotexec-t--exec-id$RANDOMbusybox-1sh#至此可以在busybox-1容器中看见刚执行的python命令/#psauxPIDUSERTIMECOMMAND1root0:00sh34root0:00python34.Docker与Containerd并用配置描述:为了更方便我们学习可以将Docker与Containerd联合使用。

功能说明

ContainerdCLI

DockerCLI

CrictlCLI

镜像列举

ctrimagels/list

dockerimagesls

crictlimagesls

导出镜像

ctrimageexportapp.tarweiyigeek.top/app:1.2.0

dockersave-oapp.tarapp:1.2.0

导入镜像

ctrimageimportapp.tar

dockerload-iapp.tar

拉取镜像

ctr-nk8s.ioimagespulldocker.io/library/redis:latest

dockerpullredis:latest

crictlpullredis:latest

上传镜像

ctr-nk8s.ioimagespushdocker.io/library/redis:latest

dockerpush

crictlpush

更改标记

ctr-nk8s.ioimagestagdocker.io/library/redis:latestweiyigeek.top/redis:latest

dockertagredis:latestweiyigeek.top/redis:latest

删除镜像

ctr-nk8s.ioimagesrmdocker.io/library/redis:latest

dockerrmi

crictlrmi

创建容器

ctr-nk8s.iocontainercreatedocker.io/library/redis:latestredis

dockercreate

crictlcreate

创建并运行容器

ctrrun-d--envname=WeiyiGeekapplicationweiyigeek.top/app:1.2.0

dockerrun

查看容器

ctr-nk8s.iocontainerlist

dockerps

crictlps

启动容器

ctr-nk8s.iotaskstart

dockerstart

crictlstart

停止容器

ctr-nk8s.iotaskpause

dockerstop

crictlstop

删除容器

ctr-nk8s.iocontainerrm

dockerrm

crictlrm

容器详情

ctr-nk8s.iocinfo39d36ef08456

dockerinspect39d36ef08456

crictlinspect39d36ef08456

容器连接

ctr-nk8s.iotaskattach

dockerattach

crictlattach

进入容器

ctr-nk8s.iotaskexec

dockerexec

crictlexec

stats(状态)

ctr-nk8s.iotaskmetric39d36ef08456

dockertop

crictlstats

日志查看

ctr-nk8s.ioevent

dockerlogs--tail508db74c2bf7595

crictllogs--tail508db74c2bf7595

描述:它是一个不受支持的调试和管理客户端,用于与容器守护进程进行交互。因为它不受支持,所以命令、选项和操作不能保证向后兼容或稳定从集装箱项目的发布到发布。

语法参数:

Tips:当导入本地镜像时ctr不支持压缩。

Tips:通过ctrcontainerscreate创建容器后,只是一个静态的容器,容器中的用户进程并没有启动,所以还需要通过ctrtaskstart来启动容器进程。当然也可以用ctrrun的命令直接创建并运行容器。在进入容器操作时与docker不同的是,必须在ctrtaskexec命令后指定--exec-id参数,这个id可以随便写只要唯一就行。

Tips:ctr没有stop容器的功能,只能暂停(ctrtaskpause)或者杀死(ctrtaskkill)容器

实际案例:

Tips:注意需要停止容器时需要先停止容器内的Task再删除容器。

描述:crictl是CRI兼容的容器运行时命令行对接客户端,你可以使用它来检查和调试Kubernetes节点上的容器运行时和应用程序。由于该命令是为k8s通过CRI使用containerd而开发的(主要是调试工具),其他非k8s的创建的crictl是无法看到和调试的,简单的说用ctrrun运行的容器无法使用crictl看到。

Tips:crictl默认使用命名空间k8s.io.

Tips:criplugin区别对待pod和container

基础配置

描述:在k8s1.19.x之前crictl默认连接到unix:///var/run/dockershim.sock,而在1.20.x起默认采用/run/containerd/containerd.sock运行时,当然除此之外还是支持cri-o运行时。

#crictlbydefaultconnectsonUnixto:unix:///var/run/dockershim.sockorunix:///run/containerd/containerd.sockorunix:///run/crio/crio.sock#oronWindowsto:npipe:////./pipe/dockershimornpipe:////./pipe/containerdornpipe:////./pipe/crio#Forotherruntimes,use:frakti:unix:///var/run/frakti.sock查看或编辑/etc/crictl.yaml的内容

$cat/etc/crictl.yamlruntime-endpoint:/run/containerd/containerd.sockimage-endpoint:"/run/containerd/containerd.sock"timeout:0debug:falsepull-image-on-create:falseTips:除了上面的设置端点外,我们还可以利用其它方式进行临时设置或者指定配置文件。

#1.通过在配置文件中设置端点并通过--config参数指定配置文件crictl--config=/etc/crictl-demo.yaml#2.通过设置参数--runtime-endpoint和--image-endpointcrictl--runtime-endpoint="/run/containerd/containerd.sock"--image-endpoint="/run/containerd/containerd.sock"基础语法:

Tips:用crictl创建容器对容器运行时排错很有帮助。在运行的Kubernetes集群中,沙盒会随机的被kubelet停止和删除,下面通过实例进行演示crictl使用。

THE END
1.ID.4CROZZ配置大众ID.4CROZZ参数配置怎么样配置表共 4 款车 只看差异 ID.4 CROZZ 2024款 纯享限量版 指导价:19.39万 + 对比 ID.4 CROZZ 2024款 改款 PURE+版 指导价:23.99万 + 对比 ID.4 CROZZ 2024款 改款 PRO版 指导价:25.79万 + 对比 ID.4 CROZZ 2024款 改款 PRIME版 指导价:29.39万 + 对比 基本参数 ● 标配○ 选配-无 落地价https://m.pcauto.com.cn/auto/sg25600/config.html
2.ID.4CROZZ参数配置大众ID.4CROZZ参配搜狐汽车ID.4 CROZZ参数配置频道为您提供最全的ID.4 CROZZ参配信息,包括ID.4 CROZZ报价,动力,以及操控、内饰、安全装备、发动机等。查看ID.4 CROZZ参数配置表详细介绍,就上搜狐汽车!https://db.auto.sohu.com/model_6352/config
3.ID.4X配置参数上汽大众ID.4X参数配置详解智车派汽车大全频道为您提供上汽大众ID.4 X配置参数详解,包括了ID.4 X基本参数、发动机配置以及ID.4 X内部配置参数等精准信息,更多ID.4 X配置参数尽在智车派。https://m.zhichepai.com/auto/7553/peizhi
4.2024款大众ID.4CROZZ纯享限量版参数配置详细参数信息58汽车2024款 大众ID.4 CROZZ 纯享限量版车型参数配置为您提供2024款 大众ID.4 CROZZ 纯享限量版参数和配置信息,明确标明标配和选装配置和基本参数,为您买车提供参数。https://product.58che.com/273/272481/param.shtml
5.图ID.4X报价图片ID.4X怎么样大众汽车消费网ID.4 X频道提供大众ID.4 X报价、图片、论坛、参数配置、评测,ID.4 X油耗、优惠、保养等,详解ID.4 X怎么样,就在汽车消费网!http://auto.315che.com/dazhongid6208/
6.上汽大众ID.4X上汽大众ID.4X_汽车使用手册用户操作图示图解详解驾驶指南车主车辆说明书电子版.pdf,ID.4 X 使用维护说明书 使用维护说明书 ID.4 X 版本编号:11D00102 121 出版日期:02.2021 扫码关注 文档编号:KBA11D00120 了解更多信息 本说明书适用于下列表中各种型号的上汽大众ID.4 https://max.book118.com/html/2022/0714/5340240334004304.shtm
7.ID.4X上汽大众ID.4X参数配置表ID.4X发动机配置上汽大众ID.4 X配置,中华网汽车提供上汽大众ID.4 X配置参数表,包括,ID.4 X发动机,ID.4 X变速箱,ID.4 X车轮,ID.4 X灯光等配置等参数https://auto.china.com/2195/config
8.“大众ID4”车辆配置及参数详细说明,外观及内饰细节展示。“大众ID4”车辆配置及参数详细说明,外观及内饰细节展示。 发布于2022.10.12 10:08 次播放 洪宸说车 关注3人2.5万粉丝 关注 评论·1 提交评论 小新精品二手好物 支持友友 2022-10-12回复举报0人 点赞 暂无更多评论 热门视频 推荐:夺嫡为皇之开创新纪元人在异世,开局召唤黑人抬棺玲珑欣逸的第4本书宇宙霸主https://www.dongchedi.com/video/7153442064884531748
9.ID.4X(4X)大众ID.4X报价及图片怎么样ID.4 X全部车款 在产 停产 车款 关注度 指导价 全国最低报价 其它 纯电动 170马力 2023款 纯净智享版 后置后驱 1挡 19.5888万 19.59万询底价 参数图片相邻车款差异对比 2022款 纯净智享版新能源车 纯电后置后驱 电动车单速变速箱 18.9288万 18.93万询底价 https://product.auto.163.com/series/19936.html
10.ID.4CROZZ一汽大众ID.4CROZZ参数图片投诉口碑【1289849】2021款 长续航PRO 两驱版一汽大众ID.4 CROZZ车门故障 厂家和4S店推诿2024-11-29 更多>> 用户口碑 挺好的代步车 大众ID.4 CROZZ 2024款 PRO 综合评价:4.0分 优点 其实我买这个车,多半就是冲着大众的这个品牌,比较踏实可靠,毕竟是国际大厂,很放心。空间比较宽敞,乘坐舒适性很好,动力调的也不那么激https://www.12365auto.com/series/2985/index.shtml
11.上汽大众官网ID.4X聪明款(ID4)焕新升级ID4报价ID.4 X 聪明款 14.99万元起(含ID.豆抵扣) 预约品鉴 车辆配置 智享生活 科大讯飞语音交互系统加持—噪音环境识别率达 90%+,指令响应速度提升28%,你的需求,精准秒答 智能语音助手 丰富生态应用 V Mate智能助手 8种场景模式 智能手表控车 畅享潮流 个性轮廓搭配贯穿式点亮灯效,极具辨识度,配合全天候自适应矩阵式https://m.svw-volkswagen.com/id4x/
12.大众ID.4X极智长续航版后驱纯电动最新报价2022款图片参数上汽大众新增一款ID.4 X极智长续航版车型,售价241288元。新车在智享长续航版车型基础上,增加了360°全景影像功能,其它配置一致。 基本信息 款式名称 大众ID.4 X极智长续航版后驱纯电动 出厂时间 2022 车型年款 202203 排放标准 车身参数 车体形式 两厢 长/宽/高(mm) 4612/1852/1640 前/后轮距(mmhttps://www.iautos.cn/chexing/trim.asp?id=347236
13.大众ID.4路试谍照曝光最大续航500公里[车友头条-车友号-汽车简报] 日前,海外媒体曝光了一组大众全新新能源SUV——ID.( 参数)4路试谍照。该车定位纯电动SUV,最大续航里程可达500公里。据悉,该车有望在6月份底特律车展正式亮相,国产版车型将由一汽大众和上汽大众两家合资公司共同生产。 该车基于MEB平台打造,谍照采用了套壳测试,因此并不具备太多的参考价https://m.maiche.com/mip/news/detail/2017506.html
14.一汽ID.4 CROZZ 驾趣安全纯电SUV 探索详情 立即预定 ID.纯享限量版 驾趣安全纯电SUV 探索详情 立即预定 ID.7 VIZZION 安全智享新旗舰 探索详情 立即预定 ID.家族 推荐专区 为您的选择提供更多可能 推荐专区 个性定制 ID.6 CROZZ 七座安全纯电SUV 探索详情 https://id.faw-vw.com/
15.弗泽斯适用于大众id4x/id4crozz车身饰条装饰改装亮条专用配件门商品参数 服务承诺 京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和运费政策,请您http://item.m.jd.com/product/10089599226523.html