Linux二进制部署K8s集群的平滑升级教程
一、升级前的准备工作
-
备份集群配置和数据
-
备份
/etc/kubernetes/
目录,其中包含Kubernetes集群的配置文件。 -
备份
/var/lib/etcd/
目录,其中存储了etcd数据库的数据。 -
使用
etcdctl
工具备份etcd数据:bash复制
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
如果没有
etcdctl
工具,可通过yum install -y etcd
安装。
-
-
检查集群状态
- 确保集群中所有节点的状态正常,所有Pod都在运行状态。
- 检查集群中是否有未完成的作业或任务,避免升级过程中出现意外。
二、升级控制平面节点(master节点)
-
升级kubeadm
-
下载新版本的kubeadm二进制文件,并替换旧版本文件。例如,下载1.29.10版本:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm chmod +x kubeadm sudo mv kubeadm /usr/local/bin/
-
-
验证kubeadm版本
- 执行
kubeadm version
命令,确认版本已升级到目标版本。
- 执行
-
检查升级计划
- 执行
kubeadm upgrade plan
命令,检查集群是否可以升级,并获取目标版本信息。
- 执行
-
执行控制平面升级
- 执行
kubeadm upgrade apply v1.29.10
命令,开始升级控制平面组件。 - 该命令会自动下载并安装新版本的控制平面组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。
- 执行
-
腾空master节点
-
将master节点标记为不可调度,并驱逐所有负载:
bash复制
kubectl drain k8s-master --ignore-daemonsets
-
-
升级kubelet和kubectl
-
下载新版本的kubelet和kubectl二进制文件,并替换旧版本文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl chmod +x kubelet kubectl sudo mv kubelet /usr/local/bin/ sudo mv kubectl /usr/local/bin/
-
重启kubelet服务:
bash复制
sudo systemctl daemon-reload sudo systemctl restart kubelet
-
-
解除节点保护
-
将master节点标记为可调度:
bash复制
kubectl uncordon k8s-master
-
三、升级工作节点
-
逐个升级工作节点
- 每次只升级一个工作节点,以确保集群在升级过程中仍能正常运行。
-
升级kubeadm
-
在工作节点上,下载并安装新版本的kubeadm二进制文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm chmod +x kubeadm sudo mv kubeadm /usr/local/bin/
-
-
腾空工作节点
-
将工作节点标记为不可调度,并驱逐所有负载:
bash复制
kubectl drain k8s-node1 --ignore-daemonsets
-
-
升级kubelet和kubectl
-
下载并安装新版本的kubelet和kubectl二进制文件:
bash复制
wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl chmod +x kubelet kubectl sudo mv kubelet /usr/local/bin/ sudo mv kubectl /usr/local/bin/
-
重启kubelet服务:
bash复制
sudo systemctl daemon-reload sudo systemctl restart kubelet
-
-
解除节点保护
-
将工作节点标记为可调度:
bash复制
kubectl uncordon k8s-node1
-
-
重复以上步骤
- 对其他工作节点重复上述升级步骤,直到所有工作节点都升级完成。
四、验证升级结果
- 检查集群状态
- 执行
kubectl get nodes
命令,确认所有节点的状态为Ready
。 - 执行
kubectl get pods -A
命令,检查所有Pod的状态是否正常。
- 执行
- 验证集群功能
-
部署一个简单的应用(如nginx)来测试集群功能是否正常。以下是部署nginx的示例:
yaml复制
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service namespace: default spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30001
将上述内容保存为
nginx.yaml
文件,然后执行以下命令进行部署:bash复制
kubectl apply -f nginx.yaml
-
验证nginx服务是否正常运行:
bash复制
kubectl get pods -o wide kubectl get svc
访问
http://<NodeIP>:30001
,如果能够正常访问nginx页面,说明集群功能正常。
-
检查日志
-
查看控制平面组件和kubelet的日志,确认没有异常错误信息:
bash复制
journalctl -u kube-apiserver journalctl -u kube-controller-manager journalctl -u kube-scheduler journalctl -u kubelet
-
五、清理旧版本组件
-
清理旧版本的二进制文件
-
如果旧版本的kubeadm、kubelet和kubectl二进制文件仍然存在,可以手动删除它们。例如:
bash复制
sudo rm /usr/local/bin/kubeadm-<old-version> sudo rm /usr/local/bin/kubelet-<old-version> sudo rm /usr/local/bin/kubectl-<old-version>
-
-
清理旧版本的容器镜像
-
使用
docker
命令清理旧版本的Kubernetes镜像:bash复制
docker images | grep '<old-k8s-version>' | awk '{print $3}' | xargs docker rmi
-
六、注意事项
- 版本兼容性
- 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是
calico
作为CNI插件,需要确保其版本与新版本的Kubernetes兼容。
- 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是
- 升级顺序
- 严格按照控制平面节点(master节点)先升级,然后逐个工作节点升级的顺序进行操作,避免出现集群不可用的情况。
- 监控集群状态
- 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用
kubectl
命令或集群监控工具(如Prometheus、Grafana等)来监控集群状态。
- 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用
- 回滚方案
- 如果升级过程中出现问题,需要有回滚方案。可以使用之前备份的配置文件和数据进行恢复,或者重新安装旧版本的Kubernetes组件。
七、常见问题及解决方法
-
Pod无法调度
-
如果在升级过程中,某些Pod无法调度到节点上,可能是节点状态异常或资源不足。可以通过以下命令检查节点状态:
bash复制
kubectl get nodes kubectl describe node <node-name>
根据检查结果,解决节点状态问题或清理节点上的资源。
-
-
etcd集群问题
-
如果etcd集群出现问题,可能导致集群无法正常工作。可以通过以下命令检查etcd集群状态:
bash复制
ETCDCTL_API=3 etcdctl endpoint status \ --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
如果发现etcd集群状态异常,可以尝试重启etcd服务或使用备份数据恢复etcd集群。
-
-
网络插件问题
- 如果在升级后,Pod之间的网络通信出现问题,可能是网络插件配置不正确或版本不兼容。可以参考网络插件的官方文档,检查和更新网络插件的配置。
通过以上步骤和注意事项,您可以顺利完成Linux二进制部署的Kubernetes集群的平滑升级。在升级过程中,务必谨慎操作,确保集群的稳定性和可用性。