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),需参考对应工具的升级文档。升级前务必在测试环境验证步骤,确保符合业务需求。