CentOS环境下Kubernetes集群部署升级流程
备份关键数据
备份集群配置文件(/etc/kubernetes/目录)和etcd数据(etcd是Kubernetes的核心存储组件),确保升级失败时可快速恢复。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
检查集群状态
使用kubectl get nodes确认所有节点状态为Ready,使用kubectl get pods --all-namespaces检查所有Pod是否正常运行,确保无未完成的作业或异常任务。
验证版本兼容性
查阅Kubernetes官方文档(如发行说明),确认目标版本与当前集群版本的兼容性(如不能跳过次版本,仅支持1.y→1.y+1的升级路径)。
更新Kubernetes仓库
确保所有节点的Kubernetes仓库为最新版本(以CentOS 7为例):
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
升级kubeadm工具
安装目标版本的kubeadm(以升级到v1.28.2为例):
sudo yum install -y kubeadm-1.28.2-0 --disableexcludes=kubernetes
sudo systemctl daemon-reload
检查升级计划
运行kubeadm upgrade plan查看集群是否可升级,以及可升级到的版本列表(如提示“Recommended version: v1.28.2”则表示可升级)。
执行控制平面升级
使用kubeadm upgrade apply命令升级控制平面组件(包括kube-apiserver、kube-controller-manager、kube-scheduler):
sudo kubeadm upgrade apply v1.28.2
执行后会自动更新控制平面组件的静态Pod清单。
升级kubelet和kubectl
安装目标版本的kubelet和kubectl:
sudo yum install -y kubelet-1.28.2-0 kubectl-1.28.2-0 --disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
(可选)升级CNI驱动
若使用第三方CNI插件(如Calico、Flannel),需升级到与Kubernetes版本兼容的版本(参考插件官方文档)。
逐个标记节点为不可调度并驱逐负载
避免升级过程中影响业务运行,依次对每个工作节点执行:
kubectl cordon <节点名称> # 标记节点为不可调度
kubectl drain <节点名称> --ignore-daemonsets --force # 驱逐节点上的Pod(--ignore-daemonsets忽略DaemonSet管理的Pod)
升级工作节点组件
在工作节点上执行与Master节点相同的步骤:升级kubeadm、kubelet、kubectl,并重启kubelet服务。
升级节点上的kubeadm
sudo yum install -y kubeadm-1.28.2-0 --disableexcludes=kubernetes
执行节点升级
使用kubeadm upgrade node命令升级节点上的控制平面组件(若节点同时是控制平面节点,则无需此步):
sudo kubeadm upgrade node
重启kubelet并解除节点保护
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon <节点名称> # 标记节点为可调度,恢复业务运行
检查集群状态
使用kubectl get nodes确认所有节点状态为Ready,使用kubectl get pods --all-namespaces检查所有Pod是否正常运行(无Error或CrashLoopBackOff状态)。
验证业务功能
检查核心业务Pod(如Web服务、数据库)是否正常响应,确保升级未影响业务逻辑。
清理旧版本组件
若升级成功,可清理旧版本的kubeadm、kubelet等组件(谨慎操作,避免误删):
sudo yum remove -y kubeadm-<旧版本> kubelet-<旧版本> kubectl-<旧版本>
1.27→1.28→1.29),禁止跳过次版本。kubeadm upgrade revert命令回滚到上一个稳定版本,并恢复备份数据。