升级 kubeadm 部署的 k8s 集群

news2024/11/16 0:57:00

文章目录

  • 一、环境
  • 二、注意事项
    • 1、备份数据
    • 2、跨版本升级
    • 3、支持的版本偏差
      • 3.1、kube-apiserver
      • 3.2、kubeklet
      • 3.3、kube-proxy
      • 3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager
      • 3.5、kubectl
    • 4、升级流程
  • 三、版本升级(补丁版本升级)
    • 1、查看当前版本
    • 2、确定要升级到的版本
    • 3、升级 master 节点
      • 3.1、升级 kubeadm
      • 3.2、验证下载的 kubeadm 版本是否正确
      • 3.3、验证升级计划
      • 3.4、根据提示,选择合适版本升级
      • 3.5、设置 master 节点进入维护状态
      • 3.6、升级 kubelet 和 kubectl
      • 3.7、重载重启 kubelet
      • 3.8、解除对 master 节点的隔离状态
      • 3.9、验证 master 节点升级情况
    • 4、升级 Worker 节点
      • 4.1、升级 kubeadm
      • 4.2、升级 kubelet 的配置
      • 4.3、设置 worker 节点为维护状态
      • 4.4、升级 kubelet 和 kubectl
      • 4.5、重载重启 kubelet
      • 4.6、解除对 worker 节点的隔离状态
    • 5、最终结果
  • 四、版本升级(次要版本升级)
    • 1、查看当前版本
    • 2、升级 master 节点
      • 2.1、升级 kubeadm
        • 2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办
      • 2.2、验证下载的 kubeadm 版本是否正确
      • 2.3、验证升级计划
      • 2.4、根据提示,选择合适版本升级
      • 2.5、设置 master 节点进入维护状态
      • 2.6、升级 kubelet 和 kubectl
      • 2.7、重载重启 kubelet
      • 2.8、解除对 master 节点的隔离状态
      • 2.9、验证 master 节点升级情况
    • 3、升级 Worker 节点
      • 3.1、升级 kubeadm
      • 3.2、升级 kubelet 的配置
      • 3.3、设置 worker 节点为维护状态
      • 3.4、升级 kubelet 和 kubectl
      • 3.5、重载重启 kubelet
      • 3.6、解除对 worker 节点的隔离状态
    • 4、验证
  • 五、工作原理
    • 1、kubeadm upgrade apply 做了以下工作:
    • 2、kubeadm upgrade node 在其他控制平节点上执行以下操作:
    • 3、kubeadm upgrade node 在工作节点上完成以下工作:

一、环境

操作系统CentOS Linux release 7.9.2009 (Core)
Kubernetes 部署工具kubeadm
集群架构一个主节点(Master Node)和两个工作节点(Worker Nodes)
部署环境Vmware Workstation 16 Pro
网络插件Flannel

image-20240816222113474

二、注意事项

1、备份数据

升级前最好备份所有组件及数据,例如etcd

2、跨版本升级

不要跨两个大版本进行升级,可能会存在版本bug

Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本

  • 1.22.2 --> 1.22.16 可以

  • 1.22.2 --> 1.23.2 可以

  • 1.22.2 --> 1.25.2 不可以

  • 跨多个版本的可以逐个版本进行升级。

3、支持的版本偏差

3.1、kube-apiserver

在高可用性(HA)集群中, 最新版和最老版的 kube-apiserver 实例版本偏差最多为一个次要版本。

例如:

  • 最新的 kube-apiserver 实例处于 1.31 版本
  • 其他 kube-apiserver 实例支持 1.311.30 版本

3.2、kubeklet

  • kubelet 版本不能比 kube-apiserver 版本新。
  • kubelet 可以比 kube-apiserver 低三个次要版本(如果 kubelet < 1.25,则只能比 kube-apiserver 低两个次要版本)。

例如:

  • kube-apiserver 处于 1.31 版本
  • kubelet 支持 1.311.301.291.28 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差,这会缩小允许的 kubelet 版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kubelet 支持 1.301.291.28 版本(不支持 1.31 版本,因为这将比 kube-apiserver 1.30 版本的实例新)

3.3、kube-proxy

  • kube-proxy 不能比 kube-apiserver 新。
  • kube-proxy 最多可以比 kube-apiserver 旧三个小版本(kube-proxy < 1.25 最多只能比 kube-apiserver 旧两个小版本)。
  • kube-proxy 可能比它旁边运行的 kubelet 实例旧或新最多三个次要版本(kube-proxy < 1.25 最多只能是比它并行运行的 kubelet 实例旧或新的两个次要版本)。

例如:

  • kube-apiserver 的版本是 1.31
  • kube-proxy 支持的版本是 1.311.301.291.28

如果在 HA 集群中的 kube-apiserver 实例之间存在版本偏差, 所允许的 kube-proxy 版本范围会被缩小。

例如:

  • kube-apiserver 实例的版本是 1.311.30
  • kube-proxy 版本为 1.301.291.281.31 将不被支持, 因为该版本将比 1.30 的 kube-apiserver 实例更新)

3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager

kube-controller-managerkube-schedulercloud-controller-manager 不能比与它们通信的 kube-apiserver 实例新。 它们应该与 kube-apiserver 次要版本相匹配,但可能最多旧一个次要版本(允许实时升级)。

例如:

  • kube-apiserver 处于 1.31 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 支持 1.311.30 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差, 并且这些组件可以与集群中的任何 kube-apiserver 实例通信(例如,通过负载均衡器),这会缩小这些组件所允许的版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 与可以路由到任何 kube-apiserver 实例的负载均衡器通信
  • kube-controller-managerkube-schedulercloud-controller-manager 支持 1.30 版本(不支持 1.31 版本,因为它比 1.30 版本的 kube-apiserver 实例新)

3.5、kubectl

kubectlkube-apiserver 的一个次要版本(较旧或较新)中支持。

例如:

  • kube-apiserver 处于 1.31 版本
  • kubectl 支持 1.321.311.30 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差,这会缩小支持的 kubectl 版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kubectl 支持 1.311.30 版本(其他版本将与 kube-apiserver 组件之一相差不止一个的次要版本)

4、升级流程

  1. 升级主控制平面节点
  2. 升级其他控制平面节点
  3. 升级工作节点

三、版本升级(补丁版本升级)

目标:v1.22.2 --> v1.22.16

1、查看当前版本

kubectl get nodes

image-20240816224832825

2、确定要升级到的版本

当前我们的版本在1.22.2,我们需要升级到1.22.16(属于补丁版本升级)

查询版本,会列出当前所有的正式版本

yum list --showduplicates kubeadm --disableexcludes=kubernetes

image-20240816225137148

image-20240816225416947

3、升级 master 节点

控制面上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件。 即管理员使用的 kubeconfig 证书文件

3.1、升级 kubeadm

yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

image-20240816230623694

3.2、验证下载的 kubeadm 版本是否正确

kubeadm version

image-20240816230955944

3.3、验证升级计划

检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。

kubeadm upgrade plan

在打印信息中可以看到,升级集群每个组件对应的当前版本和升级后的版本。而且升级的组件只包括kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,CoreDNS,etcd。

不包括kubectl,kubelet,docker和网络组件flannel等

image-20240816231419740

3.4、根据提示,选择合适版本升级

kubeadm upgrade apply v1.22.16
过程中会交互式的询问你是否继续升级
image-20240816232106747
输入 y 确认继续后进入到镜像预拉取阶段,可以提前输入 kubeadm config images pull 拉取必须镜像减少升级时间
image-20240816232434350
成功出现 SUCCESS! 即可
image-20240816232717075

3.5、设置 master 节点进入维护状态

通过将 master 节点标记为不可调度并腾空节点为 master 节点作升级准备

kubectl drain k8s-master1 --ignore-daemonsets

image-20240816233244694

3.6、升级 kubelet 和 kubectl

同样的,把 kubelet 和 kubectl 都升级到 1.22.16 版本

yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

image-20240816233704346

3.7、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

3.8、解除对 master 节点的隔离状态

kubectl uncordon k8s-master1

image-20240816234007684

3.9、验证 master 节点升级情况

已成功升级到 1.22.16 版本

kubectl get nodes

image-20240816234111917

4、升级 Worker 节点

工作节点上的升级过程最好一次执行一个节点,一次执行几个节点也行

4.1、升级 kubeadm

yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

4.2、升级 kubelet 的配置

kubeadm upgrade node

image-20240816235318868

4.3、设置 worker 节点为维护状态

kubectl drain k8s-node1 --ignore-daemonsets

image-20240816235605499

4.4、升级 kubelet 和 kubectl

yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

image-20240816235851005

4.5、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

4.6、解除对 worker 节点的隔离状态

剩下的节点也是重复 4、升级 Worker 节点 的操作即可

kubectl uncordon k8s-node1

image-20240817000130904

5、最终结果

done

kubectl get nodes

image-20240817001149416

四、版本升级(次要版本升级)

目标:v1.22.16 --> v1.23.16

1、查看当前版本

kubectl get nodes

image-20240817003538157

2、升级 master 节点

2.1、升级 kubeadm

yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

image-20240817005552826

2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办
  • 卸载当前版本的 kubeadm
  • 清理缓存
  • 重新安装指定 kubeadm 版本
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

image-20240817005214570

2.2、验证下载的 kubeadm 版本是否正确

kubeadm version

image-20240817005634121

2.3、验证升级计划

kubeadm upgrade plan

2.4、根据提示,选择合适版本升级

kubeadm upgrade apply v1.23.16

image-20240817010743778

2.5、设置 master 节点进入维护状态

kubectl drain k8s-master1 --ignore-daemonsets

2.6、升级 kubelet 和 kubectl

同样的,把 kubelet 和 kubectl 都升级到 1.23.16 版本

yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes

image-20240817011335616

2.7、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

2.8、解除对 master 节点的隔离状态

kubectl uncordon k8s-master1

2.9、验证 master 节点升级情况

kubectl get nodes

image-20240817011606122

3、升级 Worker 节点

3.1、升级 kubeadm

ansible 的执行升级操作

ansible k8s-node -m shell -a 'yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes'

3.2、升级 kubelet 的配置

ansible k8s-node -m shell -a 'kubeadm upgrade node'

3.3、设置 worker 节点为维护状态

kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets

3.4、升级 kubelet 和 kubectl

ansible k8s-node -m shell -a 'yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes'

3.5、重载重启 kubelet

ansible k8s-node -m shell -a 'systemctl daemon-reload && systemctl restart kubelet'

3.6、解除对 worker 节点的隔离状态

kubectl uncordon k8s-node1
kubectl uncordon k8s-node2

4、验证

kubectl get nodes

image-20240817014701797

五、工作原理

1、kubeadm upgrade apply 做了以下工作:

kubeadm upgrade apply 做了以下工作:

  • 检查你的集群是否处于可升级状态:
    • API 服务器是可访问的
    • 所有节点处于 Ready 状态
    • 控制面是健康的
  • 强制执行版本偏差策略。
  • 确保控制面的镜像是可用的或可拉取到服务器上。
  • 如果组件配置要求版本升级,则生成替代配置与/或使用用户提供的覆盖版本配置。
  • 升级控制面组件或回滚(如果其中任何一个组件无法启动)。
  • 应用新的 CoreDNSkube-proxy 清单,并强制创建所有必需的 RBAC 规则。
  • 如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件。

2、kubeadm upgrade node 在其他控制平节点上执行以下操作:

  • 从集群中获取 kubeadm ClusterConfiguration
  • (可选操作)备份 kube-apiserver 证书。
  • 升级控制平面组件的静态 Pod 清单。
  • 为本节点升级 kubelet 配置

3、kubeadm upgrade node 在工作节点上完成以下工作:

  • 从集群取回 kubeadm ClusterConfiguration
  • 为本节点升级 kubelet 配置。

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

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

相关文章

css 文字图片居中及网格布局

以下内容纯自已个人理解&#xff0c;直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ervlet、jsp、Cookie、Ajax学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…

【业务场景实战】如何优雅地进行缓存预热?

从Java基础到中间件再到微服务&#xff0c;我们学了这么多&#xff0c;但遇到真实项目的时候&#xff0c;还是不会根据所学知识&#xff0c;对项目进行改造&#xff1b;或者太久不用早已忘记。学会用才是走得更远&#xff01; 缓存穿透、雪崩&#xff0c;大家都不陌生&#xf…

【Linux操作系统】——Centos7下安装python3.8

1.Centos7下安装python3.8 1.1 安装依赖包 yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel ncurses-devel sqlite-devel readline-devel readline-devel make在CentOS 7上安装Python时&#xff0c;‌需要安装一些必要的依赖包以确保Python的正常编译和运…

HarmonyOS NEXT - 项目基础框架的搭建

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT - 项目基础框架的搭建 序前置工作项目的目录结构主界面实现BaseTabBar代码实现子页面实现路由跳转登录页面和主页面切换登录实现退出登录 序 项目基于…

Spark-环境启动

一、概览 从start-all.sh开始捋&#xff0c;一直捋到Master、Worker的启动并建立通信 二、宏观描述 Master端 1、start-all.sh调用start-master.sh启动Master 2、执行org.apache.spark.deploy.master.Master中main方法 3、通过工厂模式创建RpcEnv子类NettyRpcEnv a、创建…

viper配置文件读取管理库 一个支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例

viper是一个不错的配置文件管理库&#xff0c; 他支持的配置文件类型依次有 "json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv&quo…

java:实现简单的验证码功能

效果 实现思路 验证码图片的url由后端的一个Controller生成&#xff0c;前端请求这个Controller接口的时候根据当前时间生成一个uuid&#xff0c;并把这个uuid在前端使用localStorage缓存起来&#xff0c;下一次还是从缓存中获取。 Controller生成验证码之后&#xff0c;把前…

Qt 学习第六天:页面布局

如何设计页面&#xff1f; 有个类似沙盒模式的玩法&#xff0c;Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局&#xff1a; 四种布局 &#xff08;一&#xff09;水平布局horizontalLayout&#xff1a;QHBoxLayout H 是 hori…

c++实现B树(上)

哈喽啊&#xff01;好久不见&#xff0c;甚是想念&#xff01;失踪人口要回归了&#xff0c;时隔一个多月小吉我终于要更新blog了&#x1f389;。在停更的一个多月中&#xff0c;小吉也有在好好学习提升自己&#xff0c;立志给大家呈现好文章。  现在让我们进入正题吧&#xf…

初识C++:开启C++之旅

目录 1.C的第一个程序 2.namesapce命名空间域 2.1namespace的意义 2.2.2namespace的定义 2.3命名空间的使用 3.C输入/输出 4.缺省参数 5.函数重载 6.引用 6.1引用的特性 6.2引用的使用 1.C的第一个程序 c版本&#xff1a; #include<iostream>using std::cout…

kali安装wechart

前言&#xff1a; 突发奇想想在kali安装个wechart&#xff0c;试了下网上的很多&#xff0c;玩坏了一个虚拟机算是找到了一个不错的方法&#xff0c;这里记录下&#xff0c;防迷路 基础配置&#xff1a; 首先修改源&#xff1a; vim /etc/apt/sources.list 注释默认配置&…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

centos8 安装zookeeper

1&#xff1a;下载 zookeeper官网 解压&#xff1a;tar -zxvf apache-zookeeper-3.6.3.tar.gz 修改自己想要的文件目录 mv apache-zookeeper-3.6.3 zookeeper_3.6.3 备份一下 配置文件 cp zoo_sample.cfg zoo.cfg vim zoo.cfg 编辑日志文件和端口号

nginx实战演练

目录 一.Nginx架构和安装&#xff08;未完待续&#xff09; <1>.Nginx概述 <2>.Nginx架构和进程 <3>.Nginx模块 <4>.Nginx安装(编译安装) 二.Nginx基础配置 <1>.关闭debug <2>.将nginx软件添加到环境变量 <3>.开机自启动脚…

EmguCV学习笔记 VB.Net 2.5 Mat类、Matrix类和Image类的相互转换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

基于Vue的MES生产制造执行系统

TOC springboot307基于Vue的MES生产制造执行系统 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xf…

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

《机器学习》——运用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法的简单介绍下载OpenCV库实验内容实验结果完整代码自己手写数字传入模型中测试 KNN算法的简单介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重…