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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
Kubernetes 调度 虚拟化
Kubernetes和Docker有什么区别
【10月更文挑战第18天】Kubernetes和Docker有什么区别
|
19天前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
65 5
|
19天前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
3天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
21 2
|
5天前
|
Kubernetes Cloud Native 开发者
探秘云原生计算:Kubernetes与Docker的协同进化
在这个快节奏的数字时代,云原生技术以其灵活性和可扩展性成为了开发者们的新宠。本文将带你深入了解Kubernetes和Docker如何共同塑造现代云计算的架构,以及它们如何帮助企业构建更加敏捷和高效的IT基础设施。
|
17天前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes和Docker的协同之旅
【10月更文挑战第4天】在这篇文章中,我们将通过一次虚拟的旅行来探索云原生技术的核心——Kubernetes和Docker。就像乘坐一艘由Docker驱动的小船启航,随着波浪(代码示例)起伏,最终抵达由Kubernetes指挥的宏伟舰队。这不仅是一段技术上的旅程,也是理解现代云架构如何支撑数字世界的冒险。让我们扬帆起航,一探究竟!
|
18天前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
31 4
|
22天前
|
Kubernetes Docker 容器
rancher docker k8s安装(一)
rancher docker k8s安装(一)
33 2
|
27天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
30天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。