Linux系统升级Kubernetes版本实操指南
一 升级前准备与版本策略
- 选择维护窗口并通知业务,升级期间避免对集群执行高危操作(如关机、重启、删除节点、在控制台修改由托管组件管理的资源),以减少对业务的冲击。升级过程中 API Server 访问可能出现短暂中断。
- 备份关键数据与配置:建议备份 /etc/kubernetes/ 与 /var/lib/etcd/;如用 etcd,执行快照:ETCDCTL_API=3 etcdctl snapshot save /data/etcd/etcd_bak.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。
- 执行预检:确认所有节点 Ready、控制面与 etcd 健康、关键工作负载可容忍短暂中断或可迁移。
- 版本路径与兼容性:
- 使用 kubeadm 的集群通常支持跨一个大版本升级(如 v1.23.x → v1.24.x),不支持跨超过 1 个大版本;小版本一般可沿同一大版本内的补丁链升级。升级前用 kubeadm upgrade plan 查看可升级版本与目标版本。
- 升级前核查目标版本是否废弃了你正在使用的 API(如从 alpha/beta 到 v1 的变更),必要时先用 kubectl convert 转换清单以避免调用失败。
- 组件版本建议与 kube-apiserver 保持一致或在其后(如 kube-proxy ≤ apiserver)。
二 使用 kubeadm 的升级步骤
- 升级顺序:先控制平面(逐个 master),后工作节点;每个节点升级前先腾空,升级后再恢复调度。
- 控制平面节点(以 systemd 管理的 Linux 发行版为例)
- 升级 kubeadm(示例目标版本:v1.24.3)
- CentOS/RHEL:
- 查看可用版本:yum list --showduplicates kubeadm --disableexcludes=kubernetes
- 安装目标版本:yum install -y kubeadm-1.24.3-0 --disableexcludes=kubernetes
- Ubuntu/Debian:
- apt-mark unhold kubeadm && apt-get update && apt-get install -y kubeadm=1.24.3-00 && apt-mark hold kubeadm
- 验证计划:kubeadm upgrade plan(确认可升级到的目标版本与组件变更)
- 腾空节点:kubectl drain --ignore-daemonsets
- 升级控制面:kubeadm upgrade apply v1.24.3
- 升级 kubelet 与 kubectl(同版本):
- CentOS/RHEL:yum install -y kubelet-1.24.3-0 kubectl-1.24.3-0 --disableexcludes=kubernetes
- Ubuntu/Debian:apt-mark unhold kubelet kubectl && apt-get install -y kubelet=1.24.3-00 kubectl=1.24.3-00 && apt-mark hold kubelet kubectl
- 重启 kubelet:systemctl daemon-reload && systemctl restart kubelet
- 解除不可调度:kubectl uncordon
- 如为 HA,确保负载均衡/Keepalived 将升级中的 master 暂时摘除,恢复后再加回。
- 工作节点
- 腾空节点:kubectl drain --ignore-daemonsets
- 升级 kubeadm/kubelet/kubectl(同控制面目标版本)
- 重启 kubelet:systemctl daemon-reload && systemctl restart kubelet
- 解除不可调度:kubectl uncordon
- 逐台节点重复,直至集群所有节点版本一致。
三 二进制方式部署的升级步骤
- 适用场景:非 kubeadm 部署(自行维护二进制与 systemd 单元)。
- 核心思路:按顺序替换二进制并滚动重启,先控制面后数据面,逐台节点操作,配合 drain/uncordon 保证业务连续性。
- 控制面节点
- 备份:/app/kubernetes/bin 下关键二进制与 /etc/kubernetes/ 配置;如用 etcd,先快照。
- 下载目标版本二进制(示例:v1.18.15):wget https://dl.k8s.io/v1.18.15/kubernetes-server-linux-amd64.tar.gz
- 腾空节点:kubectl drain --ignore-daemonsets
- 停止控制面服务(HA 场景先摘除 VIP/后端):systemctl stop kube-apiserver kube-scheduler kube-controller-manager
- 备份并替换二进制:cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /app/kubernetes/bin/
- 启动服务(HA 先拉起 Keepalived/APIServer):systemctl start kube-apiserver(随后 scheduler/controller-manager)
- 重启 kubelet:systemctl daemon-reload && systemctl restart kubelet
- 解除不可调度:kubectl uncordon
- 观察日志与健康状态,再处理下一台控制面节点。
- 工作节点
- 腾空:kubectl drain --ignore-daemonsets
- 替换 kubelet/kube-proxy 等二进制并重启 kubelet
- 解除不可调度:kubectl uncordon
- 逐台完成滚动升级。
四 升级后验证与常见问题
- 版本与健康检查
- 查看节点与组件版本:kubectl get nodes;kubectl get pods -n kube-system -owide
- 观察控制面与 etcd 状态、Pod 重启情况,确认无 CrashLoopBackOff 与异常事件。
- 业务与 API 兼容性
- 若升级涉及 API 废弃/变更,使用 kubectl convert 更新清单后再 apply,避免接口调用失败。
- 常见故障排查
- kubeadm upgrade plan 失败:检查节点网络与镜像仓库可达性、证书与 kubeconfig 权限、控制面健康。
- 节点 NotReady:查看 kubelet 日志(journalctl -u kubelet -xe)、容器运行时状态与镜像拉取情况。
- Pod 未重建:确认节点已 uncordon、资源配额与亲和性策略允许调度,必要时删除异常 Pod 触发重建。