vlambda博客
学习文章列表

K8S即将弃用Docker?慌不?

长久以来,在K8S环境中,都是将docker作为K8S默认的容器运行时,docker和k8s的结合也一直挺顺手的。

然而在2020年末,Kubernetes正式发布了1.20版本,其中最重要的一个更新就是将要弃用dockershim(不是docker)

dockershim是K8S为了按照CRI协议对接docker而实现的。

这就存在2个问题:

  1. 如果没有了dockershim,K8S能继续对接docker吗? 答:不行
  2. 如果无法使用docker,有替代品吗? 答:有,但没有想象中那么简单

若想搞懂上面提的问题,就需要先了解容器运行时。

容器运行时,英文是Container Runtime,表示让容器运行起来的状态、所需的要求等等。

lxc、docker、rkt都是早期的容器运行时,架构也很简单,就是创建namespace、cgroup等,并运行指定的容器应用程序。

后来docker逐渐拆分成runc、containerd、dockerd,也使得容器运行时逐渐复杂起来,让我摸不着头脑,也使得我不得不花费大量时间进行深入学习研究。

看起来很复杂,是因为docker和k8s都有容器运行时的概念,同时又有2个协议CRI、OCI,都与容器运行时相关(除此之外还有很多)。

对Docker和K8S用户,会带来哪些影响?

对Docker使用者,例如通过docker制作镜像、调试镜像,或在无K8S环境运行的Docker,没有影响。但对K8S环境,届时将会无法使用docker。

在K8S环境中,不使用docker,可以使用containerd作为替代。

2016年,docker将containerd拆解成独立项目,2017将containerd捐献给了CNCF。随后containerd实现了CRI,可以与K8S进行结合。

我本来抱着“轻敌”的想法,觉得containerd用起来肯定和docker差不多,毕竟是从docker拆出来的,命令参数应该都差不多。

结果被事实打了脸,完全不一样,而且文档少的可怜,更无奈的是文档中还有一些错误的地方得不到及时修正。

导致我原本想直接在生产环境中使用containerd替代docker的计划,变得更加小心,也为此专门花了2个月时间来深入研究K8S容器运行时,包含containerd、kata、多容器运行时等等一系列和容器运行时相关的技术。

因为文档缺乏,有的时候不得不翻看源码来寻找一些组件之间的关联,否则难以理解为什么能这样,为什么不能那样。

关于容器运行时的15个困惑

学习过程中,我遇到15个困惑:

困惑1. K8S要弃用的是docker还是dockershim?为什么要弃用,什么时候弃用?替代品是谁?

困惑2. dockershim是什么?dockershim和docker是什么关系,和CRI又是什么关系?

困惑3. dockershim和containerd-shim都有shim字样,他们是一回事吗?

困惑4. 容器运行时是CRI还是OCI?

困惑5. 使用docker和弃用docker后的架构分别是什么样的呢?

困惑6. 弃用docker只是简单的删除docker二进制就行了吗

困惑7. 弃用docker后如何制作并上传镜像呢?

困惑8. 原来docker创建的容器、下载的镜像,containerd能继续沿用吗?

困惑9. containerd的镜像mirror、证书如何配置?

困惑10. 没有了docker,如何查看容器、查看镜像呢?

困惑11. 能用podman替代docker用于k8s环境吗?

困惑12. crictl和podman的参数很相似,可以互相替换吗?

困惑13. kata如何使用,以及能直接用于k8s环境吗?

困惑14. k8s集群可以同时运行多个容器运行时吗?

困惑15. 容器运行时有一堆命令和名词都是什么意思?互相之间什么关联?如namespacecgroupdockerdockerddockershimcontainerdcontainerd-shimcontainerd-shim-runc-v2ctrcrictlruncocicrihigh-levellow-levelcri-opodmanbuildahkatakata-runtimecontainerd-shim-kata-v2runtime-class等。

上面大部分困惑在网络上找不到答案,因为容器运行时有太多的术语、关系,错综复杂(只了解CRI是无法做好弃用Docker准备滴),没有人把这些都讲清楚,如果只掌握部分,不敢真正在生产环境中弃用docker。

为了真正理清楚K8S容器运行时,我进行了知识的梳理,并以视频形式提供了完整内容:从Docker历史出发,逐步讲解K8S容器运行时的架构,并深入CRI、OCI、containerd、kata、podman、runtimeclass(多容器运行时),涵盖了数十个术语的解析,以及实践踩坑。

课程视频已全部发布在腾讯课堂,售价仅98元。

扫码直达

课程目录