1.前言

  近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。并在1.23后不再支持docker。

  但Docker目前作为容器镜像构建工具的作用将不受影响,用其构建的容器镜像将一如既往地在集群中与所有容器运行时正常运转。

  • 维护dockershim已成为Kubernetes维护人员的一种负担。创建CRI标准就是为了减轻这种负担,并提升不同容器运行时的可移植性性。Docker本身目前没有实现CRI,但Containerd实现了CRI接口。Dockershim一直是一种临时解决方案,此外,与dockershim不兼容的特性,如cgroups v2和用户命名空间,实现CRI接口的运行时也在慢慢探索并实现上述特性。
  • Kubelet中对Docker支持被弃用,并将在以后的版本中删除。Kubelet使用一个名为dockershim的模块,该模块实现了对Docker的CRI支持,在此PR后续版本将删除dockershim。删除了dockershim,那么就不支持了。
  • Kubectl弃用 --delete-local-data 参数。

2.名词解释

  上面中提到两个名词,分别为CRI和dockershim。下面分别解释一下:

2.1 CRI

  大家在看到CRI时就会想起OCI,这两个名词概念容易混淆。

  CRI:容器运行时接口container runtime interface,CRI 中定义了容器和镜像两个接口,实现了这两个接口目前主流的是:CRI-O、Containerd。(目前 PCI 产品使用的即为 Containerd)。

  其主要的作用:

  1.针对容器操作的接口,包括容器的创建、启动和停止等

  2.针对镜像的操作,拉去、删除镜像等

  3.针对 podsandbox(容器沙箱环境)

  4.以上全是接口

2.2 OCI

  OCI:开放容器标准open container initiative,OCI 中定义了两个标准:容器运行时标准和容器镜像标准,实现了这一标准的主流是:runc(也即我们日常说的 Docker)、Kata-Container。

  主要作用,制作容器:

  1.容器镜像制作内容,即ImageSpec

  2.容器需要接收哪些指令,即runtimeSpec

2.3 Dockershim

  dockershim作用:把外部收到的请求转化成Docker Daemon能听懂的请求,让 Docker Daemon 执行创建、删除等容器操作。

3.Kubelete 创建容器步骤

  1.Kubelet通过 CRI 接口(gRPC)调用 dockershim,请求创建一个容器。CRI 即容器运行时接口,这一步中,Kubelet 可以视作一个简单的 CRI Client,而dockershim 就是接收请求的Server。目前dockershim 的代码其实是内嵌在Kubelet中的,所以接收调用就是Kubelet进程。

  2.dockershim收到请求后,转化成Docker Daemon 能听懂的请求,发到Docker Daemon 上请求创建一个容器。

  3.Docker Daemon早在1.12 版本中就已经将针对容器的操作移到另一个守护进程 containerd 中,因此 Docker Daemon仍然不能帮我们创建容器,而是要请求containerd 创建一个容器。

  4.containerd收到请求后,并不会自己直接去操作容器,而是创建一个叫做 containerd-shim的进程,让containerd-shim 去操作容器。是因为容器进程需要一个父进程来做诸如收集状态,维持stdin等fd 打开等工作。而假如这个父进程就是containerd,那每次containerd 挂掉或升级,整个宿主机上所有的容器都得退出了。而引入了 containerd-shim 就规避了这个问题(containerd 和 shim 并不是父子进程关系)。

  5.我们知道创建容器需要做一些设置 namespaces 和 cgroups,挂载 root filesystem 等等操作,而这些事该怎么做已经有了公开的规范,那就是 OCI。它的一个参考实现叫做 runC。于是,containerd-shim 在这一步需要调用 runC 这个命令行工具,来启动容器。

  6.runC 启动完容器后本身会直接退出,containerd-shim 则会成为容器进程的父进程,负责收集容器进程的状态,上报给containerd,并在容器中pid为1的进程退出后接管容器中的子进程进行清理,确保不会出现僵尸进程。

  通过上面来看,Docker Daemon和dockershim看上去就是两个不干活的东西,Kubelet 为啥不直接调用containerd呢?其实和容器历程有关,这里不在阐述。

  尽管现在已经有CRI-O,containerd-plugin这样更精简轻量的Runtime架构,但dockershim这一套作为经受了最多生产环境考验的方案,迄今为止仍是Kubernetes默认的 Runtime实现。不过Containerd逐渐被人们所知晓。

4.展望

  虽然未来Kubelet删除dockershim支持,但并不说明Docker马上就不能在 Kubernetes 中使用,目前容器市场 Docker 还是占用很大的比例。这中间会有一个过渡期,大家可以关注Containerd或者Podman。Centos8开始,仓库源默认容器已经从Docker切换为Podman。

参考链接: https://blog.csdn.net/easylife206/article/details/110602496

Kubernetes将弃用docker?的更多相关文章

  1. Kubernetes将弃用Docker!与 containerd容器引擎

    时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...

  2. Kubernetes弃用Docker后怎么办?

    本文转自Rancher Labs 近期,Kubernetes在其最新的Changelog中宣布,自Kubernetes 1.20之后将弃用Docker作为容器运行时.这一消息在云原生领域激起了不小的水 ...

  3. 系列好文 | Kubernetes 弃用 Docker,我们该何去何从?

    作者 | 张攀(豫哲) 来源 | 尔达 Erda 公众号 导读:Erda 作为一站式云原生 PaaS 平台,现已面向广大开发者完成 70w+ 核心代码全部开源!**在 Erda 开源的同时,我们计划编 ...

  4. Centos7上安装Kubernetes集群部署docker

    一.安装前准备1.操作系统详情需要三台主机,都最小化安装 centos7.3,并update到最新 [root@master ~]# (Core) 角色 主机名 IPMaster master 192 ...

  5. Kubernetes 集群升级docker版本

    Kubernetes 集群升级docker版本   原则:升级完一台正常后再接着升下一台. Work Node 一.迁移上的pod(保证业务,但期间会出现抖动) kubectl drain $NODE ...

  6. K8S为什么要弃用Docker?Dockershim将移除

    一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...

  7. Kubernetes容器运行时弃用Docker转型Containerd

    文章转载自:https://i4t.com/5435.html Kubernetes社区在2020年7月份发布的版本中已经开始了dockershim的移除计划,在1.20版本中将内置的dockersh ...

  8. kubernetes实战篇之docker镜像的打包与加载

    系列目录 前面我们讲到了使用nexus搭建docker镜像仓库,操作还是有点复杂的,可能有的童鞋仅仅是想尝试kubernetes功能,并不想在搭建仓库上花费过多时间,但是又想在不同的主机之间传递镜像. ...

  9. Windows玩转Kubernetes系列2-Centos安装Docker

    接上一章,Windows玩转Kubernetes系列1-VirtualBox安装Centos,我们开始学习如何在Centos中安装Docker 准备 关闭防火墙 防火墙一定要提前关闭,否则在后续安装K ...

随机推荐

  1. Iterable 和 Iterator

    可以被for循环输出的为iterable (可迭代对象) 可以被next()调用并不断返回下一个数据的对象为iterator迭代器(python一切皆对象) 数据流,无法知晓其终点,只能推过next不 ...

  2. [刷题] PTA 7-32 说反话-加强版

    题目描述: 给定一个英语句子,各个单词之间用空格分隔.要求编写程序,将所有单词倒序输出 输入示例: Hello World Here I Come 输出示例: Come I Here World He ...

  3. [刷题] 167 Two Sum II

    要求 升序数组 找到两个数使得它们相加之和等于目标数 函数返回两个下标值(下标从1开始) 示例 输入:numbers = [2, 7, 11, 15], target = 9 输出:[1,2] 思路 ...

  4. python类传参示例

    1 class f(): 2 3 def __init__(self, *args, **kwargs): 4 print('args Is', args) # args Is ('5', 'fff' ...

  5. GCC参数详解-(转自:篱笆博客)

    gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言, ...

  6. brk 和 sbrk 区别

    转自:https://www.cnblogs.com/chengxuyuancc/p/3566710.html brk和sbrk的定义,在man手册中定义了这两个函数: 1 #include < ...

  7. C语言编程 菜鸟练习100题(41-50)

    [练习41]字符串翻转 0. 题目: 字符串翻转 1. 分析: 学习递归思想和方法. 2. 程序: 方法一: #include <stdio.h> void reverseSentence ...

  8. jQuery的链式编程风格

    jQuery的链式编程风格 首先本人通过一个案例来展示jQuery的链式编程风格.先写一个页面,展示一个列表,代码如下: <body> <div> <ul class=& ...

  9. 启动dubbo消费端过程提示No provider available for the service的问题定位与解决

    文/朱季谦 某次在启动dubbo消费端时,发现无法从zookeeper注册中心获取到所依赖的消费者API,启动日志一直出现这样的异常提示 Failed to check the status of t ...

  10. Elasticsearch快速入门和环境搭建

    内容概述 什么是Elasticsearch,为什么要使用它? 基础概念简介 节点(node) 索引(index) 类型映射(mapping) 文档(doc) 本地环境搭建,创建第一个index 常用R ...