CentOS 上 Kubernetes 升级实操指南
一 升级策略与准备
- 升级顺序与节奏:遵循 控制平面 → 其余控制平面 → Worker 节点 的顺序,且通常只允许一次跨一个 次要版本(x.y → x.(y+1)),不可跨多个次版本;落后较多版本时需按序逐步升级。升级前务必做好 备份(如 etcd 快照、/etc/kubernetes 配置),并在升级窗口内保持集群健康与业务可容忍的短暂中断。对于生产环境,建议先在测试环境演练。
- 版本与兼容检查:核对当前与目标版本,列出可用的 kubeadm 版本并安装目标版本;执行 kubeadm upgrade plan 预览升级路径与兼容性;确认 kubelet/kubectl 与目标版本一致;检查 内核/容器运行时/CNI 是否满足新版本要求;规划 网络插件(如 Calico、Flannel) 的兼容性更新。
- 升级方式选择:在自建集群中常用 原地滚动升级;对稳定性要求极高的场景可采用 蓝/绿 或 金丝雀 方式(创建新集群验证后再切换),但成本与协调复杂度更高。
二 原地升级步骤(kubeadm 方式)
- 备份与预检
- 备份关键数据与配置:
- etcd 快照:
etcdctl snapshot save /var/lib/etcd/backup/snapshot.db
- kubeconfig:
cp /root/.kube/config /root/.kube/config.backup
- 配置文件:
/etc/kubernetes/ 目录
- 预检:
kubectl get nodes 确认所有节点 Ready;检查待升级版本是否可用:yum list --showduplicates kubeadm --disableexcludes=kubernetes。
- 升级控制平面(首个控制平面节点)
- 升级 kubeadm:
- 查看可用版本并安装目标版本:
yum install -y kubeadm-<version> --disableexcludes=kubernetes
- 预览与执行升级计划:
kubeadm upgrade plan
kubeadm upgrade apply <target-version>(如 v1.28.3)
- 腾空节点并重启 kubelet:
kubectl drain <master-node> --ignore-daemonsets
systemctl daemon-reload && systemctl restart kubelet
kubectl uncordon <master-node>
- 其余控制平面节点:重复上述步骤(先升级 kubeadm,再
kubeadm upgrade node,随后重启 kubelet 并解除封锁)。
- 升级工作节点(逐个进行)
- 升级 kubelet/kubectl(与控制平面目标版本保持一致):
yum install -y kubelet-<version> kubectl-<version> --disableexcludes=kubernetes
- 腾空、重启、恢复:
kubectl drain <worker-node> --ignore-daemonsets
systemctl daemon-reload && systemctl restart kubelet
kubectl uncordon <worker-node>
- 建议逐台进行,升级期间保持业务副本数或 Pod 反亲和,避免服务中断。
- 升级后验证
- 组件版本:
kubectl version --short、kubectl get nodes -o wide
- 系统组件:
kubectl get pods -n kube-system
- 网络与存储:确认 CNI 插件、CoreDNS、kube-proxy 正常运行,业务 Pod 就绪。
三 升级方式与回退方案
- 原地滚动升级:最常用、成本低,按节点逐步替换,适合多数自建集群;需确保应用具备 滚动更新 与 反亲和/副本 能力。
- 蓝/绿升级:新建 Green 集群验证新版本与基础设施变更,通过 DNS/LB 切换流量;回滚最快、成本最高,适合关键业务与跨多版本跃迁。
- 金丝雀升级:在 Green 集群小流量验证,逐步扩大规模后切换;兼顾风险与成本,适合渐进式验证。
四 常见问题与排查要点
- 版本不兼容或跳级:出现 “版本不兼容/不可升级” 时,回退到上一个可用 次版本,按序升级;例如从 1.23 → 1.24 → 1.25,不可直接 1.23 → 1.25。
- kubeadm 与组件版本不一致:确保 kubeadm/kubelet/kubectl 版本一致或满足兼容矩阵;必要时使用
yum install -y kubeadm-<version> --disableexcludes=kubernetes 精确指定版本。
- 节点无法排空或 Pod 无法终止:检查 PodDisruptionBudget、DaemonSet、本地卷/HostPath 等阻止驱逐的因素;必要时临时调整策略或手动清理。
- 网络插件异常:升级后 CNI 未就绪会导致 Pod 不通;按插件文档执行升级或重装,并重启相关 kube-proxy 与 CoreDNS。
- 升级失败回退:若有 etcd 快照 与控制平面备份,可先恢复快照与配置,再回滚 kubeadm/kubelet 版本并重启服务;蓝/绿/金丝雀策略可直接切回旧集群。