Kubernetes 版本升级

 

 

Kubernetes 版本升级要求

版本命名规则(先理解版本号)

K8s 版本号格式为 X.Y.Z :

  • X:大版本(如 1.28 → 1.29,不兼容的重大变更)
  • Y:次要版本(如 1.28.1 → 1.28.2,功能迭代,兼容)
  • Z:补丁版本(bug 修复、安全更新,完全兼容)

官方支持周期

  • 每个次要版本(Y 版本)发布后,官方提供 1 年 支持(包含安全补丁和 bug 修复);
  • 仅支持从当前版本升级到下一个次要版本,或同次要版本内的补丁版本;
  • 例如:1.26 → 1.27 是允许的,但 1.25 → 1.27 是不允许的(跨了两个次要版本)。

升级路径要求

升级类型 允许的路径 禁止的路径
次要版本升级

1.27 → 1.28、1.28 → 1.29
1.26 → 1.28(跨版本)、1.29 →1.27(降级)


补丁版本升级
1.28.1 → 1.28.5、1.29.0 → 1.29.2 无(同次要版本内可跨补丁版本)


大版本升级 无直接路径(需通过次要版本逐步
升级)

1.1 → 1.29(直接跨大版本)

 

示例1:如果当前集群版本是 1.26.5,要升级到 1.28.2,正确路径是:

  • 1.26.5 → 1.26.9(先升级到同次要版本的最新补丁版本);
  • 1.26.9 → 1.27.6(升级到下一个次要版本的最新补丁);
  • 1.27.6 → 1.28.2(最终升级到目标版本)
  • 但是跨次版本可能会失败,比如1.34.1 可以升级到 1.34.3,但不支持升级到1.35.0。

示例2: 1.24 → 1.28(真实生产场景)

1.24 → 1.25
    → 1.26
    → 1.27
    → 1.28

 

每一跳都要:
1. 升级 kubeadm
2. 升级 control-plane
3. 升级 kubelet
4. 验证集群状态
5. 再进入下一个版本

 

组件之间的版本兼容关系(重点)

Control Plane(控制平面)

组件 要求
kube-apiserver 最高版本,最先升级
controller-manager ≤ apiserver
scheduler ≤ apiserver

 

✔ 推荐:三者版本完全一致
🔹 ￾ kubelet 版本规则(非常重要)

官方规则:

kubelet ≤ kube-apiserver
kubelet ≥ kube-apiserver - 1 minor

示例:

apiserver v1.28
kubelet 可以是 v1.28 或 v1.27

❌ 不允许:

kubelet v1.29
kubelet v1.26

￾ kubectl 版本规则(最宽松)

kubectl ≤ apiserver +1
kubectl ≥ apiserver -1

示例:

apiserver v1.28
kubectl v1.27 / v1.28 / v1.29 都可以

 

￾ CNI(Calico / Cilium / Flannel)

必须确认是否支持目标 K8s 版本

CNI 常见要求
Calico 每个大版本支持有限 K8s 范围
Cilium 对新 K8s 支持最好,但也有最低要求
Flannel 老项目,1.27+ 有风险

 

升级 K8s 前,先升级 CNI

 CoreDNS(强制关注)

CoreDNS 与 K8s 版本强绑定:

kubectl -n kube-system get deploy coredns -o yaml

官方升级表:

K8s 1.28 → CoreDNS ≥ 1.10.x
K8s 1.27 → CoreDNS ≥ 1.9.x

kube-proxy
建议 与 apiserver 同版本
版本过低会导致 iptables / ipvs 异常

 

升级前的关键检查项

1. 确认目标版本兼容性

  • 查看官方「版本兼容性文档」,确认当前版本到目标版本的路径是否合法;

检查集群内第三方组件(如 CNI 插件、Ingress 控制器、存储插件)是否支持目标版本。
2. 检查集群健康状态

  • 所有节点 Ready 状态,控制平面组件运行正常;

etcd 集群无数据损坏、副本同步正常;

  • 无 CrashLoopBackOff 状态的 Pod,无未处理的 Evicted Pod。

3. 备份关键数据:

  • 备份 etcd 数据(升级核心操作,数据丢失可恢复);

备份 kubeadm-config (kubeadm 部署的集群)、证书文件、核心配置文件

 

升级注意事项
1. K8s 升级必须遵循次要版本递进原则,禁止跨 1 个以上次要版本直接升级;
2. 控制平面版本需高于 / 等于节点组件版本,且组件间版本差不超过 1 个次要版本;
3. 升级前需确认第三方组件兼容性、备份 etcd 数据,保证集群处于健康状态。
4. 遵循这些版本要求,能最大程度避免升级过程中出现集群不可用、数据丢失或组件兼容性故障。
5. 升级 kubernetes 集群前,必须先升级 kubeadm 版本
6. 升级有风险,有条件建议新建集群,而非升级
7. 生产环境应该业务相对空闲时,逐个节点离线升级后再上线,而非全部升级

 

升级流程说明

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadmupgrade/

本页介绍如何将 kubeadm 创建的 Kubernetes 集群从 1.33.x 版本 升级到 1.34.x 版本以及从 1.34.x 升
级到 1.34.y(其中 y > x )。略过次版本号的升级是 不被支持的。更多详情请访问版本偏差策略。
升级 Kubernetes 集群是一个复杂的过程,需要谨慎操作,以确保集群的稳定性和数据的安全性。
升级 Kubernetes 的过程通常包括以下几个步骤:

 

升级工作的基本流程如下:
升级第一台控制平面节点

  • 更改软件包仓库
  • 确定要升级到哪个版本
  • 升级 kubeadm
  • 验证升级计划
  • 执行升级计划 kubeadm upgrade apply
  • 腾空节点
  • 升级 kubelet 和 kubectl
  • 解除节点的保护(污点)

升级其它的控制平面节点

  • 更改软件包仓库
  • 升级 kubeadm
  • 执行 “kubeadm upgrade node
  • 腾空节点
  • 升级 kubelet 和 kubectl
  • 解除节点的保护(污点)

升级工作节点

  • 更改软件包仓库
  • 升级 kubeadm
  • 执行 kubeadm upgrade node
  • 腾空节点
  • 升级 kubelet 和 kubectl
  • 取消对节点的保护(污点)

 

升级前的准备工作

检查当前集群版本

首先,确认当前 Kubernetes 集群的版本。

kubectl version #--short

 

查看升级路径
Kubernetes 的升级路径是有限制的,通常只能升级到次要版本(例如,从 1.24.x 升级到
1.25.x )。不能跳过次要版本(例如,从 1.23.x 直接升级到 1.25.x 是不允许的)。

查看 Kubernetes 官方文档,确认升级路径:
Kubernetes 版本和版本偏差支持策略
范例:从1.27无法直接升级到1.34

kubectl version --short

kubeadm upgrade plan

 

备份集群

在升级之前,务必备份集群的状态,包括:

  • ETCD 数据:使用 etcdctl 备份 ETCD。
  • Kubernetes 资源:使用 kubectl 导出资源。
  • 持久化存储数据:备份 PersistentVolume 中的数据。

 

升级 Kubernetes 控制平面

控制平面包括以下组件:

  • API Server
  • Controller Manager
  • Scheduler
  • ETCD

升级 kubeadm

如果使用 kubeadm 部署的 Kubernetes 集群,首先需要升级 kubeadm 。

. 升级 kubeadm:

使用包管理器(如 yum 或 apt )升级 kubeadm

 

 

范例: 升级 kubertnetes 集群版本

 升级 master 节点

升级所有 master 的服务 kube-controller-manager、kube-apiserver、 kube-scheduler、kube-proxy 

注意:不要同时升级master节点,需要保证升级时要有大于n/2个ETCD节点正常工作

 先将需要升级的第一台master节点下线服务

 

验证 kubernetes 当前版本

kubeadm version 

kubelet --version

kubectl version

在升级的第一台 master 安装指定新版本 kubeadm kubelet kubectl

 

[root@master1 ~]# kubectl  get node
NAME          STATUS   ROLES           AGE   VERSION
master1.org   Ready    control-plane   19m   v1.35.7
master2.org   Ready    control-plane   76s   v1.35.7
master3.org   Ready    control-plane   59s   v1.35.7
node1.org     Ready    <none>          15m   v1.35.7
node2.org     Ready    <none>          12m   v1.35.7
node3.org     Ready    <none>          10m   v1.35.7

 

 1.36

[root@master1 ~]# cat /etc/yum.repos.d/kubernetes.repo    
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
[root@master1 ~]# 

#同时升级多个软件

#升级到最新版本

dnf clean all

dnf makecache

dnf --showduplicates list kubeadm kubelet kubectl --disableexcludes=kubernetes

dnf install  kubeadm-1.36.1 kubelet-1.36.1 kubectl-1.36.1  --disableexcludes=kubernetes -y

#验证升级的版本

kubectl version

kubeadm version

kubelet --version 

 

在第一台升级的 master 节点验证升级计划

执行升级计划,可以了解升级的版本信息

kubeadm upgrade plan

 

在第一台升级的 master 节点开始升级

注意:此步需要较高的内存,如果内存太小会出现OOM现象,建议2G以上内存

#根据提示命令,更新到指定的软件版本

 kubeadm upgrade apply v1.36.1

 

#更新k8s核心组件镜像

grep image: /etc/kubernetes/manifests/*.yaml

systemctl restart kubelet

 

#需要手动更新kubeconfig文件

#证书也自动更新

kubeadm certs check-expiration

 

验证第一台master是否升级完成

#验证master是否升级

kubectl  get node

#验证kubernets相关镜像版本是否升级

docker images |grep v1.3

docker images prume

先将已经升级的第一台master节点上线服务,并下线第二台master节点

 

将其它master节点升级
依次更新其它的master节点
注意: 在反向代理上应该先将要更新的节点下线再升级

 

[root@master2 ~]# cat  /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni

 

#同时升级多个软件

#升级到最新版本

dnf clean all

dnf makecache

dnf --showduplicates list kubeadm kubelet kubectl --disableexcludes=kubernetes

dnf install  kubeadm-1.36.1 kubelet-1.36.1 kubectl-1.36.1  --disableexcludes=kubernetes -y

#验证升级的版本

kubectl version

kubeadm version

kubelet --version 

 

#升级

kubeadm upgrade node

#以下为最终结果

kubectl get nodes

#查看证书也会更新有效期

kubeadm certs check-expiration

#重启

systemctl restart kubelet

cp /etc/kubernetes/admin.conf .kube/config

 

 

升级 worker 节点
升级客户端软件 kubectl 和 kubelet 版本
升级注意事项:

  • 在更新前,不要接收任何新的业务请求
  • 在更新前,驱离所有现有的业务

验证当前 worker 版本信息
查看当前 node 节点采用的旧版本

kubectl get nodes

 

将需要更新的节点冻结并驱离所有请求

#隔离需要升级的节点,将不再接受新请求(可选)

kubectl cordon node1.org

kubectl get nodes node1.org -o yaml|grep -i -A5 taints

#驱离节点上面的现有资源

kubectl drain node1.org --delete-emptydir-data --ignore-daemonsets --force

#查看当前节点不存在pod资源

kubectl get pods -o wide -A|grep node1

 

在升级的worker 节点升级二进制包
在node节点将 kubeadm、kubelet 升级

[root@node1 ~]# cat /etc/yum.repos.d/kubernetes.repo    
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
[root@node1 ~]# 

#同时升级多个软件

#升级到最新版本

dnf clean all

dnf makecache

dnf --showduplicates list kubeadm kubelet kubectl --disableexcludes=kubernetes

dnf install  kubeadm kubelet kubectl --disableexcludes=kubernetes -y

dnf install  kubeadm-1.36.1 kubelet-1.36.1 kubectl-1.36.1  --disableexcludes=kubernetes -y

#验证升级的版本

kubeadm version

kubelet --version 

 

在worker节点执行升级 worker 节点

kubeadm upgrade node

#重启

systemctl restart kubelet

#验证升级版本

kubectl get node

恢复worker节点可以正常调度

kubectl uncordon node1.org

kubectl get nodes node1.org -o yaml|grep -i -A5 taints

kubectl get node

 

将其它worker节点逐个升级
重复以上过程,逐个升级所有node节点

验证升级结果

#最终结果

kubectl get node

#检查证书也自动更新至最新时间

kubeadm certs check-expiration

 

[root@master1 ~]# kubectl get node          
NAME          STATUS   ROLES           AGE    VERSION
master1.org   Ready    control-plane   147m   v1.36.1
master2.org   Ready    control-plane   129m   v1.36.1
master3.org   Ready    control-plane   129m   v1.36.1
node1.org     Ready    <none>          143m   v1.36.1
node2.org     Ready    <none>          140m   v1.36.1
node3.org     Ready    <none>          138m   v1.36.1

 

 

posted @ 2026-08-03 17:28  minger_lcm  阅读(4)  评论(0)    收藏  举报