K8s 为什么会抛弃 docker
为什么 K8s 会抛弃 docker
前言
在这之前先来了解下,k8s 是如何和 docker 进行交互的。
CRI
kubelet 调用下层容器运行时的执行过程,并不会直接调用 Docker 的 API,而是通过 CRI(Container Runtime Interface,容器运行时接口)的 gRPC 接口来间接执行的。
为什么要引入 CRI?
把 kubelet 对容器的操作,统一地抽象成一个接口,这样 kubelet 只需要和这个接口打交道,而不用关心底层容器,底层容器它们就只需要自己提供一个该接口的实现,然后对 kubelet 暴露出 gRPC 服务即可,这样底层容器就能很容器的进行切换了,而不是仅限于 Docker 这种容器了。
同时,引入 CRI 接口,这样就不会受限于 docker 了,可以随时切换到其它的运行时。意味着容器运行时和镜像的实现与 Docker 项目完全剥离,让其他玩家不依赖 Docker 实现自己的运行时成为可能。
containerd
面对挑战,Docker 采取了“断臂求生”的策略,推动自身重构,将原有单一架构的 Docker Engine
拆分成多个模块,其中 Docker daemon
部分捐赠给 CNCF,containerd 形成。
作为 CNCF 的托管项目,containerd 必须符合 CRI 标准。
但是 docker 本身还是没有实现 CRI 标准。所以 k8s 中引入了一个叫作 dockershim 的组件。它会把 CRI 请求里的内容拿出来,然后组装成 Docker API
请求发给 Docker Daemon
。
kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd
containerd 作为 k8s 容器运行时
kubelet --> cri plugin(在 containerd 进程中) --> containerd
显然都是通过 containerd 来管理容器的,所以这两种的调用效果最终是一样的。第二种,去掉了 dockershim 调用链更短了,性能更好了,同时因为不用维护 dockershim 了,维护性难度也大大减少了。
所以 Docker 被抛弃的原因就很显而易见了。不过弃用 Docker 对 k8s 和 Docker 的影响不大,因为它们都已经将底层改为开源 containerd,原有的 Docker 镜像和容器仍然可以正常运行。唯一的变化是 K8s 绕过了 Docker,直接调用 Docker 内部的 containerd。
参考
【深入剖析 Kubernetes】https://time.geekbang.org/column/intro/100015201?code=UhApqgxa4VLIA591OKMTemuH1%2FWyLNNiHZ2CRYYdZzY%3D
【K8s 为什么要弃用 Docker?】https://mp.weixin.qq.com/s/qEKyEseD370xWI-2yIyUzg
【Docker与k8s的恩怨情仇】https://www.cnblogs.com/powertoolsteam/p/14980851.html
【k8s为什么会抛弃docker】https://boilingfrog.github.io/2023/01/07/k8s为什么会抛弃docker/
K8s 为什么会抛弃 docker的更多相关文章
- k8s取节点内docker中的日志
Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大 ...
- [kubernetes] 使用 Minikube 快速搭建本地 k8s 环境 (基于 Docker 驱动模式)
一.实验环境 操作系统:Centos 7 x86_64 Docker:1.12.6 二.部署 k8s 步骤 2.1 安装 kubectl cat <<EOF > /etc/yum. ...
- k8s集群之Docker安装镜像加速器配置与k8s容器网络
安装Docker 参考:https://www.cnblogs.com/rdchenxi/p/10381631.html 加速器配置 参考:https://www.cnblogs.com/rdchen ...
- k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系
[k8s]args指令案例-彻底理解docker entrypoint 需求: 搞个镜像,可以运行java -jar xxx.jar包,xxx.jar包名称要用参数传 思路1: 打对应运行ja ...
- (转)解决k8s集群提示docker login问题(同样适用于Rancher)
文章转自 https://blog.liv1020.com/ 参考文档:https://kubernetes.io/docs/concepts/containers/images/#configuri ...
- 将dubbo框架里的服务提供者迁移进k8s里,以docker提供服务时要注意的细节
在将dubbo框架里的服务提供者迁移进k8s时,有几个注意事项: 1, 要为默认情况下,dubbo会将k8s里的pod ip地址作为注册服务的地址,所以这个地址需要被改写(ip测试过,行得通,而dns ...
- k8s记录-ubuntu安装docker
sudo apt-get purge docker-ce sudo rm -rf /var/lib/dockerdocker-ce:https://download.docker.com/linux/ ...
- k8s注册节点提示Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd"
本篇就不长篇大论了,直接附上解决办法 提示如上,此提示非必要要求,只是建议,但是看着不爽,那就解决它 这是未解决之前的docker信息,现在输入下面的指令 sudo echo -e "{\n ...
- K8s 终将废弃 docker,TKE 早已支持 containerd
近日 K8s 官方称最早将在 1.23版本弃用 docker 作为容器运行时,并在博客中强调可以使用如 containerd 等 CRI 运行时来代替 docker.本文会做详细解读,并介绍 dock ...
- 搭建docker私有仓库,建立k8s集群
服务器IP角色分布 192.168.5.2 etcd server 192.168.5.2 kubernetes master 192.168.5.3 kubernetes node 192.168. ...
随机推荐
- 测试杂谈——一条SQL引发的思考(二)
在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈--一条SQL引发的思考(一). 今天这篇,算是个问题记录吧,问题并不复杂,但对于测试同学而言,确实是个需要关注的点. 问题分析 最近在日常工作中, ...
- Vue3 SFC 和 TSX 方式调用子组件中的函数
在开发中会遇到这样的需求:获取子组件的引用,并调用子组件中定义的方法.如封装了一个表单组件,在父组件中需要调用这个表单组件的引用,并调用这个表单组件的校验表单函数或重置表单函数.要实现这个功能,首先要 ...
- 「MySQL高级篇」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- Java多线程(6):锁与AQS(下)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现.既然它这么优秀,是骡子是马,就拉出来溜溜吧. 首先用重入锁来实现简单的累加,就像这 ...
- nginx+keepalived实现主从模式双机热备份
主从模式就是一台机器提供服务,另一台机器作为备份机,当主机的服务停止时,备份机立刻接替主机的服务. 安装 安装nginx wget http://nginx.org/download/nginx-1. ...
- JAVA语言学习-面向对象(1)
类与对象 类 类是JAVA语言中重要的复合型数据类型().类的实现包括两个部分:成员变量和成员方法("方法"可以看作是C语言中的函数) 类的声明 要使用类,首先得对其声明.声明一个 ...
- Dubbo-聊聊通信模块设计
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...
- C/C++ 知海拾遗
C语言知识拾遗 2022/11/11 memset()函数用法 包含头文件:<string.h> 作用:给任意类型变量数组初始化,即万能初始化函数. 使用形式:memset( void* ...
- 2022-11-02 Acwing每日一题
逆序对的个数 给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆 ...
- 😀 Java并发 - (并发基础)
Java并发 - (并发基础) 1.什么是共享资源 堆是被所有线程共享的一块内存区域.在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例 Java中几乎所有的对象实例都在这里分配内存.方法区与堆 ...