背景
Kubernetes在v1.20提出Dockershim Removal Kubernetes Enhancement Proposal
kep就有计划将dockershim模块从kubelet中移除,经过几个版本的迭代,在kubernetes 1.24发布的时候彻底移除掉dockershim。 dockershim 模块存在于kubernetes的kubelet中,kubelet通过dockershim来对接docker创建容器。其中的关系图一所示
其工作流为当pod调度到某个节点,该节点的kubelet list-watch到了pod,则会触发pod创建的过程,pod创建的时候会通过CRI来调用dockershim的方法,之后dockershim调用docker提供的api,完成相关容器的创建命令的下发。之后docker通过调用containerd完成最终container的创建任务。
为了更好的推动kubenretes以及CRI的发展,kubernetes提出了移除dockershim的kep。主要是基于以下几点考虑:
历史包袱:早期kubernetes版本,只支持docker engine一种特定的container runtime, docker engine本身并没有支持CRI接口规范,所以kubernetes project中包含了特定的代码来做这种转化,使得dockershim代码变成了kubernetes一部分。
CRI规范推进以及kubernetes自身的发展:随着kubernetes发展,维护dockershim模块变成了一种巨大的负担。未来随着newer CRI runtime中将会引入以及cgroups v2以及user namespaces等新特性的支持,涉及到大量dockershim的兼容工作要做,移除dockershim对于未来推动CRI发展至关重要。
解决方案
Completely remove in-tree dockershim from kubelet by dims · Pull R