先举一个例子

开天辟地时,天地间就有了一宝贝:金士顿移动硬盘。

又过了几万年之后,天地间产生了一个新的产品叫做笔记本电脑,但是这个笔记本却缺少存储设备。然后这个笔记本一看,诶?世界上还有这样的一款外接设备叫做移动硬盘,这个笔记本电脑上就自带一根线头连接着这个金士顿硬盘,如下图。
在这里插入图片描述
后来又过了很多年,又产生了一些其他品牌的移动硬盘比如闪迪和西数,他们也想让这个笔记本使用他们作为外接设备,当然这个笔记本留了更多的线头连接各种移动硬盘来满足了他们,如下图。
在这里插入图片描述

这样笔记本上就裸露出很多的线头以连接了不同品牌的移动硬盘。但是笔记本一看,这样不行啊,我都变成“大蜈蚣”了,咋有那么多线头呢,真丑啊,这个不行,绝对不行。
于是呢,这个笔记本就开发出了一个接口叫做USB接口,然后跟这些移动硬盘说:“同志们,我这开发了一个接口,叫做USB,你们呢要想连接到我这台电脑上作为外接设备,你们就遵从这个USB标准就可以了,如果你们自身接口不满足USB标准的话,你们就造一个满足USB标准的转接头。”
在这里插入图片描述
所以呢,除了金士顿之外其他的移动硬盘要不带有USB接口,要不就用一个带有USB接口的数据线来连接到笔记本。
但是这个金士顿移动硬盘偏不,他说我没这个接口,也研究不出来。那咋办呢,没办法,因为这个金士顿太强大了,所以笔记本上仍然留了一个线头连接着金士顿移动硬盘。

又多了很久,这个笔记本发展的已经很强大了,而且也已经有了很多其他牌子的移动硬盘可用,没必要非金士顿不可了,所以这个笔记本就开始把连接金士顿的那个线头给切掉了。
在这里插入图片描述

这下完了,金士顿硬盘没法连接到笔记本上了,用不了了。

同理去理解CRI

在k8s刚出来的时候,除了docker之外并没有几个runtime(运行时,就是管理容器的东西),所以呢在k8s里就内置了代码来适配docker,如下图。
在这里插入图片描述

后来除了docker之外又有了其他的runtime,比如rkt。然后呢在kubernetes代码里也内置了代码来适配rkt。
在这里插入图片描述

后来又有了越来越多的runtime,比如cri-o、containerd等,他们也想集成到kubernetes里让kubernetes以他们作为runtime。
在这里插入图片描述

这样一来,kubernetes发现,这样不行啊,这样没完没了的,我这代码太臃肿了不好维护。干脆我就开发一个叫做CRI(容器运行时接口)的标准,并对这些运行时说:“你们也别都想着让把你们整合到我的代码里了,我这开发了一个接口叫做CRI,你们这些runtime只要符合CRI标准就能连接到我了。当然了,如果你们不符合CRI标准的话,你们自己就弄一个转接口转接一下就行了。这个转接口就称之为shim(垫片)吧”。
然后呢有些runtime就开发了符合CRI标准的转接线就是一个shim,叫做CRI-shim。当然有些runtime本身就符合CRI接口了,那么这个runtime就是CRI-shim。
在这里插入图片描述
但是呢docker说,我没有CRI接口也开发不出来符合CRI接口的shim。那咋办呢?没办法,因为docker太强大了,所以kubernetes(其实是kubelet)里仍然内置了连接docker的代码叫做(dockershim)。

除了dockershim是内置的,其他的shim一律称之为remote。所以在使用除docker之外的runtime,kubelet都会有一个选项叫做KUBELET_EXTRA_ARGS=–container-runtime=remote。

又过了几年,这时kubernetes已经足够强大了,而且也有了很多其他runtime可选,也不是非docker不可了,所以他必须要一视同仁,所以呢从kubernetes 1.24版本里就把dockershim从kubernetes(其实是kubelet)的代码中移除了。
在这里插入图片描述

这下完了,docker不能再作为kubernetes的runtime了。如果要非想让docker作为kubernetes的runtime的话,那么就必须要找一个符合CRI标准的转接口了,这个就是cri-docker,他是一个符合CRI标准的shim(转接口),他可以作为一个转接口连接kubernetes和docker。
在这里插入图片描述

当然了,这也不能说docker不行了,docker仍然是非常有用的,比如构建镜像、搭建仓库等。

Logo

开源、云原生的融合云平台

更多推荐