Kubernetes弃用Dockershim,转向Containerd:影响及如何应对

Kubernetes1.24 版本发布时,正式宣布弃用 Dockershim,转向 Containerd 作为默认的容器运行环境。Kubernetes 以 CRI(Container Runtime Interface) 容器运行时接口制定接入准则,用户可以使用 Containerd、CRI-O、CRI- Dockerd 及其他容器运行时作为 Kubernetes 的容器引擎。

Kubernetes 为何弃用 Dockershim?

Docker 在早期没有实现 Container Runtime Interface (CRI),而 CRI 是 Kubernetes 后来增加的对额外运行时的支持标准。Dockershim 的存在是为了支持将 Docker 硬编码到 Kubernetes 中,但随着容器化成为行业标准,Kubernetes 项目增加了对额外运行时的支持,比如通过 Container Runtime Interface (CRI) 容器运行时接口来支持运行容器。因此,在 Kubernetes1.20 版本发布的时候提到未来会弃用 Dockershim 引擎,而在 Kubernetes1.24 版本发布时, 正式弃用之。

什么是 Containerd ?

containerd 是一种容器运行时引擎,原属于 Docker 的组件的一部分,主要提供容器生命周期管理(从创建到销毁容器)、拉取和推送镜像、存储管理(管理镜像及容器数据的存储)、调用 runc 容器运行等,现已由开源社区拆分脱离出来单独作为容器运行时项目。

在 Kubernetes 中,Containerd 作为容器运行环境,负责管理 Pod 的生命周期,包括容器的创建、启动、停止和删除等操作。与 Dockershim 相比,Containerd 具有更好的性能、更强的可扩展性以及更简洁的架构。

容器运行底层组件有哪些关系?

Docker Client 和 Docker Daemon:Docker Client 是 Docker 的客户端,它可以通过命令行或 API 向 Docker Daemon 发送请求。Docker Daemon 是 Docker 的核心组件,负责管理镜像、容器、网络和卷等资源,并将 Docker API 暴露给客户端。

Docker 镜像和 Docker 容器:Docker 镜像是只读的模板,包含了所有用于运行应用程序所需要的代码、库文件、环境变量和配置文件等内容。Docker 容器是基于 Docker 镜像创建的可运行实例。每个容器都是一个独立的、轻量级的操作系统,它们之间相互隔离并且可以共享主机的内核。

CRI(Container Runtime Interface)和容器运行时:CRI 是 Kubernetes 的容器运行时标准接口,满足这个标准的所有容器运行时都可以被使用。容器运行时则提供了一个轻量级的容器运行环境,用于创建、启动和停止容器。

OCI(Open Container Initiative)和 runc:OCI 是一个开放的容器组织,它制定了容器运行时的规范,包括运行时规范、容器镜像规范等。runc 是 OCI 标准的一个参考实现,它与容器所依赖的 cgroup/linux kernel 等进行交互,是容器最终运行的形态之一。

Containerd 在 Kubernetes 的运行变化

在 Kubernetes 1.24 版本以前,Kubernetes 通过调用 Docker 命令来创建容器。具体来说,Kubernetes 将任务发送给 Docker 客户端,然后 Docker 客户端通过与 Docker 守护进程(daemon)通信来创建容器。Docker 守护进程会通过 Image 模块下载镜像并保存,然后通过 client 调用 containerd 创建并运行容器。在这个过程中,如果需要给容器添加持久化存储,可以使用 volume 参数;如果需要配置容器网络,可以通过 network 参数来实现。

然而,Kubernetes 提供了更强大的卷挂载能力和集群级别的网络能力。在集群中,kubelet 只会使用到 Docker 提供的镜像下载和容器管理功能,而编排、网络、存储等功能都不会用到。

在 Kubernetes 1.24 版本以后,Containerd 作为容器运行时被引入,带来了创建 Pod 所需的所有功能。与之前的方案相比,这不仅带来了更纯粹的功能模块,而且缩短了调用链,提高了系统的效率和稳定性。因此,用户可以使用 Containerd、CRI-O、CRI-Dockerd 及其他容器运行时作为 Kubernetes 的容器引擎。

Containerd 在 Kubernetes 中的工作流

  1. Kubelet 通过 CRI 运行时服务 API 调用 CRI 插件来创建 Pod。

  2. CRI 创建一个特殊的沙箱容器(pause 容器),并将其放置在 Pod 的 Cgroups 和 NameSpace 命名空间中。

  3. CRI 使用 CNI 配置 Pod 的网络命名空间。

  4. Kubelet 随后通过 CRI 镜像服务 API 调用 CRI 插件来拉取应用容器镜像。如果镜像不存在于节点上,CRI 会进一步使用 Containerd 来拉取镜像。

  5. Kubelet 通过 CRI 运行时服务 API 调用 CRI,并使用拉取的容器镜像在 Pod 内创建和启动应用程序容器。

  6. CRI 创建应用程序容器,将其放入 Pod 的 Cgroups 和 NameSpace 中,然后启动 Pod 的新应用容器。

在这些步骤之后,一个 Pod 及其相应的应用程序容器被创建并运行。

Kubernetes 弃用 Dockershim 的影响

容器镜像,由于 Docker 镜像符合 OCI 规范,因此可以直接使用而不受影响。此外,原镜像打包方式仍然可用,即使用 docker build 方式打包镜像。这意味着用户在构建和打包镜像时不需要做出任何改变

Kubernetes 中的运行过程,作为终端用户(Kubernetes 使用者)基本也不会有任何影响,因为 Kubernetes 的使用逻辑没有任何变化。然而,与 Dockershim 相关的 API 接口已经弃用,如果创建了此类 CRD,需要注意修改相关代码。

运维方式,节点后端运维时使用的命令由 docker 命令改为 containerd。如果旧环境使用的是 Dockershim 引擎,需要先改为 containerd 运行时再进行升级。运维人员则需要适应新的命令行工具和运行时环境。

Kubernetes 弃用 Dockershim 而采用 containerd 作为容器运行时对用户和运维方式会有一些影响,但对于已经符合 OCI 规范的镜像和使用 docker build 方式打包镜像的用户来说,基本无感知。

Kubernetes 用户如何应对?

用户需要按照 Kubernetes 官方提供的迁移指南进行操作。这包括更新 Kubernetes 版本、修改 Pod 配置文件、调整部署流程、更换镜像管理工具以及重新配置监控和日志采集工具等步骤。在迁移过程中,用户还需要注意测试新环境的稳定性和性能,确保迁移成功。

在迁移过程中,用户可能会遇到各种问题,如配置错误、兼容性问题、性能下降等。为了解决这些问题,用户可以参考 Kubernetes 官方文档和社区资源,或者向灵雀云的服务团队寻求帮助和支持。此外,用户还可以在测试环境中模拟迁移过程,提前发现和解决问题。

迁移到 Containerd 后,用户可以对系统进行一系列优化和改进,以提高性能和稳定性。例如,优化 Pod 的配置和部署流程、使用更高效的网络配置方式、改进监控和日志采集策略等。此外,用户还可以关注 Kubernetes 和 Containerd 的最新版本和功能更新,及时跟进技术发展趋势。

结论与展望

Kubernetes 弃用 Dockershim 并转向 Containerd 已经成为一个明显的趋势信号。对于现有的 Kubernetes 用户来说,应尽快了解这一变化的影响和应对策略,找到适合自己的方案并尽早进行改进。未来,Kubernetes 与 Containerd 的发展趋势将更加紧密地结合在一起,共同推动容器技术的不断创新和发展。

参考文档:

  • https://kubernetes.io/zh-cn/blog/2022/02/17/dockershim-faq/

  • https://kubernetes.io/zh-cn/blog/2020/12/02/dont-panic-kubernetes-and-docker/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/277476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃,报错:Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃,报错:Library not loaded: rpath/Ap…

13. 罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆,值类型与引用类型 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工…

RFID珠宝门店智能管理设计解决方案

一、项目背景 目前,珠宝行业的盘点工作主要依靠人工操作完成,然而由于珠宝产品体积小、数量大,大数量的产品由少量营业人员花费大量时间进行盘点,这导致盘点效率低下,进而减少了珠宝店在客户营销方面的时间投入。 二、…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言,最重要的语句 4.使用频率最高的语句 语法: SELECT 字段1,字段2,……FROM 表 有时候…

【技术揭秘】软网关BLIoTLink,轻松部署至工控机,实现协议转换网关的快速搭建!

本文教你使用钡铼提供的协议转换软件BLIoTLink ,快速搭载在ARM工控机上,变成迷你边缘计算网关。话不多说,跟着操作起来吧! 功能简介 BLIoTLink是由深圳市钡铼技术有限公司为推进工业物联网发展而研发的一款免费的嵌入式物联网协…

PC9095高性能可调限流OVP过压过流保护 软启动 抗浪涌 集成功率FET开关

特点 •输入电压范围: •PC9095A、PC9095KA:2.5伏~13.5伏 •PC9095B,PC9095KB:2.5伏~10伏 •PC9095C,PC9095KC:2.5伏~5.5伏 •28V绝对最大额定电压VOUT •带外部电阻器的可调限流器 •集成功率FET开关,53mΩRds&#xff08…

php学习05-常量

常量可以理解为值不变的量。常量值被定义后,在脚本的其他任何地方都不能改变。一个常量由英文字母、下划线和数字组成,但数字不能作为首字母出现。 在PHP中使用define()函数来定义常量,该函数的语法格式如下: define(string cons…

#define定义宏

#define的定义范围 #define不光可以定义变量,常量,还可以定义几乎所有的东西,因为#define可以定义一串代码(即宏),所以包含在代码中的东西都能被定义。 #define定义宏 定义是宏名必须于它的参数括号紧挨&am…

web自动化上传文件

1,web 自动化文件上传不要太简单 熟悉 web 自动化测试的大佬应该都懂,当采用 js 调用原生控件进行文件上传的时候,最常用的是使用 pywin32 等系统交互库。 当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址,…

再获认可,YashanDB入选工信部电子一所“2023年数字化转型自主创新解决方案优选案例”

近日,由国家工业信息安全发展研究中心(工业和信息化部电子第一研究所)主办的“数智赋能 创新领航”2023年数字化转型自主创新解决方案优选案例正式公布。深圳计算科学研究院(简称:深算院)自主研发的崖山数据…

校园安全风险管理系统

随着社会的不断发展和进步,教育行业也逐渐走向了信息化、智能化管理。校园作为教育事业的重要场所,其安全和管理问题一直备受关注。为了确保校园的安全和管理,各种校园管理平台应运而生。 其中,凡尔码搭建的校园安全管理系统为校园…

AVL树(超详解)

文章目录 前言AVL树的概念AVL树的实现定义AVL树insert 单旋左单旋右单旋左单旋代码右单旋代码 双旋左右双旋右左双旋 测试AVL树的性能 前言 AVL树是怎么来的呢? 我们知道搜索二叉树会存在退化问题,退化以后就变成单支或者接近单支。 它的效率就变成O(N)…

react 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地(内置了基础静态组件和模版) git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务(内置了json-server) npm run serve 启动前端服务 npm…

【React源码 - ReactDom.render发生了什么】

在React开发中,在入口文件我们都会执行ReactDom.render来讲整个应用挂载在主document中,那其中发生了什么,React是如何讲我们写的JSX代码,一步一步更新Fiber进而挂载渲染的呢。本文主要是基于react17.0.2的源码以及自己的理解来简…

linux 内核模块

linux 内核模块 1. 内核相关命令与文件内核模块存放位置查看已加载内核模块加载与卸载内核模块修改内核参数永久调整内核参数 2. 常用模块进程调度模块进程间通信模块内存管理模块文件系统模块网络接口模块 Linux 内核采用的是模块化技术,这样的设计使得系统内核可以…

Jmeter吞吐量控制器总结

吞吐量控制器(Throughput Controller) 场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现。 添加吞吐量控制器 用法1: Percent Executions 在一个线程组内分别建立两个吞吐量控制器, 分别放业务A和业务B …

Docker本地部署开源浏览器Firefox并远程访问进行测试

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

KaiwuDB 受邀亮相“ACDU 中国行”数据库技术沙龙(西安站)

12月23日,由中国计算机学会(CCF)指导,浪潮数据库、中国数据库联盟、墨天轮数据库社区等联合主办的“ACDU 中国行”数据库技术发展与实践沙龙(西安站)成功举办。KaiwuDB 高级架构师赵衎衎受邀出席沙龙并做主…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…