Ubuntu上Kubernetes集群升级操作指南(基于kubeadm)
升级前必须备份集群核心数据,作为回退兜底方案:
kubectl -n kube-system exec -it etcd-<master-node-name> -- etcdctl snapshot save /var/lib/etcd/snapshot-$(date +%Y%m%d).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
# 将备份文件复制到本地
kubectl -n kube-system cp etcd-<master-node-name>:/var/lib/etcd/snapshot-$(date +%Y%m%d).db ./
/etc/kubernetes/目录下的admin.conf、controller-manager.conf、scheduler.conf及证书文件(如ca.crt、apiserver.crt)。确保集群处于可升级状态,避免因原有问题导致升级失败:
kubectl get pods -n kube-system -l component=kube-apiserver
kubectl get pods -n kube-system -l component=etcd
kubectl get pods -n kube-system -l component=kube-controller-manager
kubectl get pods -n kube-system -l component=kube-scheduler
Ready:kubectl get nodes
CrashLoopBackOff、Error等异常状态的Pod:kubectl get pods --all-namespaces --field-selector status.phase!=Running
Kubernetes不支持跨多个次要版本跳跃升级(如1.22→1.25),必须遵循“相邻次要版本递进”规则(如1.22→1.23→1.24→1.25)。升级前需:
kubectl version --short查看当前集群版本;kubeadm是官方推荐的集群升级工具,需先升级到目标版本:
# 更新apt源并安装指定版本的kubeadm(以Ubuntu为例)
sudo apt update
sudo apt-mark unhold kubeadm # 若之前锁定版本,需解锁
sudo apt install -y kubeadm=<target-version>-00 # 替换<target-version>为目标版本(如1.25.0)
sudo apt-mark hold kubeadm # 锁定版本,避免自动升级
# 验证kubeadm版本
kubeadm version
控制平面是集群核心,升级需严格遵循“先升级组件,再重启服务”的顺序:
kubeadm upgrade plan命令查看目标版本是否可用,以及是否存在潜在问题(如组件兼容性、配置冲突):sudo kubeadm upgrade plan
若输出提示“Components that must be upgraded manually after you have upgraded the control plane”(如容器运行时),需按提示提前处理。kubeadm upgrade apply命令升级控制平面组件(API Server、Controller Manager、Scheduler)及Etcd(若为kubeadm部署):sudo kubeadm upgrade apply v<target-version> # 替换<target-version>为目标版本(如v1.25.0)
该命令会自动完成:
/etc/kubernetes/manifests/);sudo systemctl daemon-reload
sudo systemctl restart kubelet
Running:kubectl get pods -n kube-system -l tier=control-plane
工作节点运行业务Pod,升级需采用“分批升级”策略(每次升级1-2个节点),避免全量升级导致业务中断:
kubectl cordon <worker-node-name> # 标记为不可调度
kubectl drain <worker-node-name> --ignore-daemonsets # 驱逐Pod(自动重新调度到其他节点)
sudo apt-mark unhold kubeadm
sudo apt install -y kubeadm=<target-version>-00
sudo apt-mark hold kubeadm
sudo kubeadm upgrade node
sudo apt-mark unhold kubelet kubectl
sudo apt install -y kubelet=<target-version>-00 kubectl=<target-version>-00
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon <worker-node-name> # 标记为可调度
kubectl get nodes # 验证节点状态为Ready,VERSION显示目标版本
kubectl get pods -o wide | grep <worker-node-name> # 验证业务Pod重新调度并正常运行
重复上述“升级工作节点”步骤,依次升级所有工作节点,确保集群始终有足够节点承载业务流量。
升级完成后,需全面验证集群功能及业务状态:
kubectl get componentstatuses
Running,无异常状态:kubectl get pods --all-namespaces
curl测试Ingress端点)。kubeadm upgrade plan查看具体原因,按提示修复后重新执行升级。kubeadm reset重置节点,再重新加入集群(需确保控制平面正常)。etcdctl snapshot restore命令)。注:以上步骤基于kubeadm部署的Kubernetes集群,若使用其他部署工具(如kops、Sealos),需参考对应工具的升级文档。升级前务必在测试环境验证步骤,确保符合业务需求。