CentOS环境下Kubernetes集群更新流程
备份关键数据
备份etcd数据库(集群状态核心存储)、/etc/kubernetes/目录(配置文件)及/etc/etcd/目录(etcd数据),确保升级失败时可快速恢复。常用命令:
ETCDCTL_API=3 etcdctl --endpoints=https://<etcd-ip>:2379 --cacert=/etc/etcd/ca.crt --cert=/etc/etcd/server.crt --key=/etc/etcd/server.key snapshot save /var/lib/etcd/backup/snapshot.db
cp -r /etc/kubernetes/ /etc/kubernetes.backup/
cp -r /etc/etcd/ /etc/etcd.backup/
检查集群状态
确保所有节点处于Ready状态,无未完成的Pod调度或异常事件:
kubectl get nodes
kubectl get pods --all-namespaces
确认版本兼容性
Kubernetes仅支持逐次小版本升级(如v1.23→v1.24→v1.25),禁止跨大版本跳跃。通过官方文档确认目标版本与当前版本的兼容性,避免因版本跳过导致组件冲突。
配置Kubernetes Repo仓库
在所有节点上更新Kubernetes官方YUM仓库,确保能下载最新版本组件。以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工具
在Master节点上,使用YUM安装目标版本的kubeadm(集群升级核心工具):
sudo yum update -y kubeadm --disableexcludes=kubernetes
查看升级计划
执行kubeadm upgrade plan命令,检查集群可升级的目标版本及需要更新的组件(如kube-apiserver、kube-controller-manager等),确认升级可行性:
sudo kubeadm upgrade plan
执行控制平面升级
使用kubeadm upgrade apply命令升级Master节点的控制平面组件,自动替换旧版本二进制文件并重启服务:
sudo kubeadm upgrade apply v<target-version>
升级Master节点的kubelet和kubectl
升级Master节点上的kubelet(节点代理)和kubectl(命令行工具)至目标版本,并重启kubelet服务:
sudo yum update -y kubelet kubectl --disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
解除Master节点保护
升级完成后,将Master节点标记为可调度,允许新Pod调度至该节点:
kubectl uncordon <master-node-name>
逐个升级工作节点
为避免集群不可用,每次仅升级一个工作节点,待其恢复后再升级下一个节点。
标记节点为不可调度并驱逐Pod
使用cordon命令将节点标记为不可调度,再通过drain命令驱逐节点上的所有Pod(--ignore-daemonsets忽略DaemonSet管理的Pod,--delete-emptydir-data清理临时数据):
kubectl cordon <worker-node-name>
kubectl drain <worker-node-name> --ignore-daemonsets --delete-emptydir-data
升级工作节点的kubeadm、kubelet和kubectl
在工作节点上执行与Master节点相同的步骤,升级kubeadm、kubelet和kubectl至目标版本,并重启kubelet服务:
sudo yum update -y kubeadm kubelet kubectl --disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
执行节点升级
使用kubeadm upgrade node命令升级工作节点的组件,同步至集群最新版本:
sudo kubeadm upgrade node
恢复节点调度
升级完成后,将工作节点标记为可调度,等待节点状态变为Ready:
kubectl uncordon <worker-node-name>
检查集群状态
确认所有节点状态为Ready,无异常事件:
kubectl get nodes
检查Pod运行状态
查看kube-system命名空间下的核心组件(如kube-apiserver、kube-controller-manager、kube-scheduler)及业务Pod是否正常运行:
kubectl get pods --all-namespaces
验证功能正常性
部署一个测试Pod(如nginx),检查是否能正常调度、启动及访问,确保升级未影响业务功能:
kubectl run test-pod --image=nginx --restart=Never
kubectl get pod test-pod
kubectl port-forward test-pod 8080:80
journalctl -xeu kubelet)排查异常。