K8s 集群运行时:从 Docker 升级到 Containerd

一、背景:Kubernetes容器运行时演进史

自2020年Kubernetes 1.20版本宣布弃用Docker作为默认容器运行时以来,容器技术生态经历了重大变革。作为CNCF毕业项目,Containerd凭借其轻量化架构原生CRI支持卓越性能表现,逐渐成为云原生时代的首选运行时。截至2025年,超过80%的生产级K8s集群已完成运行时升级,这场技术迁移浪潮背后的驱动力值得深入探究。

二、Containerd核心优势解析

1. 架构精简度对比

指标

Docker

Containerd

守护进程数量

3 (Docker,containerd,runC)

1 (containerd)

内存占用

100MB+

30-50MB

CRI调用链路

需Docker-shim转换

原生支持

冷启动时间

1.2s

0.8s

(数据来源:CNCF 2024容器运行时基准测试报告)

2. 关键技术优势

  • 原生CRI集成:消除Docker-shim带来的性能损耗

  • 资源占用优化:减少30%的节点内存开销

  • 安全增强:最小化攻击面,符合NSA/CISA容器安全基线

  • 镜像管理革新:支持Stargz懒加载,加速大规模镜像分发

三、生产环境迁移流程

说明:我们公司使用rancher来管理和搭建集群,rancher本身是不支持指定节点来滚动升级的,我们二开了rancher,增加了指定节点来升级节点kubelet、kube-proxy等组件

###下面打标签都是在rancher的local集群进行,标签对master节点不生效### 下面所有的nodes资源指的是 rancher的 crd  nodes.management.cattle.io# 跳过升级节点,会阻塞整个集群的升级状态,当集群升级时根据需求要逐渐删除该label。所有nodes没有这个label时,集群更新成功,状态为正常qihoo.net/upgrade=false# nodes资源加上该标签,会忽略带标签的节点,该label不回阻塞升级过程,其他节点更新完成功后,集群状态会正常qihoo.net/upgrade=ignore

1. 迁移前准备

# 集群状态备份: 通过rancher页面,备份集群数据(集群状态,etcd数据等)# 环境兼容性检测 kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}' # 输出预期结果应包含"Docker"标识 #安装命令行工具crictl nerdctlwget http://xxxx.qihoo.net/kubernetes/crictlchmod +x crictlmv crictl /usr/bin/cat <<EOF > /etc/crictl.yamlruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: false EOFwget http://xxx.qihoo.net/kubernetes/nerdctlchmod +x nerdctlmv nerdctl /usr/bin/# 集群需要升级containerd节点暂时先全部打上label#获取nodeskubectl get nodes.management.cattle.io -n c-9vk5r#集群所有需要升级nodes节点打上暂停升级标签kubectl label nodes.management.cattle.io -n c-xxxx  m-xxxxxxxx qihoo.net/upgrade=false#集群中不需要升级的集群打上忽略标签kubectl label nodes.management.cattle.io -n c-zv6zb  m-xxxxxxx qihoo.net/upgrade=ignore

2. 升级master节点

# 把集群master节点的pod驱逐;确认相关系统组件的pod调度到其它机器并正常运行; kubectl drain xxxxxx.qihoo.net --ignore-daemonsets --delete-local-data --grace-period=0#更改containerd的/etc/containerd/config.toml配置文件并重启containerd、docker等systemctl daemon-reloadsystemctl restart containerdsystemctl restart dockerdocker restart etcd service-sidekick kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy# 重建master节点上的daemonset的podHOSTNAME=$(hostname)for i in $(kubectl get pod -A -owide |grep ${HOSTNAME}|awk '{print $1"@"$2}')do  ns=$(echo $i|awk -F'@' '{print $1}')  po=$(echo $i|awk -F'@' '{print $2}')  kubectl delete po -n${ns} ${po} --forcedone

更改rancher中集群配置使用containerd

修改完成后,集群会升级master节点,等待master节点升级完成,原有的master上的ds的 pods 默认会重新创建;在重建过程中,对于一些 其他pod,可能需要人工干预去重建,然后在清理docker运行时下的残留进程。

检查master节点升级成功,确保上面的pod正常。

kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}'
3. 按照滚动比例升级node节点

需要升级的节点先驱逐,然后删除对应rancher nodes 资源的label,就开始升级

#驱逐节点
kubectl drain xxxxxx.qihoo.net --ignore-daemonsets --delete-emptydir-data --grace-period=0 --force
# 更改containerd的/etc/containerd/config.toml配置文件并重启containerd、docker等systemctl daemon-reloadsystemctl restart containerdsystemctl restart dockerdocker restart kubelet kube-proxy nginx-proxy
# 删除对应机器label,机器开始升级;注意更换 -n c-zv6zb  m-3ba9e952bcfbkubectl label nodes.management.cattle.io -n c-zv6zb  m-3ba9e952bcfb qihoo.net/upgrade-
# 等机器更新完成后,删除机器上的daemonset的podHOSTNAME=$(hostname)for i in $(kubectl get po -A -owide |grep ${HOSTNAME}|awk '{print $1"@"$2}')do  ns=$(echo $i|awk -F'@' '{print $1}')  po=$(echo $i|awk -F'@' '{print $2}')  kubectl delete po -n${ns} ${po} --forcedone
# 查看 node 运行时为 containerd

四、企业级实践案例

案例:公司迁移成效

指标

迁移前(Docker)

迁移后(Containerd)

提升幅度

Pod启动延迟

2.3s

1.1s

52%

节点内存占用

1.8GB

1.2GB

33%

CI/CD流水线耗时

14分钟

9分钟

36%

五、常见问题解决方案

Q1: 如何兼容遗留Docker命令?

# 安装nerdctl增强工具 sudo containerd-rootless-setuptool.sh install alias docker=nerdctl

Q2: 镜像存储如何迁移?

# 导出Docker镜像 docker save myapp:v1 > myapp.tar # 导入Containerd nerdctl load -i myapp.tar

Q3: 监控体系如何适配?

推荐部署方案:

  • Prometheus + cAdvisor 2.8+(支持Containerd指标)

  • Grafana仪表盘ID 13105(Containerd专项监控模板)

六、未来演进方向

随着2025年Kubernetes 1.30版本发布,容器运行时生态将迎来新变革:

  1. WasmEdge集成:支持WebAssembly工作负载

  2. 硬件加速支持:NVIDIA Container Toolkit 3.0深度优化

  3. 统一镜像规范:OCI Artifact全面普及

结语

容器运行时的升级不仅是技术组件的简单替换,更是云原生架构持续进化的必经之路。选择Containerd不仅意味着获得性能提升,更是拥抱开放标准的战略决策。建议结合自身技术栈,制定渐进式迁移计划,充分利用CNCF生态工具链实现平滑过渡。


更多技术干货,

请关注“360智汇云开发者”👇

360智汇云官网:https://zyun.360.cn(复制在浏览器中打开)

更多好用又便宜的云产品,欢迎试用体验~

 添加工作人员企业微信👇,get更快审核通道+试用包哦~

图片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30-消息队列

一、消息队列概述 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、 中断和任务间传递信息&#xff0c;实现了任务接收来自其他任务或中断的不固定长度的消息&#xff0c;任务能够从队列里面读取消息&#xff0c;当队列中的…

AI Agent开发第74课-解构AI伪需求的魔幻现实主义

开篇 🚀在之前的系列中我们狂炫了AI Agent的各种高端操作(向量数据库联动、多模态感知、动态工作流等…),仿佛每个程序员都能用LLM魔法点石成金✨。 但今天咱们要泼一盆透心凉的冷水——当企业把AI当成万能胶水强行粘合所有需求时,连电风扇都能被玩出量子纠缠的魔幻现实…

低代码AI开发新趋势:Dify平台化开发实战

在人工智能快速发展的今天&#xff0c;AI应用的开发方式也在不断演变。从传统的手写代码到如今的低代码甚至零代码开发&#xff0c;技术的进步让更多的非专业开发者也能轻松上手。本文将带你走进Dify平台化开发的世界&#xff0c;探索如何通过这一强大的低代码AI开发平台&#…

开发积累总结

export default 和export const 均用于从模块导出函数、对象或原始值&#xff0c;区别在于&#xff1a; export default&#xff1a;一个文件中只能有一个&#xff0c;为默认导出&#xff0c;在引用时指定名字。 export const&#xff1a;一个文件中有多个&#xff0c;为命名…

【TCP/IP协议族详解】

目录 第1层 链路/网络接口层—帧&#xff08;Frame&#xff09; 1. 链路层功能 2. 常见协议 2.1. ARP&#xff08;地址解析协议&#xff09; 3. 常见设备 第2层 网络层—数据包&#xff08;Packet&#xff09; 1. 网络层功能 2. 常见协议 2.1. ICMP&#xff08;互联网…

vocabulary in program

编号意思&#xff08;英译中&#xff09;音标单词1n. 稀薄&#xff1b;稀罕&#xff1b;珍奇/ˈreərɪsn/rareness2n.登记表&#xff0c;注册簿&#xff1b;注册员&#xff1b;&#xff08;人或乐器的&#xff09;声区&#xff0c;音区&#xff1b;&#xff08;适合特定场合使…

整平机技术进阶:从原理到实战的深度解析

一、整平机的力学原理与数学模型 整平机的核心在于通过材料塑性变形消除内应力&#xff0c;其力学过程可简化为以下模型&#xff1a; 弹塑性变形理论 当材料通过辊轮时&#xff0c;表层受拉应力&#xff0c;芯部受压应力&#xff0c;超过屈服强度后产生永久变形。 关键公式&a…

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter1 初识小程序 - 3项目目录结构4快速上手

3 项目目录结构 3.1 项目目录结构 3.1.1 目录介绍 # 1 项目主配置文件&#xff0c;在项目根路径下&#xff0c;控制整个项目的-app.js # 小程序入口文件&#xff0c;小程序启动&#xff0c;会执行此js-app.json # 小程序全局配置文件&#xff0c;配置小程序导航栏颜色等信息…

427. 建立四叉树

https://leetcode.cn/problems/construct-quad-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150思路&#xff1a;这题乍一看很复杂但是只要读懂题找到规律就会发现其实很简单 四叉树的构造规律&#xff1a; 1. 如果一个区域的值全相等&#xff0c;那么这个…

IDEA中创建SpringBoot项目没有Java8

IDEA中创建SpringBoot项目没有Java8 文章目录 IDEA中创建SpringBoot项目没有Java8一&#xff1a;解决办法 很久没单独创建springboot项目,今天使用idea的Spring Initializr 创建 Spring Boot项目时,发现java版本里,无法选择jdk1.8,只有17、21、22,所以本文介绍了使用Spring Ini…

聊一聊手动测试与探索性测试的区别

目录 一 定义与目标 手动测试 探索性测试 二 执行方式 手动测试 探索性测试 三 测试重点及计划性 手动测试 探索性测试 四 测试效率及成本 手动测试 探索性测试 五 优缺点对比 六 关键却别与总结 七 适应场景 手动测试 探索性测试 八 实际应用与结合 在我们进…

Spring用到的设计模式

Spring框架中广泛应用了多种设计模式&#xff0c;以提升代码的灵活性和可维护性。 工厂模式&#xff1a;BeanFactory&#xff0c;整个 IoC 容器就是一个工厂。 单例模式&#xff1a;Spring 管理的 Bean 默认都是单例的。 模版方法&#xff1a;如 RedisTemplate、JdbcTemplat…

Mybatis(2)

sql注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;攻击者通过在输入字段中插入恶意SQL代码&#xff0c;绕过应用程序的安全机制&#xff0c;直接操纵数据库。 SQL注入的原理 SQL注入利用应用程序未对用户输入进行充分过滤或转义的漏洞。当用户输入被直接拼接到S…

【Node.js】高级主题

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js 高级主题概览1.1 高级主题架构图 2. 事件循环与异步编程深度解析2.1 事件循环机制详解事件循环阶段详解 2.2 异步编程模式演进高级异步模式实现 3. 内存管理与性能优化3.1 V8 内存管理机制内存监控…

冰箱热交换的原理以及如何加氟

冰箱如何加氟&#xff1a; 氟利昂被节流装置降压后&#xff0c;进入冰箱的蒸发器&#xff0c;此时它处于低温低压液态状态。在冰箱内部&#xff08;例如 0C 或 -10C&#xff09;&#xff1a;它很容易气化&#xff08;因为其沸点很低&#xff09;在气化过程中吸收周围热量。 1…

WordPress多语言插件安装与使用教程

WordPress多语言插件GTranslate的使用方法 在wordpress网站后台搜索多语言插件GTranslate并安装&#xff0c;安装完成、用户插件后开始设置&#xff0c;以下为设置方法&#xff1a; 1、先在后台左侧找到Gtranslate&#xff0c;进入到设置界面 2、选择要显示的形式&#xff0c…

DELL EMC PowerStore BBU更换手册

写在前面 上周给客户卖了一个BBU电池&#xff0c;客户要写一个更换方案。顺利完成了更换&#xff0c;下面就把这个更换方案给大家share出来&#xff0c;以后客户要写&#xff0c;您就Ctrlc 和Ctrlv就可以了。 下面的步骤是最理想的方式&#xff0c;中间没有任何的问题&#xff…

FastMCP:为大语言模型构建强大的上下文和工具服务

FastMCP&#xff1a;为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已经成为许多应用的核心。然而&#xff0c;如何让这些模型更好地与外部世界交互&#xff0c;获取实时信息&#xff0c;执行特定任务&a…

CMake基础:CMakeLists.txt 文件结构和语法

目录 1.CMakeLists.txt基本结构 2.核心语法规则 3.关键命令详解 4.常用预定义变量 5.变量和缓存 6.变量作用域与传递 7.注意事项 1.CMakeLists.txt基本结构 CMakeLists.txt 是 CMake 构建系统的核心配置文件&#xff0c;采用命令式语法组织项目结构和编译流程。主要用于…

战略-2.1 -战略分析(PEST/五力模型/成功关键因素)

战略分析路径&#xff0c;先宏观&#xff08;PEST&#xff09;、再产业&#xff08;产品生命周期、五力模型、成功关键因素&#xff09;、再竞争对手分析、最后企业内部分析。 本文介绍&#xff1a;PEST、产品生命周期、五力模型、成功关键因素、产业内的战略群组 一、宏观环境…