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
浙公网安备 33010602011771号