Kubernetes 弃用 Docker,到底会影响到谁?

简介: Kubernetes 弃用 Docker,到底会影响到谁?

阅读目录

Kubernetes 弃用 Docker,到底会影响到谁?

Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。那么这到底是怎么回事?开发者和企业会受到什么样到影响?

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

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

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

1

2

3

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

 

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

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

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

1

2

3

系统三大移植资源是计算、存储、网络,从 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。

回到顶部

1.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 的位置:

回到顶部

2.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,并且模式也是类似的。

回到顶部

3.Kubernetes 最终如何桥接容器

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

下面是 Docker 的简图:

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

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

 

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

1

2

3

4

5

6

7

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

 

dockershim 调用 docker 守护进程

 

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

 

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

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

1

2

3

4

5

kubelet 从 CRI 的 gRPC 调用 cri-containerd;

 

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

 

containerd-shim 调用 RucnC (同上);

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

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

1

2

3

kubelet 从 CRI 的 gRPC 调用 cri-o;

 

cri-o 调用 OCI 的实现 runC

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

1

2

3

4

5

dockershim 模式:dockershim(*)->dockd->containerd->containerd-shimdockershim 模式有 3 个可执行程序,dockershim 一般与 kubelet 同进程;

 

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

cri-containerd 模式有 2-3 个可执行程序,cri-containerd 可与 containerd 同进程;

cri-o 模式:cri-ocri-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”,对开发者与企业的影响也非常有限。



抄自于:https://mp.weixin.qq.com/s?__biz=MzIzNjUxMzk2NQ==&mid=2247503788&idx=1&sn=e6940f629dd56d4e9f3ea8daf1626b2a&chksm=e8d4306edfa3b97814ecc27710ebfb31d08314e7e49f1bf894bfe385483421e5ce2480b5a76e&scene=126&sessionid=1608013820&key=7699cc7e7be7dcfc92288968a4031874596f503924f2a0fe4d86de798482a3d37f32b0dbf5b57fe1ae4999cf67a5efd157734008974dd4e1edaea9d8193db51ff31bcf5dbb9e1e19ca991d24cdf68c1b68244e80fac45dc1b0229754ce42d1980de2f7239ffb6868d2f473e281933284882275b91ecc80da0d28dc0dc5906360&ascene=1&uin=MjM3MjczMTM2MQ%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=AfTZWMfy9ESXczcNuavvncA%3D&pass_ticket=0iAf7dngOlPnLj2404zpBLNzUWXrDCI0d070YhiabyHBfevMErYaEHBAVEli8pVB&wx_header=0 

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
784 108
|
2月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1610 9
|
2月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
280 1
|
5月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
277 63
|
7月前
|
存储 Kubernetes 调度
Kubernetes、Docker和Containerd的关系解析
总的来说,Docker、Containerd和Kubernetes之间的关系可以用一个形象的比喻来描述:Docker就像是一辆装满货物的卡车,Containerd就像是卡车的引擎,而Kubernetes就像是调度中心,负责指挥卡车何时何地送货。
364 12
|
8月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
313 25
|
11月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
623 78
|
11月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
446 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
下一篇
oss云网关配置