K8S集群将Docker切换到Containerd
文章目录
- 1. 开启节点维护
- 1.1 将节点设置成不可调度
- 1.2 驱逐节点上的 Pod
- 1.3 停止相关服务
- 2. 升级到 containerd
- 2.1 安装 containerd
- 2.2 调整 containerd 配置
- 2.3 修改 kubelet 启动配置参数
- 3. 重启节点服务
- 4. 验证升级后的节点
- 5. 容器管理工具
- 5.1 容器管理命令行工具对比
- 5.2 crictl 命令行工具安装
- 6. 总结
1. 开启节点维护
开启节点维护,目的是将待维护节点上通过 Deployment 部署的 Pod 驱离该节点,使其在另外的正常节点上运行,从而保障服务的连续性。但是如果我们服务的实例个数是1时,当服务被驱离时,服务将会中断,服务的连续性将无法得到保障,需要等待服务在另外的节点上运行启动后,服务才能恢复。所以,生产环境为了不影响正常的业务运行,最好能够将服务的实例数最小设置2个实例。
1.1 将节点设置成不可调度
kubectl cordon k8s-node1
查看节点的状态是否被设置成了不可调度状态

如上图 k8s-node1 节点已经被设置成了不可调度状态。
1.2 驱逐节点上的 Pod
kubectl drain k8s-node1 --ignore-daemonsets

执行完上述命令后,k8s-node1 节点上除了 daemon set 启动的 Pod 外,通过 deployment 启动的 Pod 都会被驱离到其他可调度的节点上重新启动。
通过将待升级的节点设置成维护模式,从而保障业务服务能够在集群升级过程中正常的提供服务。
1.3 停止相关服务
systemctl stop kubelet
systemctl stop containerd
systemctl disable docker
systemctl stop docker
systemctl disable cri-docker
systemctl stop cri-docker
2. 升级到 containerd
2.1 安装 containerd
- 卸载 docker 相关功能
yum remove docker docker-client ocker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker-ce
- 安装或升级 containerd 服务
yum install containerd
2.2 调整 containerd 配置
- 导出默认配置
containerd config default > /etc/containerd/config.toml
- 编辑 /etc/containerd/config.toml 文件
sandbox_image = "registry.k8s.io/pause:3.6"替换成sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = false替换成[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true
添加国内镜像仓库,这个非常关键,否则将会导致镜像下载失败,Pod中服务无法启动。
[plugins."io.containerd.grpc.v1.cri".registry]......[plugins."io.containerd.grpc.v1.cri".registry.mirrors]在containerd 配置文件中找到上边内容,并在此处添加下边两行, 注意缩进,下边两行内容与上边一行有2个空格的缩进,下边两行内容之间也存在2个空格的缩进。[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
2.3 修改 kubelet 启动配置参数
在 kubelet 启动文件中添加或修改下边两个变量的参数值
--container-runtime=remote
--container-runtime-endpoint=unix:///run/containerd/containerd.sock
3. 重启节点服务
- 重启 containerd 服务
systemctl daemon-reload
systemctl enable containerd
systemctl start containerd
- 查看 containerd 服务启动状态
systemctl status containerd

- 重新启动 kubelet
systemctl start kubelet
- 查看 kubelet 服务状态
systemctl status kubelet

- 取消节点维护状态
kubectl uncordon k8s-node1
- 查看节点信息
kubectl get nodes -o wide

如上图中 k8s-node1 节点已经变成 Ready 状态,并且 CONTAINER-RUNTIME 已经变成了 containerd://1.6.18。表示 k8s-node1 节点已经从 docker 容器切换成 containerd 容器。
4. 验证升级后的节点
如果 calico-node 采用 daemon set 的方式部署,那么当k8s节点升级 containerd 容器运行时后,重启 containerd 和 kubelet 之后,calico-node 将会在升级后的节点上重新运行,可通过查看升级后节点是否成功启动 calico-node 的Pod来判断节点是否升级成功。

如上图所示,k8s-node1 节点上的 calico cni Pod 正在自动部署。如下图所示,k8s-node1 节点上的 calico-node Pod已经成功运行起来。

5. 容器管理工具
5.1 容器管理命令行工具对比
| 功能 | docker | ctr | crictl |
|---|---|---|---|
| 查看容器列表 | docker ps | ctr -n k8s.io c ls | crictl ps |
| 容器内执行命令 | docker exec | - | crictl exec |
| 挂载容器 | docker attach | - | crictl attach |
| 拉取镜像 | docker pull | ctr -n k8s.io i pull | crictl pull |
| 推送镜像 | docker push | ctr -n k8s.io i push | - |
| 删除镜像 | docker rmi | - | crictl rmi |
使用 containerd 替代 docker 作为 k8s 的容器运行时之后,docker 命令行工具需要通过 ctr 或 crictl 来替换。ctr 是 containerd 提供的容器管理命令行工具,但是 ctr 相较于 crictl 功能相对较弱,所以,当 docker 切换到 containerd 之后,建议使用 crictl 命令行工具来管理容器,使用 crictl 命令行工具需要另行安装。
containerd 存储 k8s 相关的数据在 k8s.io 空间中,默认情况下使用 ctr 操作的是 default 空间的数据。所以,如果想要在 k8s 中使用 containerd default 空间的数据,可以将 default 空间中的镜像导出,然后导入到 k8s.io 空间。
- 导出 default 空间中的镜像,例如导出 calico cni 镜像
ctr -n default images export --platform=linux/amd64 cni.tar.gz docker.io/calico/cni:v3.24.5
- 导入 calico cni 镜像到 k8s.io 空间
ctr -n k8s.io i import cni.tar.gz
5.2 crictl 命令行工具安装
- crictl 源码地址
https://github.com/kubernetes-sigs/cri-tools/releases
- 下载 Linux x64 版本工具
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.0/crictl-v1.26.0-linux-amd64.tar.gz
- 解压并安装
tar -zxvf crictl-v1.26.0-linux-amd64.tar.gz -C /usr/local/bin
- 配置crictl参数
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
将会生成 /etc/crictl.yaml 配置文件。到此 crictl 命令行工具安装完成,以前通过 docker 命令操作的指令,后续可以使用 crictl 执行。
6. 总结
- 将 docker 容器运行时替换成 containerd 时,可以逐个节点进行替换,这样能够保证服务的连续性。
- 使用 containerd 替换 docker 后,对于 k8s 1.20 以后的版本,不再需要 cri-docker 服务对 docker 容器运行时进行中转。
- k8s 集群相关组件,只需要修改 kubelet 启动参数,不需要调整 kube-apiserver,kube-scheduler,kube-controller-manager,kube-proxy等组件。
相关文章:
K8S集群将Docker切换到Containerd
文章目录1. 开启节点维护1.1 将节点设置成不可调度1.2 驱逐节点上的 Pod1.3 停止相关服务2. 升级到 containerd2.1 安装 containerd2.2 调整 containerd 配置2.3 修改 kubelet 启动配置参数3. 重启节点服务4. 验证升级后的节点5. 容器管理工具5.1 容器管理命令行工具对比5.2 cr…...
Kubernetes03:kubernetes 功能和架构
2.1 概述 Kubernetes 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过 Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容 器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环…...
LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见
LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见想使用NI分布式系统管理器监测网络连接实时控制器的CPU和内存使用情况。从左侧窗口的树中选择了感兴趣的实时目标,然后通过选择视图自动视图来确保启用自动查看。希望看到CPU/内存选项卡,但它有显…...
buu [NPUCTF2020]Classical Cipher 1
题目描述: 题目分析: 首先输入密码 {gsv_pvb_rh_zgyzhs} 后,得到:可以得知密码是错误的,再看看密码 {gsv_pvb_rh_zgyzhs} ,排列无序,那么尝试用凯撒与栅栏解密,发现还是解不出&…...
分享96个HTML体育竞技模板,总有一款适合您
分享96个HTML体育竞技模板,总有一款适合您 96个HTML体育竞技模板下载链接:https://pan.baidu.com/s/1k2vJUlbd2Boduuqqa0EWMA?pwdj8ji 提取码:j8ji Python采集代码下载链接:采集代码.zip - 蓝奏云 北京奥运火炬PSD模板 奥运…...
Python pandas「原有或者新建」Excel中「追加新或者新建」sheet
1.pandas原有Excel中追加新sheet 使用Pandas库,我们可以轻松将数据追加到现有的Excel工作簿中的新工作表中。以下是追加新工作表的简单步骤: 读取现有的Excel文件 使用Pandas库中的read_excel()函数读取现有的Excel文件。指定Excel文件的路径和文件名&a…...
程序员必备的软技能- CPU“没有灵魂的躯体”
引言 先引用一段比较有意思的论述: 现实中每个人是由两部分构成,灵魂和躯体,灵魂依附于躯体游走于世间,现实中我们面对的每个人其实面对的是其灵魂而非肉体,肉体不过是表象而已。 灵魂本性乃一恶物,寄生于…...
基于微信小程序的青少年生理健康知识小助手
基于微信小程序的青少年生理健康知识小助手 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目…...
【scl】博图程序的导入和导出
导入或者导出博图文件的方法(也叫移植文件) 目录 前言 编辑 编辑 前言 本篇文章主要写一下关于博图文件的导入和导出,具体要怎么样才能将写好的程序或者块移植到其他地方,下面我们一起来看! 一、程序块的导入和导…...
【C语言】指针进阶
目录 一、字符指针 二、指针数组 三、数组指针 四、数组指针的使用 五、函数指针数组 六、指向函数指针数组的指针 七、回调函数 我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是…...
18:CTK 总结篇(FAQ)
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 经过了几个月的艰苦奋战,终于到了最后一节啦,是不是和我一样,心里有点儿小激动! 回顾之前的章节,从初级 -> 进阶 -> 高级,我们针对 CTK 做了详细的分类讲解。希望通过这些知识,大家能对模块化…...
概论_第7章_参数估计_真题__求置信区间
真题 2014.10 第30题 测量某物体的质量9次, 测得平均值 x‾15.4\overline x 15.4x15.4 g, 已知测量数据 XXX ~ N(μ,0.09)N(\mu, 0.09)N(μ,0.09) (1) 求该物体质量的置信度为0.95 的置信区间; (2)为了使置信度为0.95 的置信区间…...
Go 1.21的2个语言变化
语言行为变化 Go 1.20已经于今年2月份发布,Go 1.21也不远了,我们来先堵为快,看看Go 1.21版本里几个有趣的变化。 文末附送2道面试题。 panic(nil) func main() {defer func() {print(recover() nil)}()panic(nil) }大家先想一想这段代码…...
Mysql(一)架构、存储引擎、数据结构
目录一、mysql架构二、存储引擎三、数据类型一、mysql架构 与其它数据库相比,MySQL的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离,可…...
php 项目网站怎么实现负载均衡?
负载均衡是一种通过分担请求以保证系统可用性和稳定性的技术。在 PHP 项目网站中,可以使用以下几种方法实现负载均衡:软件负载均衡:使用软件如 HAProxy、Nginx 等实现负载均衡,将请求转发到多个后端服务器上。硬件负载均衡&#x…...
win11+pytorch1.7.0+python3.8(也可以是python3.7)+cuda11.0
win11pytorch1.7.0python3.8cuda11.0写在最前面一. 软件配备二. 创建虚拟环境2.1 创建环境名称,并选择‘y’2.2.进入虚拟环境三. 安装pytorch四. 安装虚拟环境下的notebook4.1 安装ipykernel,并选择‘y’,直至安装完成4.2 将环境名注册到note…...
基于jeecgboot的flowable流程设计器的几个bug修复
因为今天在用任务监听器的时候,出现几个bug,所以一并修复与处理。 一、建立任务监听器后,删除不了 主要有两个原因,一个是点击删除没反应,实际上是弹出框跑到后面去了,说明还是z-index问题,调整…...
SAP MM 配置变式物料
创建一个变式物料大概需要经过一下几个阶段; 1、创建物料主数据(MM01); 2、创建特性值(CT04); 3、创建变量类(CL02); 4、创建配置文件(CU41&a…...
Quartz与SpringBoot 搞定任务调度
一、Quartz简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java…...
SciencePlots绘图
简介 使用Python作为核心开发工具的机器学习和深度学习研究者自然会希望使用Matplotlib进行科研图表的绘制,但是Matplotlib默认的样式并不适合科研论文的出版,而SciencePlots就是为此定制的一系列科研绘图样式库,可以绘制很合适科研图表。 …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
