在 CentOS 上升级 Kubernetes 的标准流程
一 升级前准备
- 备份关键数据与配置:优先备份 etcd(建议快照到持久存储),以及 /etc/kubernetes/ 配置和 kubeconfig。示例:ETCDCTL_API=3 etcdctl snapshot save /var/lib/etcd/backup/snapshot-$(date +%F).db;cp /root/.kube/config /root/.kube/config.backup。
- 检查集群健康:kubectl get nodes、kubectl get pods -A,确保当前无异常或卡在 Terminating 的 Pod。
- 确认升级路径:遵循 小版本逐步升级 原则,不可跨多个小版本;先查可升级版本,再规划批次。
- 配置软件源:在所有节点确保已启用 Kubernetes 官方仓库,以便安装目标版本的 kubeadm/kubelet/kubectl。
- 维护窗口与策略:生产环境建议滚动升级、分批维护,准备回滚预案。
二 控制平面升级(使用 kubeadm)
- 逐台维护(若为 HA 控制平面,一次仅维护一台):
- 标记控制平面节点不可调度并驱逐工作负载:kubectl cordon ;kubectl drain --ignore-daemonsets --delete-emptydir-data。
- 升级 kubeadm 到目标版本:yum install -y kubeadm- --disableexcludes=kubernetes。
- 检查升级计划:kubeadm upgrade plan(确认组件镜像与控制平面版本一致)。
- 执行升级:kubeadm upgrade apply v(按提示完成)。
- 升级 kubelet 与 kubectl:yum install -y kubelet- kubectl- --disableexcludes=kubernetes;systemctl daemon-reload && systemctl restart kubelet。
- 恢复调度:kubectl uncordon 。
- 验证:kubectl get nodes、kubectl get pods -n kube-system,确认控制平面与核心组件 Running。
三 工作节点升级(使用 kubeadm)
- 逐台滚动升级(保持业务连续性):
- 标记不可调度并驱逐:kubectl cordon ;kubectl drain --ignore-daemonsets --delete-emptydir-data。
- 升级 kubeadm:yum install -y kubeadm- --disableexcludes=kubernetes。
- 执行节点升级:kubeadm upgrade node。
- 升级 kubelet 与 kubectl:yum install -y kubelet- kubectl- --disableexcludes=kubernetes;systemctl daemon-reload && systemctl restart kubelet。
- 恢复调度:kubectl uncordon 。
- 验证:kubectl get nodes -o wide,确认节点版本已更新且 Ready。
四 升级后验证与常见问题
- 版本与状态核验:
- kubectl version --short(客户端/服务端版本)
- kubectl get nodes -o wide(节点版本与状态)
- kubectl get pods -A(系统组件与业务 Pod 状态)
- 如为外置 etcd,核对 etcd 集群健康与数据一致性。
- 常见问题与处理:
- 版本不匹配或组件不一致:控制平面组件版本需完全一致;kubelet 与控制平面通常允许 ±1 个小版本差异,必要时对齐版本后重启 kubelet。
- 升级失败回滚:优先回滚到上一版本的 kubeadm/kubelet 包并重启服务;若有 etcd 快照,可恢复到升级前快照。
- 节点无法恢复调度:检查节点污点、磁盘/内存压力、容器运行时状态与网络插件 Pod 就绪情况。
五 补充建议
- 升级顺序:始终遵循 先控制平面,后工作节点;逐台滚动 的策略,最小化业务中断。
- 版本策略:生产环境优先选择 PATCH 版本修复;MINOR 版本升级需充分验证与灰度。
- 兼容性校验:升级前核对 Kubernetes 与容器运行时/网络插件 的兼容矩阵,必要时在测试环境演练。