当前位置: 首页 > article >正文

Linux二进制部署K8s集群的平滑升级教程

一、升级前的准备工作

  1. 备份集群配置和数据

    • 备份/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安装。

  2. 检查集群状态

    • 确保集群中所有节点的状态正常,所有Pod都在运行状态。
    • 检查集群中是否有未完成的作业或任务,避免升级过程中出现意外。

二、升级控制平面节点(master节点)

  1. 升级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/
      
  2. 验证kubeadm版本

    • 执行kubeadm version命令,确认版本已升级到目标版本。
  3. 检查升级计划

    • 执行kubeadm upgrade plan命令,检查集群是否可以升级,并获取目标版本信息。
  4. 执行控制平面升级

    • 执行kubeadm upgrade apply v1.29.10命令,开始升级控制平面组件。
    • 该命令会自动下载并安装新版本的控制平面组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。
  5. 腾空master节点

    • 将master节点标记为不可调度,并驱逐所有负载:

      bash复制

      kubectl drain k8s-master --ignore-daemonsets
      
  6. 升级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
      
  7. 解除节点保护

    • 将master节点标记为可调度:

      bash复制

      kubectl uncordon k8s-master
      

三、升级工作节点

  1. 逐个升级工作节点

    • 每次只升级一个工作节点,以确保集群在升级过程中仍能正常运行。
  2. 升级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/
      
  3. 腾空工作节点

    • 将工作节点标记为不可调度,并驱逐所有负载:

      bash复制

      kubectl drain k8s-node1 --ignore-daemonsets
      
  4. 升级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
      
  5. 解除节点保护

    • 将工作节点标记为可调度:

      bash复制

      kubectl uncordon k8s-node1
      
  6. 重复以上步骤

    • 对其他工作节点重复上述升级步骤,直到所有工作节点都升级完成。

四、验证升级结果

  1. 检查集群状态
    • 执行kubectl get nodes命令,确认所有节点的状态为Ready
    • 执行kubectl get pods -A命令,检查所有Pod的状态是否正常。
  2. 验证集群功能
  • 部署一个简单的应用(如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页面,说明集群功能正常。

  1. 检查日志

    • 查看控制平面组件和kubelet的日志,确认没有异常错误信息:

      bash复制

      journalctl -u kube-apiserver
      journalctl -u kube-controller-manager
      journalctl -u kube-scheduler
      journalctl -u kubelet
      

五、清理旧版本组件

  1. 清理旧版本的二进制文件

    • 如果旧版本的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>
      
  2. 清理旧版本的容器镜像

    • 使用docker命令清理旧版本的Kubernetes镜像:

      bash复制

      docker images | grep '<old-k8s-version>' | awk '{print $3}' | xargs docker rmi
      

六、注意事项

  1. 版本兼容性
    • 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是calico作为CNI插件,需要确保其版本与新版本的Kubernetes兼容。
  2. 升级顺序
    • 严格按照控制平面节点(master节点)先升级,然后逐个工作节点升级的顺序进行操作,避免出现集群不可用的情况。
  3. 监控集群状态
    • 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用kubectl命令或集群监控工具(如Prometheus、Grafana等)来监控集群状态。
  4. 回滚方案
    • 如果升级过程中出现问题,需要有回滚方案。可以使用之前备份的配置文件和数据进行恢复,或者重新安装旧版本的Kubernetes组件。

七、常见问题及解决方法

  1. Pod无法调度

    • 如果在升级过程中,某些Pod无法调度到节点上,可能是节点状态异常或资源不足。可以通过以下命令检查节点状态:

      bash复制

      kubectl get nodes
      kubectl describe node <node-name>
      

      根据检查结果,解决节点状态问题或清理节点上的资源。

  2. 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集群。

  3. 网络插件问题

    • 如果在升级后,Pod之间的网络通信出现问题,可能是网络插件配置不正确或版本不兼容。可以参考网络插件的官方文档,检查和更新网络插件的配置。

通过以上步骤和注意事项,您可以顺利完成Linux二进制部署的Kubernetes集群的平滑升级。在升级过程中,务必谨慎操作,确保集群的稳定性和可用性。

相关文章:

Linux二进制部署K8s集群的平滑升级教程

一、升级前的准备工作 备份集群配置和数据 备份/etc/kubernetes/目录&#xff0c;其中包含Kubernetes集群的配置文件。 备份/var/lib/etcd/目录&#xff0c;其中存储了etcd数据库的数据。 使用etcdctl工具备份etcd数据&#xff1a; bash复制 ETCDCTL_API3 etcdctl snapshot s…...

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角&#xff0c;新建工程或者选择“文件”-“新建工程”&#xff0c;选择工程类型“标准工程”选择设备类型和编程语言&#xff0c;并指定工程文件名及保存路径&#xff0c;如下图所示&#xff1a; 选择工程类型为“标准工程” 选择主模块机型&#x…...

图像处理算法研究的程序框架

目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架&#xff0c;如下图所示 在该框架中&#xff0c;将图像处…...

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…...

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起&#xff0c;讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move&#xff08;移动&#xff09;的缩写&#xff0c;其功能为&#xff1a;1.剪切文件、目录。2.重命名 先演示下重命名&#xff0c;假设我想把当前目录下的di34改成dir5 那…...

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…...

[C++技能提升]类注册

最近在做AI信息在各个平台流转的框架设计&#xff0c;想要设计一种可以灵活扩展、不改变原有代码的框架&#xff0c;了解到了类注册。 具体需求是这样的&#xff1a;AI算法在客户本地电脑和云端都有部署&#xff0c;原先AI在这两个平台下的输出格式并不统一&#xff0c;且每个…...

OpenHarmony 5.0.2 Release来了!

版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善&#xff0c;以快速迭代的方式推出API 14&#xff0c;相比5.0.1 Release版本&#xff0c;重点做出了如下特性新增或增强&#xff1a; 进一步增强ArkUI、图形图像的能力&#xff0c;提供更多组件的高级属性…...

80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL

53&#xff0c;【3】BUUCTF WEB october 2019 Twice SQLinjection-CSDN博客 上面这个链接是我第一次接触二次注入 这道题也涉及了 对二次注入不熟悉的可以看看 BUUCTF出了点问题&#xff0c;打不开&#xff0c;以下面这两篇wp作为学习对象 [SUCTF 2018]MultiSQL-CSDN博客 …...

NR_shell运行流程简析

nr_shell 是一套开源 shell 框架&#xff0c;基于框架可创建终端交互功能。 为了记录终端输入指令&#xff0c;以及进行解析处理&#xff0c;nr_shell 提供了一套 cmd 结构体&#xff0c;具体如下&#xff1a;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]不在累加&#xff0c;但是其他任务OsAlarm_1ms_Core2、OsAlarm_5ms_Core2、OsAlarm_10ms_Core2、OsAlarm_20ms_Core2 任务计数值累加正常。 如果是任务栈溢出&a…...

Spring FatJar写文件到RCE分析

背景 现在生产环境部署 spring boot 项目一般都是将其打包成一个 FatJar&#xff0c;即把所有依赖的第三方 jar 也打包进自身的 app.jar 中&#xff0c;最后以 java -jar app.jar 形式来运行整个项目。 运行时项目的 classpath 包括 app.jar 中的 BOOT-INF/classes 目录和 BO…...

百度APP iOS端磁盘优化实践(上)

01 概览 在APP的开发中&#xff0c;磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长&#xff0c;如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验&#xff0c;详细介绍iOS沙盒环境下的文件存储规范&#xff0c;探讨业务缓…...

蓝桥杯之c++入门(一)【第一个c++程序】

目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题&#xff08;点击跳转链接&#xff09;练习1&#xff1a;Hello,World!练习2&#xff1a;打印飞机练习3&#xff1a;第⼆个整数练习4&#xff…...

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…...

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…...

InceptionV1_V2

目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务&#xff1a;图像分类&#xff08;以 CIFAR-10 数据集为例&#xff09; Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…...

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …...

【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...

【测试人生】变更风险观测的流程逻辑设计

在线上服务变更过程中&#xff0c;我们希望可以通过一套实时观测机制去监测线上服务的风险&#xff0c;从而能够确保线上稳定性&#xff0c;在出问题是可以及时回滚变更。今天这篇文章&#xff0c;就简单讲一下变更风险观测的流程逻辑需要怎么设计。 首先需要明确变更观测的相…...

一文大白话讲清楚webpack基本使用——17——Tree Shaking

文章目录 一文大白话讲清楚webpack基本使用——17——Tree Shaking1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥叫Tree Shaking3. 什么是死代码&#xff0c;怎么来的3. Tree Shaking的流程3.1 标记3.2 利用Terser摇起来 4. 具体使用方式4.1 适用前提…...

ChatGPT从数据分析到内容写作建议相关的46个提示词分享!

在当今快节奏的学术环境中&#xff0c;研究人员面临着海量的信息和复杂的研究任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;像ChatGPT这样的先进工具为科研人员提供了强大的支持。今天就让我们一起探索如何利用ChatGPT提升研究效率进一步优化研究流程。 ChatG…...

PyCharm配置Python环境

1、打开PyCharm项目 可以从File-->Open-->选择你的项目路径-->OK&#xff0c;或者直接点击Open&#xff0c;找到项目路径-->OK&#xff0c;如图所示(点击Ok后可能有下面的弹窗&#xff0c;选择“Trust Project”即可&#xff0c;然后选择“New Window”打开项目) …...

c#配置config文件

1&#xff0c;引用命名空间 Configuration 及配置信息...

RDMA 工作原理 | 支持 RDMA 的网络协议

注&#xff1a;本文为 “RDMA” 相关文章合辑。 英文引文机翻未校。 图片清晰度受引文所限。 Introduction to Remote Direct Memory Access (RDMA) Written by: Dotan Barak on March 31, 2014.on February 13, 2015. What is RDMA? 什么是 RDMA&#xff1f; Direct me…...

01-硬件入门学习/嵌入式教程-CH340C使用教程

前言 CH340C广泛应用于DIY项目和嵌入式开发中&#xff0c;用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器&#xff0c;可以将电脑的USB数据转换成串口数据&#xff0c;方便与单片机&#xff…...

STM32——LCD

一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然&#xff0c;后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...

破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度?

破解浏览器渲染“死锁”&#xff1a;CSS与JS如何影响页面加载速度&#xff1f; 在这个快速发展的Web世界里&#xff0c;性能是开发者们永恒的追求。当你打开一个网页&#xff0c;可能会注意到一些页面加载特别慢&#xff0c;甚至产生短暂的“白屏”&#xff0c;你有没有想过&a…...

操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之内存的划分

前言 MMU&#xff1a;内存管理单元(Memory Management Unit)完成的工作就是虚拟地址到物理地址的转换&#xff0c;可以让系统中的多个程序跑在自己独立的虚拟地址空间中&#xff0c;相互不会影响。程序可以对底层的物理内存一无所知&#xff0c;物理地址可以是不连续的&#x…...