Kubernetes决定弃用Docker,到底会影响到谁?_qianshanding0708的博客-程序员秘密

技术标签: kubernetes  编程语言  内核  大数据  docker  

近几年,Kubernetes 已经成为自有机房、云上广泛使用的容器编排方案,最广泛的使用方式是 Kubernetes+Docker。从 DevOps 人员的角度,一面用 kubctl 命令、k8s API 来操作集群,一面在单机用 Docker 命令来管理镜像、运行镜像。

单独用 Docker 的情况,在一些公司的场景里面也是有的。一种场景是“只分不合”,把一台机器用 Docker 做资源隔离,但是不需要将多容器“编排”。单独用 Kubernetes,下层不是 Docker 的情况,并不算很多。

Kubernetes 和 Docker 的关系,简单来说,有互补,也有竞争。在一般的认知中,Kubernetes 和 Docker 是互补关系:

· Dockers属于下层——容器引擎;

· Kubernetes属于上层——编排调度层。

Docker 源于 Linux Container,可以将一台机器的资源分成 N 份容器,做到资源的隔离,并将可运行的程序定义为标准的 docker image;Kubernetes 则可以把不同机器的每份容器进行编排、调度,组成分布式系统。

Kubernetes 和 Docker 并不完全是“泾渭分明”的互补关系,它之间有重叠部分,也可以说成是竞争,主要在于几个点:

系统三大移植资源是计算、存储、网络,从Kubernetes角度Docker属于“Runtime(运行时)”,也就是计算资源;但是Docker技术体系里面,本身也包括存储层、网络层。上下层职责的重叠,也可以看作竞争。

Docker原本有个原生的调度引擎——Swarm,几年前在调度编排领域,还是Kubernetes、Mesos、Swarm三者并存,Kubernetes最终胜出,但Docker仍有“继续向上做一层的意愿”。

Kubernetes 在如何使用 Docker 方面,存在争议和变数。kubernetes 1.20 ChangeLog 中所谓要废弃 Docker 的传言,也是无风不起浪。换句话说,即便 Kubernetes 一直用 Docker,也不是用 Docker 的全部,多少是不一样的。

而且,“弃用 Docker”这个词本身有多重的含义,Docker 并非一个单层软件,Kubernetes 1.20 启用 dockershim 并不代表弃用了 Docker 的全部,仍有 containerd 可以对接 docker。

Kubernetes 有 CRI、OCI 两个容器标准

在目前广泛使用 kubernetes 与 Runtime 的桥接方案,CRI(Container Runtime Interface)与 OCI(Open Container Initiative)是“套娃“关系。Kubernetes 的 kubelet 调用 CRI,OCI 的实现者然后再调用 OCI。

下图也说明了 CRI 与 OCI 的关系:

从 Kubernetes 的角度,CRI 是与 CNI(网络)、CSI(存储)相同层级的接口。

OCI 是个自下而上的标准,也就是从实现抽象出接口,它是 Linux Foundation 主导的。Docker 实现的核心 RunC,也就是 OCI 的典型实现、标准实现。

CRI 是个自上而下的标准,源于 Kubernetes 对移植层(运行时)的要求。

容器引擎层自下而上定义 OCI,容器编排层自上而下定义 CRI,这也让它们出现了“套娃“运行情况。

在 Kubernetes 的 dockershim、cri-containerd、cri-o 三种实现中,RedHat 推崇的 cri-o 已经比较主流,它虽然仍是“套娃“,但已经比较精简。

下面是从 kubernetes 集群运行的全景图看 cri-o 的位置:

Docker 本源于 Linux Container

Docker 作为容器引擎,其实现的基础是 Linux Container——从内核到用户空间的机制。

Linux Container 可以分成两个部分,内核里面的 cgroup,用户空间的 lxc。Docker 最初实现的时候,也是完全基于 Linux Container 的,基于 lxc 做更上层的东西。

这张很多人认为“与事实不符“的图,其实代表了过去:

在 Docker 的发展过程中,最终启用了 C 语言写成 lxc,换成了 go 语言写成的 libcontainer。

下面的图也不是很新,但它更能表示 Docker 后续典型的架构,这里面已经没有了 lxc。

然而,万变不离其宗,Docker 实现的本源,还是 Linux Container。即便不用 lxc,当仍要用内核的 cgroup,并且模式也是类似的。

Kubernetes 最终如何桥接容器

从纯技术的角度,与其讨 Kubernetes 与 Docker 关系,不如讨论 Kubernetes 与最终容器实现层的关系。因为 Docker 这个名词,在不同的时候,有着不同的内涵、外延。

下面是 Docker 的简图:

从软件模块的角度,图中的 docker Engine、cri-containd、containd-shim、runC 都属于 Docker 体系的软件。

下图中的紫、橙、红三种颜色,代表了 dockershim、cri-containerd、cri-o 三种 CRI 的典型方式——流程在逐渐缩短,这也是 CRI 实现的一个演进过程。

如果是 kubelet 的 dockershim 模式(紫色),流程是这样的:

· kubelet从CRI的gRPC调用dockershim,二者在同一个进程

· dockershim调用docker守护进程

· docker守护进程调用containerd;containerd调用containerd-shim(有时名为docker-containerd-shim守护进程)完成创建容器等操作

· containerd-shim访问OCI的实现runC(命令行可执行程序)

如果是 kubelet 的 cri-containerd 模式(橙色),流程是这样的:

· kubelet从CRI的gRPC调用cri-containerd;

· cri-containerd调用containerd;containerd调用containerd-shim(同上)

· containerd-shim调用RucnC (同上);

在很多人的印象中,如果不用 docker 守护进程,就相当于“弃用 docker“,这其实也就是从 dockershim 到 containerd 的变化。从另一个角度来说,containerd 这个守护进程,也是 docker 组织做的。

如果是 kubelet 的 cri-o 模式(红色),则更加简练:

· kubelet从CRI的gRPC调用cri-o;

· cri-o调用OCI的实现runC

如果以 kubelet 调用 CRI 为起点,OCI 的 runC 调用为终点,三种模式经历的可执行程序分别是:

· dockershim模式:dockershim(*)->dockd->containerd->containerd-shim

· cri-containerd模式:cri-containerd(*)-> containerd->containerd-shim

· cri-o模式:cri-o

dockershim 模式有 3 个可执行程序,dockershim 一般与 kubelet 同进程;cri-containerd 模式有 2-3 个可执行程序,cri-containerd 可与 containerd 同进程;cri-o 模式只有 1 个可执行程序。

显然在这种 Red Hat 推崇的 cri-o 模式下,Docker 体系的 containerd 也用不着了,只剩 runC 这个命令行的程序。runC 也是用 go 写成的,里面有调用 libcontainer。

当 Docker 萎缩到这个地步,其实也只剩 Linux 内核里面 cgroup、namespace 功能的封装了。

总结来说,由于老技术实现的惯性,在生产环境大量使用的经典 Kubernetes+ Docker 方案依然运行,且运维已经成熟,不会很快升级。对于开发人员、企业,对于 K8S API 的使用频率、变数,远远大于 Docker API,至于 Kubernetes 和 Docker 的桥接,更不用关心。因此,即便“彻底弃用 Docker”,对开发者与企业的影响也非常有限。

近期阅读:

设计恰如其分的架构

漫谈 ‖ 软件设计的目标和途径

分布式架构高可用与高并发那些在工作中常用到的那些变态应用

- END -

                 点一下在看再走吧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qianshangding0708/article/details/111570119

智能推荐

windows性能检测器参数项详解_资源检测器参数_jjiss318的博客-程序员秘密

性能测试之内存篇(windows)要监视内存不足的状况,请从以下的对象计数器开始:·    Memory\ Available Bytes·    Memory\ Pages/secAvailable Bytes剩余的可用物理内存,单位是兆字节(参考值:>=10%)。表明进程当前可使用的内存字节数。Pages/sec 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁

华南理工大学计算机考研资料汇总_华南理工大学计算机专硕考研科目_N诺计算机考研的博客-程序员秘密

华南理工大学计算机科学与工程学院 华南理工大学软件学院华南理工大学(South China University of Technology),简称华南理工,位于广东省广州市,创建于1934年。初复试信息【2022年最新报考信息】计算机相关专业:计算机科学与工程学院(广州大学城校区)软件学院(广州大学城校区)往年学制、学费、奖学金情况学制学费奖学金22华南理工大学计算机相关初试科目:计算机科学与工程学院081200 计算机科学与技术 63本专业所列招生计划包含推免生。含与法国南特大学联培计划5。0854

STM32CubeMX和STM32CubeIDE组合,定义STM32开发新方式_cubemxide_HongAndYi的博客-程序员秘密

在2018年3月份,本人写下了一篇博文《几种STM32开发IDE的比较与选择》,当时ST公司已经收购了Atollic公司,TrueSTUDIO 9.0变成一个免费的STM32开发IDE工具。当时本人就预见TrueSTUDIO +STM32CubeMX必将是ST公司大力推广的开发工具组合。在后面为一门课程备课时,本人也使用了STM32CubeMX+TrueSTUDIO 9.0,发现这套工具非常好用,...

mysql数据库回滚日志_彻底搞懂 MySQL 事务的隔离级别_weixin_39797912的博客-程序员秘密

事前准备数据mysql> create table city( -> id int(10) auto_increment, -> name varchar(30), -> primary key (id) -> )engine=innodb charset=utf8mb4;insert into city(name) values('武汉市')...

度度熊与邪恶大魔王——dp__zhj的博客-程序员秘密

度度熊与邪恶大魔王  Accepts: 2481  Submissions: 15467 Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 32768/32768 K (Java/Others)Problem Description度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗

彻底搞懂 Spring 容器和应用上下文_吧主的博客-程序员秘密

点击上方 "程序员小乐" ,关注公众号8点20分,第一时间与你相约每日英文Always remember two things: Don't make any decis...

随便推点

Python os库_辰 的博客-程序员秘密

os库1. os.sep 当前操作系统的目录分隔符2.os.name 获得当前操作系统3.os.linesep 获得行终止符4.os.getcwd(path) 获得当前工作目录5.os.getenv() 获得环境变量6. os.environ 可以获取并修改环境变量7. os.listdir(path) 列出某目录下所有的目录和文件8. os.remove(path) 删除文件9. os.removedirs(path) 递归删除目录10. os.re

servlet web.xml 配置 (未完成待续)_xml参数配置未完成_通幽通明的博客-程序员秘密

URL映射到本地文件在<web-app></web-app>添加<web-app> <servlet> <servlet-name>在servlet中起一个名字</servlet-name> <servlet-class>项目包名.路径.类名</servlet-

MySQL导入导出数据时遇到Tab符号和换行符号怎么办?_蚂蚁学Python的博客-程序员秘密

在做ETL(下载、转换、导入)开发的时候,经常会遇到从MySQL中导出数据,经过计算后再导入到MySQL的场景。那么有一个很难绕过的问题,如果源MySQL的字段中,包含了\t、\n特殊字符,该怎么办?因为导出文件时,默认是按照\t分割字段、\n分割行,现在字段中出现了\t和\n,这不是乱了吗?同时导入文件时,load data可以指定fields和lines的分隔符,默认情况都是\t和\...

Unity UDP广播 接收端实现_野兽派艺术家!魔界大王橘子!的博客-程序员秘密

public class Lighthouse : MonoBehaviour{ private byte[] data; private string Error_Message; private Thread thread; private EndPoint ep; private bool IsStop = false; private ...

libevent 上传文件_dddddppppp123的博客-程序员秘密

print_log("evhttp_connection_get_bufferevent() ok\n");// Fire off the requestreq = evhttp_request_new(http_post_done, bev);if (req == NULL) {fprintf(stderr, "evhttp_request_new() failed\n"

气动爬行机器人设计_(DᴗD)B的博客-程序员秘密

气动爬行机器人设计简介项目规则简介最近在学校做一个气动的爬行机器人,算是一个二级项目,虽然名义上有分组,但是基本上是我自己在做,觉得有些东西值得记录和分享,所以把一些东西写下来,留作以后参考。项目规则机器人驱动系统为气动控制系统,将采用气源、电源拖线运行方式。气源压力5bar,电源电压24V。手机+蓝牙+单片机控制,实现转向、前进、后退、行走、循迹、运载功能。要求机器人能自动实现循迹(...

推荐文章

热门文章

相关标签