如何在Ubuntu上更新Kubernetes版本(基于kubeadm部署)
更新Kubernetes集群是保障集群安全性、稳定性及获取新功能的关键操作。以下是基于Ubuntu系统和kubeadm工具的详细升级流程,覆盖从准备到验证的全流程:
升级前必须备份etcd(集群状态存储)和配置文件,防止数据丢失:
ETCDCTL_API=3 etcdctl snapshot save /path/to/backup/snapshot.db \
--endpoints https://<etcd-endpoint>:2379 \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt
sudo cp -r /etc/kubernetes /etc/kubernetes.backup
kubectl version --short
sudo apt-get update
kubeadm是升级集群的核心工具,需先升级到目标版本(以v1.29.2为例):
sudo apt-get install -y kubeadm=1.29.2-00
sudo apt-mark hold kubeadm # 锁定kubeadm版本,防止自动升级
运行kubeadm upgrade plan查看可升级的版本及需要更新的组件:
sudo kubeadm upgrade plan
输出会显示当前版本、可升级的目标版本及升级前的检查项(如etcd版本兼容性)。
根据kubeadm upgrade plan的输出,执行升级到目标版本的命令(以v1.29.2为例):
sudo kubeadm upgrade apply v1.29.2 --etcd-upgrade=false
--etcd-upgrade=false:若etcd为外部部署,建议单独升级(更安全);若为内置etcd,可设置为true(需提前备份)。升级前将Master节点标记为不可调度,避免新Pod调度到该节点:
kubectl drain <master-node-name> --ignore-daemonsets --force
--ignore-daemonsets:忽略DaemonSet管理的Pod(如kube-proxy);--force:强制排空,即使Pod有local-storage等限制。升级完成后重启kubelet以应用新版本:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
升级完成后,允许新Pod调度到Master节点:
kubectl uncordon <master-node-name>
为避免集群不可用,需逐个升级工作节点(以worker1为例):
kubectl drain worker1 --ignore-daemonsets --force
sudo apt-get install -y kubeadm=1.29.2-00
sudo apt-get install -y kubelet=1.29.2-00 kubectl=1.29.2-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
在Master节点上检查节点状态,确保节点转为Ready:
kubectl get nodes
节点状态变为Ready后,继续升级下一个工作节点。
节点升级完成后,取消排空状态:
kubectl uncordon worker1
kubectl get nodes # 所有节点应为Ready状态
kubectl get pods --all-namespaces # 所有Pod应为Running状态
docker system prune -a --filter "until=24h"
kubeadm upgrade revert回滚到上一个版本,并恢复etcd备份数据。