说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系

这篇具有很好参考价值的文章主要介绍了说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kubernetes v1.20版本 的 release note 里说 deprecated docker。并且在后续版本 v1.24 正式删除了 dockershim 组件,这对我们有什么影响呢?Kubernetes 1.20: The Raddest Release | Kubernetes

为了搞明白这件事情,以及理解一系列容器名词 docker, dockershim, containerd, containerd-shim, runC, CRI, OCI...。我们先捋一下 Kubernetes 与 Docker 的发展与关系。

从 Docker 说起

从 Docker 1.11 版本开始,Docker 容器运行就不是简单通过 Docker Daemon 来启动了,而是通过集成 containerd、containerd-shim、runC 等多个组件共同完成。

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系,kubernetes,docker,容器

其中 containerd 是 CRI(contianer runtime interface:标准 grpc 接口,容器管理操作标准) 的一种实现,containerd-shim 是 containerd 和 runC 之间的中间层, 而 runC 则是 OCI(开放容器标准)参考实现。

OCI 标准 (Open Container Initiative)

OCI是由 Docker、CoreOS 等组织对容器格式及运行时建立统一的行业标准。

OCI主要定义两个规范:

  • 镜像规范(image-spec)定义了镜像的主要格式及内容

  • 运行时规范(runtime-spec) 运行时规范定义镜像文件运行的管理, 而 runC 则是 目前使用最广泛的Low-Level容器运行时(runC 包含libcontainer,包括对namespace和cgroup的调用操作)。

接下去看下目前市面上最主流的3个High-Level容器运行时(High-Level包括镜像传输、镜像管理、镜像解包和 API等高级功能)

  • Containerd :CNCF孵化器的开源项目,由 Docker捐献的

  • Podman():Redhat孵化的项目,Podman 工具在RHEL8中作为完全支持的功能发布。

  • CRI-O : CNCF孵化器的开源项目

我们再继续看一下 容器运行关系:

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系,kubernetes,docker,容器

基于Containerd作为容器运行时的Docker可以定义为"High-High-Level"容器运行时。

关于 containerd 和 CRI 的关系要注意一些时间点:

  • containerd 在 2016年初被拆出来

  • CRI 标准在2016 年末出来的 (早于 containerd)

  • containerd 在2017年3月进入CNCF之后才添加了CRI支持.

Kubernetes 与 dockershim

从Kubernetes的架构图中,可以看到 Kubelet 下面还有一层Contianer runtime (容器运行时)是作为真正和OS去交互的,这个容器运行时是真正地管理容器的整个生命周期的以及拉取镜像等操作的。

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系,kubernetes,docker,容器

CRI(Container Runtime Interface)

如上面所说,目前比较主流的High-Level容器运行时有Containerd、CRI-O 以及PodMan等,每个容器运行时都有其自身的特性和优势, 而为了统一标准,更具扩性,Kubernetes 提出了容器管理的标准规范 CRI。主要定义了一组 grpc 接口, 来封装容器操作(create,start,stop,remove…)

Dockershim

而在 Kubernetes 提出 CRI 操作规范时,Docker刚拆出 containerd,并不支持 CRI 标准。由于当时Docker是容器技术最主流也是最权威的存在,Kuberentes虽然提出了CRI接口规范,但仍然需要去适配CRI与Docker的对接,因此它需要一个中间层或 shim 来对接 Kubelet 和 Docker 的 contianer runtime。

于是 kubelet 中加入了 Dockershim (shim为临时、兼容的意思)。使用 docker 作为 runtime 时,实际启动一个容器的过程是:

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系,kubernetes,docker,容器

在这个阶段Kubelet 的代码和 dockershim 都是放在一个Repo。

这也就意味着Dockershim是由K8S组织进行开发和维护!由于Docker公司的版本发布K8S组织是无法控制和管理,所以每次Docker发布新的Release,K8S组织都要集中精力去快速地更新维护Dockershim。

同时 Docker Engine 也过于庞大。

Kubernetes 弃用 Dockershim

Kubernetes1.24版本正式删除和弃用dockershim。这件事情的本质是废弃了内置的 dockershim 功能,直接对接Containerd(后续已经支持 CRI)。这种方式更加标准,调用的链路更加的简洁。说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系,kubernetes,docker,容器

综上可见,CRI可以实现kubelet对containerd、CRI-O的统一管理。同时,Kubernetes 1.24将dockershim 组件从 kubelet 中删除后,也建议用户使用更加轻量的容器运行时 containerd 或 CRI-O。

小结

虽然 dockershim 组件在 Kubernetes v1.24 发行版本中已被移除。不过来自第三方的替代品 cri-dockerd 可以适配器允许你通过 容器运行时接口(Container Runtime Interface,CRI) 来使用 Docker Engine(并不建议使用,除非有特殊的需求)。

对于Docker生成的镜像,也并不受任何影响,Docker 对镜像的构建是符合 OCI 标准的 (runC 也是 Docker 独立出去的),镜像适用于所有 CRI 容器运行时。

Don't Panic: Kubernetes and Docker | Kubernetes

 文章来源地址https://www.toymoban.com/news/detail-795552.html

到了这里,关于说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc crea

    error while loading shared libraries: libseccomp.so.2: /usr/lib64/ 目录下缺少这个依赖, libseccomp.so.2 使用命令下面的命令查找一下,找打之后copy到 /usr/lib64/ 目录下

    2024年02月11日
    浏览(46)
  • docker调用gpu报错:failed to create shim task: OCI runtime create failed: runc create failed,以及如何开启gpu持久

    docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as \\\'legacy\\\' nvidia-container-cli: initialization error: driver rpc error: timed out: unkno

    2024年02月11日
    浏览(53)
  • 云原生|kubernetes|使用cri-docker部署基于kubeadm-1.25.4的集群

    前言: kubernetes的部署从1.24版本开始后,弃用docker-shim,也就是说部署1.24版本后的集群不能使用docker-ce了。 比较清晰的解决方案有两个,一是使用containerd,这个是一个新的支持cri标准的shim,一个是使用cri-docker这样的中间插件形式, 一头通过CRI跟kubelet交互,另一头跟docker

    2024年02月07日
    浏览(75)
  • 基于ubuntu20.04安装kubernetes1.27.1(使用cri-docker)

    192.168.1.60 master 192.168.1.61 node1 192.168.1.62 node2 192.168.1.63 node3 不修改hostname会导致主机名相同,安装网络创建后,不同node节点的pod通信会有问题 2.3启动docker 配置service和socker文件 启动 dpkg 安装方便,不易出错 修改配置文件pause镜像使用过阿里源,默认使用的是国外的,下载不了

    2024年02月06日
    浏览(44)
  • 从Docker和Kubernetes看Containerd

    导读: 在学习Containerd之前,我们需要去了解Docker与Kubernetes这两个使用Containerd最多的技术,也需要明白什么是容器,什么是容器运行时,以及里面涉及的组件,这些组件是用来干什么的,及容器领域的概念,如libcontainer、runc、OCI、CRI、shim等。 在 Linux 内核中,容器不是一类

    2024年02月08日
    浏览(38)
  • K8s:一文认知 CRI,OCI,容器运行时,Pod 之间的关系

    博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充 课程是免费的,有华为云账户就可以看,适合理论认知,感觉很不错。 有需要的小伙伴可以看看,链接在文末 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守

    2024年02月09日
    浏览(40)
  • 【containerd错误解决系列】failed to create shim task, OCI runtime create failed, unable to retrieve OCI...

    pod的状态全部都是ContainerCreating的状态 containerd进程有大量报错,主要有: failed to create containerd task: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/k8s.io/c4847070fad34a8da9b16b5c20cdc38e28a15cfcf9913d712e4fe60d8c9029f7/log.json: no

    2023年04月25日
    浏览(47)
  • 【(Kubernetes)1.26.3+containerd/1.20.x + docker:container runtime is not running问题详细排查】

    一篇很细的排错记录📝,排错排了整整一天的经验😭 目录 环境: 报错信息: 错误分析: 解决: /etc/containerd/config.toml : 一般到这里就解决了,但是还没有解决的话可以参考下面的! 检查服务器:  关闭防火墙/开放端口: 关闭SELinux: kubelet配置   1.20.x + docker作为容器运行

    2023年04月09日
    浏览(33)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(66)
  • 云原生Kubernetes:CRI 容器运行时接口

    目录 一、理论 1.​CRI 2.容器运行时层级 3.容器运行时比较 二、总结 (1)概念       Kubernetes Node (kubelet) 的主要功能就是启动和停止容器的组件,我们 称之为容器运行时( Container Runtime) ,其中最知名的就是 Docker 。为了 更具扩展性, Kubernetes 1.5 版本开始就加入了容器运行

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包