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就是为此定制的一系列科研绘图样式库,可以绘制很合适科研图表。 …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
