来自俺自己的一句话:这是一个扩展了解,个人觉得对于理解docker,k8s关系,还有各厂之间的竞争、技术演化的理解是有帮助的。所以还是做了一篇笔记。
2014年,docker在容器领域内没有任何对手,这时候k8s刚刚诞生,虽然有google和borg的支持,但还是比较弱小的。所以k8s很自然地选择了在docker上运行,慢慢养精蓄锐壮大自己。
2016年,k8s发布了1.0版本,可以正式用于生产环境,标志着k8s已经成长起来了。此时,CNCF已经成立了一年(CNCF:全称Cloud Native Computing Foundation(云原生计算基金会),成立于2015年12月11日,是一个开源软件基金会,它致力于云原生(Cloud Native)技术的普及和可持续发展),于是K8s加入CNCF,成为了第一个CNCF托管项目,想要联合其他厂商,一起“扳倒”docker。具体k8s是这样做的:
1、准备解耦条件:2016年底发布的1.5版本中,k8s引入了新的接口标准CRI(container runtime interface),CRI规定k8s该如何调用容器运行时去管理容器和镜像,但这是一套全新接口,与docker调用完全不兼容。由于docker已经非常成熟,有着数目众多且稳定的用户群体,各大云厂商不可能立刻就把docker全部换掉。因此k8s在k8s和docker中间加入一个中间人做适配(shim),用来把docker的接口转为CRI接口,如下图所示。这样k8s和docker还可以继续兼容一段时间:
2、逼迫docker与自己解耦:眼看着k8s有和自己分道扬镳的架势,docker决定把原本单体架构的docker engine(docker的使用有两种形式,docker desktop(桌面化,可装在win系统上,一般要收费)和docker engine(实验环境,咱们都用的这个,直接跑在linux上)),拆分成多个模块,其中docker daemon(就是docker engine中真正处理事务的部分,docker engine分为docker命令客户端、docker engine、registry)捐献给了CNCF,形成了containerd。containerd作为CNCF托管项目,自然需要符合CRI标准。但docker只是在docker engine里调用了containerd,外部接口仍然保持不变,所以docker与CRI依然不兼容。
于是,k8s就出现了两种调用链。本质都是通过containerd来管理容器的,只不过方法二明显效能更好,这对于云厂商也是有很大的诱惑力的:
- 用CRI接口调用dockershim,然后dockershim调用docker,docker再走containerd去操作容器
- 用CRI直接调用containerd操作容器
3、正式弃用docker:有了CRI和containerd,加上效能的对比,k8s基本已经稳操胜券了。但由于docker拥有庞大的用户群体,大家普遍会担心适配性以及镜像迁移的问题,所以接受度还是比较差。实际上,k8s只是弃用了dockershim,也就是无法直接支持让docker去调用containerd了,而是直接操作containerd,所以对于容器的运行,本质上没有任何变化。即只是弃用了上面第一种调用链。唯一的影响,就是不能通过docker ps这些docker的客户端命令来操作容器了,但如果你一直都用kubectl来操作,其实对使用者来说,毫无变化。至此,所有的准备工作和对用户的心理安慰都做完了,k8s在1.24版本,直接把dockershim代码删除了,和docker彻底分道扬镳了。
其他的一些担心:
1、docker hub的镜像,还能用么?由于docker镜像也是遵守OCI规范(open container initiative)的,所以docker镜像依然可以在k8s使用,即可以直接拉取docker hub的镜像来使用;
2、docker是不是彻底没用了?docker是一个完整的软件产品线,不止有containerd,还有镜像构建、分发、测试等服务,甚至docker desktop还内置了k8s。用dockerfile去制作镜像也依然是制作镜像的一个很好的方式;
3、docker是不是再也不能用在k8s了?k8s删除了dockershim的代码,但是docker公司却把这段代码接管过来了,建立了一个cri-dockerd项目,就是把docker engine适配成CRI接口,这样依然可以用k8s来操作docker了。
综上,k8s已经完成了对docker的解耦,甚至说是“弃用了对docker的支持”,但是docker由于拥有众多忠实用户,以及庞大的应用镜像,所以docker依然有很强的生命力。且docker方便易用,是很成熟的容器产品,对于我们学习和理解容器化技术,也是很有帮助的。今天这节主要就是一个扩展,后面还是会继续看k8s+docker的内容啦~
标签:容器,弃用,kubernetes,chrono,containerd,CRI,镜像,docker,k8s From: https://www.cnblogs.com/1234roro/p/16892031.html