Linux二进制部署K8s集群的平滑升级教程
一、升级前的准备工作
-
备份集群配置和数据
-
备份
/etc/kubernetes/目录,其中包含Kubernetes集群的配置文件。 -
备份
/var/lib/etcd/目录,其中存储了etcd数据库的数据。 -
使用
etcdctl工具备份etcd数据:bash复制
ETCDCTL_API=3 etcdctl snapshot save /data/etcd/etcd_bak.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key如果没有
etcdctl工具,可通过yum install -y etcd安装。
-
-
检查集群状态
- 确保集群中所有节点的状态正常,所有Pod都在运行状态。
- 检查集群中是否有未完成的作业或任务,避免升级过程中出现意外。
二、升级控制平面节点(master节点)
-
升级kubeadm
-
下载新版本的kubeadm二进制文件,并替换旧版本文件。例如,下载1.29.10版本:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm chmod +x kubeadm sudo mv kubeadm /usr/local/bin/
-
-
验证kubeadm版本
- 执行
kubeadm version命令,确认版本已升级到目标版本。
- 执行
-
检查升级计划
- 执行
kubeadm upgrade plan命令,检查集群是否可以升级,并获取目标版本信息。
- 执行
-
执行控制平面升级
- 执行
kubeadm upgrade apply v1.29.10命令,开始升级控制平面组件。 - 该命令会自动下载并安装新版本的控制平面组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。
- 执行
-
腾空master节点
-
将master节点标记为不可调度,并驱逐所有负载:
bash复制
kubectl drain k8s-master --ignore-daemonsets
-
-
升级kubelet和kubectl
-
下载新版本的kubelet和kubectl二进制文件,并替换旧版本文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl chmod +x kubelet kubectl sudo mv kubelet /usr/local/bin/ sudo mv kubectl /usr/local/bin/ -
重启kubelet服务:
bash复制
sudo systemctl daemon-reload sudo systemctl restart kubelet
-
-
解除节点保护
-
将master节点标记为可调度:
bash复制
kubectl uncordon k8s-master
-
三、升级工作节点
-
逐个升级工作节点
- 每次只升级一个工作节点,以确保集群在升级过程中仍能正常运行。
-
升级kubeadm
-
在工作节点上,下载并安装新版本的kubeadm二进制文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm chmod +x kubeadm sudo mv kubeadm /usr/local/bin/
-
-
腾空工作节点
-
将工作节点标记为不可调度,并驱逐所有负载:
bash复制
kubectl drain k8s-node1 --ignore-daemonsets
-
-
升级kubelet和kubectl
-
下载并安装新版本的kubelet和kubectl二进制文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl chmod +x kubelet kubectl sudo mv kubelet /usr/local/bin/ sudo mv kubectl /usr/local/bin/ -
重启kubelet服务:
bash复制
sudo systemctl daemon-reload sudo systemctl restart kubelet
-
-
解除节点保护
-
将工作节点标记为可调度:
bash复制
kubectl uncordon k8s-node1
-
-
重复以上步骤
- 对其他工作节点重复上述升级步骤,直到所有工作节点都升级完成。
四、验证升级结果
- 检查集群状态
- 执行
kubectl get nodes命令,确认所有节点的状态为Ready。 - 执行
kubectl get pods -A命令,检查所有Pod的状态是否正常。
- 执行
- 验证集群功能
-
部署一个简单的应用(如nginx)来测试集群功能是否正常。以下是部署nginx的示例:
yaml复制
apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploymentnamespace: default spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80 --- apiVersion: v1 kind: Service metadata:name: nginx-servicenamespace: default spec:type: NodePortselector:app: nginxports:- protocol: TCPport: 80targetPort: 80nodePort: 30001将上述内容保存为
nginx.yaml文件,然后执行以下命令进行部署:bash复制
kubectl apply -f nginx.yaml -
验证nginx服务是否正常运行:
bash复制
kubectl get pods -o wide kubectl get svc访问
http://<NodeIP>:30001,如果能够正常访问nginx页面,说明集群功能正常。
-
检查日志
-
查看控制平面组件和kubelet的日志,确认没有异常错误信息:
bash复制
journalctl -u kube-apiserver journalctl -u kube-controller-manager journalctl -u kube-scheduler journalctl -u kubelet
-
五、清理旧版本组件
-
清理旧版本的二进制文件
-
如果旧版本的kubeadm、kubelet和kubectl二进制文件仍然存在,可以手动删除它们。例如:
bash复制
sudo rm /usr/local/bin/kubeadm-<old-version> sudo rm /usr/local/bin/kubelet-<old-version> sudo rm /usr/local/bin/kubectl-<old-version>
-
-
清理旧版本的容器镜像
-
使用
docker命令清理旧版本的Kubernetes镜像:bash复制
docker images | grep '<old-k8s-version>' | awk '{print $3}' | xargs docker rmi
-
六、注意事项
- 版本兼容性
- 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是
calico作为CNI插件,需要确保其版本与新版本的Kubernetes兼容。
- 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是
- 升级顺序
- 严格按照控制平面节点(master节点)先升级,然后逐个工作节点升级的顺序进行操作,避免出现集群不可用的情况。
- 监控集群状态
- 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用
kubectl命令或集群监控工具(如Prometheus、Grafana等)来监控集群状态。
- 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用
- 回滚方案
- 如果升级过程中出现问题,需要有回滚方案。可以使用之前备份的配置文件和数据进行恢复,或者重新安装旧版本的Kubernetes组件。
七、常见问题及解决方法
-
Pod无法调度
-
如果在升级过程中,某些Pod无法调度到节点上,可能是节点状态异常或资源不足。可以通过以下命令检查节点状态:
bash复制
kubectl get nodes kubectl describe node <node-name>根据检查结果,解决节点状态问题或清理节点上的资源。
-
-
etcd集群问题
-
如果etcd集群出现问题,可能导致集群无法正常工作。可以通过以下命令检查etcd集群状态:
bash复制
ETCDCTL_API=3 etcdctl endpoint status \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key如果发现etcd集群状态异常,可以尝试重启etcd服务或使用备份数据恢复etcd集群。
-
-
网络插件问题
- 如果在升级后,Pod之间的网络通信出现问题,可能是网络插件配置不正确或版本不兼容。可以参考网络插件的官方文档,检查和更新网络插件的配置。
通过以上步骤和注意事项,您可以顺利完成Linux二进制部署的Kubernetes集群的平滑升级。在升级过程中,务必谨慎操作,确保集群的稳定性和可用性。
相关文章:
Linux二进制部署K8s集群的平滑升级教程
一、升级前的准备工作 备份集群配置和数据 备份/etc/kubernetes/目录,其中包含Kubernetes集群的配置文件。 备份/var/lib/etcd/目录,其中存储了etcd数据库的数据。 使用etcdctl工具备份etcd数据: bash复制 ETCDCTL_API3 etcdctl snapshot s…...
2.1.3 第一个工程,点灯!
新建工程 点击菜单栏左上角,新建工程或者选择“文件”-“新建工程”,选择工程类型“标准工程”选择设备类型和编程语言,并指定工程文件名及保存路径,如下图所示: 选择工程类型为“标准工程” 选择主模块机型&#x…...
图像处理算法研究的程序框架
目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架,如下图所示 在该框架中,将图像处…...
计算机工程:解锁未来科技之门!
计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展,计算机技术已经深深渗透到我们生活的方方面面,从医疗、金融到教育,无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业,计算机技术的应用尤为突出。比如&a…...
Linux初识——基本指令(2)
本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…...
单片机-STM32 WIFI模块--ESP8266 (十二)
1.WIFI模块--ESP8266 名字由来: Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。…...
[C++技能提升]类注册
最近在做AI信息在各个平台流转的框架设计,想要设计一种可以灵活扩展、不改变原有代码的框架,了解到了类注册。 具体需求是这样的:AI算法在客户本地电脑和云端都有部署,原先AI在这两个平台下的输出格式并不统一,且每个…...
OpenHarmony 5.0.2 Release来了!
版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善,以快速迭代的方式推出API 14,相比5.0.1 Release版本,重点做出了如下特性新增或增强: 进一步增强ArkUI、图形图像的能力,提供更多组件的高级属性…...
80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL
53,【3】BUUCTF WEB october 2019 Twice SQLinjection-CSDN博客 上面这个链接是我第一次接触二次注入 这道题也涉及了 对二次注入不熟悉的可以看看 BUUCTF出了点问题,打不开,以下面这两篇wp作为学习对象 [SUCTF 2018]MultiSQL-CSDN博客 …...
NR_shell运行流程简析
nr_shell 是一套开源 shell 框架,基于框架可创建终端交互功能。 为了记录终端输入指令,以及进行解析处理,nr_shell 提供了一套 cmd 结构体,具体如下:typedef struct static_cmd_function_struct {char cmd[NR_SHELL_CM…...
Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置
Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…...
问题排查 - TC397 CORE2 50MS/100MS任务不运行
1、问题描述 CORE2 的任务运行次数的计数值OsTask_100ms_Core2 - task_cnt[12]、OsTask_50ms_Core2 - task_cnt[16]不在累加,但是其他任务OsAlarm_1ms_Core2、OsAlarm_5ms_Core2、OsAlarm_10ms_Core2、OsAlarm_20ms_Core2 任务计数值累加正常。 如果是任务栈溢出&a…...
Spring FatJar写文件到RCE分析
背景 现在生产环境部署 spring boot 项目一般都是将其打包成一个 FatJar,即把所有依赖的第三方 jar 也打包进自身的 app.jar 中,最后以 java -jar app.jar 形式来运行整个项目。 运行时项目的 classpath 包括 app.jar 中的 BOOT-INF/classes 目录和 BO…...
百度APP iOS端磁盘优化实践(上)
01 概览 在APP的开发中,磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长,如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验,详细介绍iOS沙盒环境下的文件存储规范,探讨业务缓…...
蓝桥杯之c++入门(一)【第一个c++程序】
目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题(点击跳转链接)练习1:Hello,World!练习2:打印飞机练习3:第⼆个整数练习4ÿ…...
14-6-1C++STL的list
(一)list容器的基本概念 list容器简介: 1.list是一个双向链表容器,可高效地进行插入删除元素 2.list不可以随机存取元素,所以不支持at.(pos)函数与[ ]操作符 (二)list容器头部和尾部的操作 list对象的默…...
【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型
摘要:我们推出了Sigma,这是一个专为系统领域设计的高效大型语言模型,其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构,并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询(Q&…...
InceptionV1_V2
目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务:图像分类(以 CIFAR-10 数据集为例) Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…...
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
前言 ORB-SLAM2源码学习:Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点,但是经过三角化成功的三维点并不一定是有效的,需要筛选才能作为初始化地图点。 …...
【ArcGIS微课1000例】0141:提取多波段影像中的单个波段
文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...
【测试人生】变更风险观测的流程逻辑设计
在线上服务变更过程中,我们希望可以通过一套实时观测机制去监测线上服务的风险,从而能够确保线上稳定性,在出问题是可以及时回滚变更。今天这篇文章,就简单讲一下变更风险观测的流程逻辑需要怎么设计。 首先需要明确变更观测的相…...
一文大白话讲清楚webpack基本使用——17——Tree Shaking
文章目录 一文大白话讲清楚webpack基本使用——17——Tree Shaking1. 建议按文章顺序从头看,一看到底,豁然开朗2. 啥叫Tree Shaking3. 什么是死代码,怎么来的3. Tree Shaking的流程3.1 标记3.2 利用Terser摇起来 4. 具体使用方式4.1 适用前提…...
ChatGPT从数据分析到内容写作建议相关的46个提示词分享!
在当今快节奏的学术环境中,研究人员面临着海量的信息和复杂的研究任务。幸运的是,随着人工智能技术的发展,像ChatGPT这样的先进工具为科研人员提供了强大的支持。今天就让我们一起探索如何利用ChatGPT提升研究效率进一步优化研究流程。 ChatG…...
PyCharm配置Python环境
1、打开PyCharm项目 可以从File-->Open-->选择你的项目路径-->OK,或者直接点击Open,找到项目路径-->OK,如图所示(点击Ok后可能有下面的弹窗,选择“Trust Project”即可,然后选择“New Window”打开项目) …...
c#配置config文件
1,引用命名空间 Configuration 及配置信息...
RDMA 工作原理 | 支持 RDMA 的网络协议
注:本文为 “RDMA” 相关文章合辑。 英文引文机翻未校。 图片清晰度受引文所限。 Introduction to Remote Direct Memory Access (RDMA) Written by: Dotan Barak on March 31, 2014.on February 13, 2015. What is RDMA? 什么是 RDMA? Direct me…...
01-硬件入门学习/嵌入式教程-CH340C使用教程
前言 CH340C广泛应用于DIY项目和嵌入式开发中,用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器,可以将电脑的USB数据转换成串口数据,方便与单片机ÿ…...
STM32——LCD
一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...
破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度?
破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度? 在这个快速发展的Web世界里,性能是开发者们永恒的追求。当你打开一个网页,可能会注意到一些页面加载特别慢,甚至产生短暂的“白屏”,你有没有想过&a…...
操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之内存的划分
前言 MMU:内存管理单元(Memory Management Unit)完成的工作就是虚拟地址到物理地址的转换,可以让系统中的多个程序跑在自己独立的虚拟地址空间中,相互不会影响。程序可以对底层的物理内存一无所知,物理地址可以是不连续的&#x…...
