适用于 kubeadm 部署的 CentOS 集群升级指南
一 升级前准备
- 备份关键数据与配置:建议备份 /etc/kubernetes/、/var/lib/etcd/,并使用 etcdctl snapshot save 备份 etcd;同时备份 kubeconfig。
- 检查当前状态与版本:使用 kubectl version、kubectl get nodes 确认集群健康与节点版本。
- 查看可升级版本:执行 kubeadm upgrade plan,确认目标版本是否可用与升级路径。
- 版本策略与兼容性:遵循 Kubernetes 的版本倾斜策略,通常要求 控制面与节点小版本差距不超过 1,且不建议跨多个小版本一次性升级;升级前确认 kubelet/kube-proxy 与 kube-apiserver 的兼容关系。
- 维护窗口与高可用:选择低峰时段,若为 HA 控制面,确保 APIServer 前端的负载均衡(如 HAProxy)健康检查与摘除策略正常。
- 系统依赖:确认 内核/Cgroups 与新版本 Kubernetes 的兼容性。
二 控制平面升级步骤
- 升级 kubeadm(在首个控制平面节点执行):
- 查看可用版本:yum list --showduplicates kubeadm --disableexcludes=kubernetes
- 安装目标版本:yum install -y kubeadm-<目标版本> --disableexcludes=kubernetes
- 验证升级计划:kubeadm upgrade plan
- 腾空控制平面节点:kubectl drain --ignore-daemonsets
- 应用控制平面升级:kubeadm upgrade apply <目标版本>
- 升级 kubelet 与 kubectl(所有控制平面节点):
- 安装目标版本:yum install -y kubelet-<目标版本> kubectl-<目标版本> --disableexcludes=kubernetes
- 重启服务:systemctl daemon-reload && systemctl restart kubelet
- 解除节点保护:kubectl uncordon
- 说明:若为 HA 集群,按上述步骤依次升级其余控制平面节点;APIServer 前端 HAProxy 会自动摘除/恢复后端。
三 工作节点升级步骤
- 逐个升级工作节点(避免同时升级多节点):
- 腾空节点:kubectl drain --ignore-daemonsets
- 升级 kubelet/kubectl:yum install -y kubelet-<目标版本> kubectl-<目标版本> --disableexcludes=kubernetes
- 重启服务:systemctl daemon-reload && systemctl restart kubelet
- 解除节点保护:kubectl uncordon
- 单节点集群注意:若集群只有一个节点,驱逐后 Pod 将无法调度,会出现业务中断,请在测试环境充分验证或准备临时节点。
四 升级后验证与常见问题
- 版本与健康检查:
- 集群版本:kubectl version --short
- 节点版本:kubectl get nodes -o wide
- 组件状态:kubectl get pods -n kube-system
- 插件与系统组件:升级后按需更新 网络插件(如 Calico/Cilium) 及其他 CNI/CSI/Ingress/监控 组件,确保与新版本 Kubernetes API 兼容。
- 清单与 API 变更:若新版本引入 API 变更,使用 kubectl convert 将现有清单转换至新 apiVersion,并回归测试关键业务。
- 回滚与应急:升级失败可基于 etcd 快照与备份清单回滚;回滚控制面前先恢复 kubelet 到旧版本并重启。
五 常用命令清单
- 备份与查看:
- etcdctl snapshot save /var/lib/etcd/backup/snapshot.db
- cp /root/.kube/config /root/.kube/config.backup
- kubectl version、kubectl get nodes
- 升级 kubeadm 与规划:
- yum list --showduplicates kubeadm --disableexcludes=kubernetes
- yum install -y kubeadm- --disableexcludes=kubernetes
- kubeadm upgrade plan
- 控制面与应用:
- kubeadm upgrade apply
- kubectl drain --ignore-daemonsets、kubectl uncordon
- 升级 kubelet/kubectl:
- yum install -y kubelet- kubectl- --disableexcludes=kubernetes
- systemctl daemon-reload && systemctl restart kubelet
- 验证:
- kubectl version --short、kubectl get nodes -o wide、kubectl get pods -A