16.2.5 集群升级、备份与恢复策略
集群升级、备份与恢复策略#
升级策略与原则#
- 版本规划:遵循控制平面与节点不超过±1小版本;提前核对废弃特性与API变更。
- 升级路径:小版本逐级升级,避免跨多版本跳跃;同步确认CNI/CSI/Ingress兼容性。
- 风险评估:盘点关键负载、SLA、HPA与PDB配置,确认可承受的中断窗口。
- 变更窗口:低峰执行,确保回滚方案与应急联系人到位。
原理草图(升级/回滚路径)
升级流程(kubeadm示例)#
前置检查与准备(示例包含命令说明)
# 1) 检查节点与版本信息
kubectl get node -o wide
# 预期:所有节点 Ready,版本与目标版本差距不超过1小版本
# 2) 查看当前kubeadm版本与升级可用路径
kubeadm version
kubeadm upgrade plan
# 预期:输出可升级的目标版本与组件版本信息
# 3) 检查etcd健康(控制平面节点执行)
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
endpoint health
# 预期:healthy
升级控制平面
# 1) 选择目标版本(示例 v1.27.4)
kubeadm upgrade apply v1.27.4
# 2) 更新kubelet与kubectl(以Ubuntu为例)
apt-get update
apt-get install -y kubelet=1.27.4-00 kubectl=1.27.4-00
systemctl daemon-reload
systemctl restart kubelet
# 3) 验证控制平面组件版本
kubectl -n kube-system get pod -o wide
滚动升级工作节点
# 1) 逐台维护:禁止调度并驱逐Pod
kubectl cordon node-1
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
# 2) 更新kubelet/kubeadm并执行节点升级
apt-get install -y kubelet=1.27.4-00 kubeadm=1.27.4-00
kubeadm upgrade node
# 3) 重启kubelet并恢复调度
systemctl restart kubelet
kubectl uncordon node-1
插件与附加组件升级
# 以CoreDNS为例,拉取新版本镜像并更新Deployment
kubectl -n kube-system set image deployment/coredns \
coredns=registry.k8s.io/coredns/coredns:v1.10.1
# 检查Pod滚动状态
kubectl -n kube-system rollout status deployment/coredns
排错要点
# 1) kubelet无法启动
journalctl -u kubelet -n 100 --no-pager
# 2) API Server不可用
kubectl get --raw=/healthz
# 若失败,检查 /etc/kubernetes/manifests/ 中静态Pod配置
# 3) 组件镜像拉取失败
crictl images
crictl pull registry.k8s.io/kube-apiserver:v1.27.4
回滚与容灾准备#
- 回滚条件:升级后控制平面异常、API不可用、关键业务不可恢复。
- 回滚手段:
- 回退控制平面镜像与静态Pod配置
- 恢复etcd快照
- 节点版本回退并重新加入集群
回滚示例(控制平面静态Pod)
# 1) 修改 /etc/kubernetes/manifests/kube-apiserver.yaml
# 将 image: registry.k8s.io/kube-apiserver:v1.27.4 回退到 v1.26.x
sed -i 's/v1.27.4/v1.26.8/g' /etc/kubernetes/manifests/kube-apiserver.yaml
# 2) kubelet会自动重启静态Pod
kubectl -n kube-system get pod -l component=kube-apiserver
备份策略#
- 备份对象:etcd快照、控制平面配置、关键资源、PV数据快照。
- 备份频率:etcd每日全量+变更前快照;资源清单每日导出。
etcd快照备份(含路径与预期)
# 备份目录
mkdir -p /backup/etcd
# 执行快照
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
snapshot save /backup/etcd/etcd-$(date +%F).db
# 校验快照
etcdctl snapshot status /backup/etcd/etcd-$(date +%F).db
资源清单备份
# 导出全量资源(可用于恢复)
kubectl get all -A -o yaml > /backup/cluster-resources-$(date +%F).yaml
kubectl get crd -o yaml > /backup/crd-$(date +%F).yaml
恢复策略#
etcd恢复(示例步骤)
# 1) 停止控制平面组件(静态Pod由kubelet管理)
systemctl stop kubelet
# 2) 恢复快照到新数据目录
export ETCDCTL_API=3
etcdctl snapshot restore /backup/etcd/etcd-2024-01-01.db \
--data-dir /var/lib/etcd-from-backup
# 3) 修改 /etc/kubernetes/manifests/etcd.yaml
# 将 --data-dir=/var/lib/etcd 改为 /var/lib/etcd-from-backup
# 4) 启动kubelet
systemctl start kubelet
资源恢复顺序
# 先恢复CRD,再恢复业务资源
kubectl apply -f /backup/crd-2024-01-01.yaml
kubectl apply -f /backup/cluster-resources-2024-01-01.yaml
最佳实践#
- 使用PDB保障升级期间最小可用实例数。
- 控制平面节点保持奇数个并启用etcd多节点高可用。
- 统一日志与审计,确保回溯能力。
- 严格遵循版本兼容矩阵与灰度升级策略。
练习与自测#
- 升级演练:在测试集群执行
kubeadm upgrade plan并完成一次小版本升级。 - 故障演练:模拟CoreDNS升级失败,使用
rollout undo回退。 - 备份与恢复:完成一次etcd快照备份并在测试环境恢复。
- 命令理解:解释
cordon、drain、uncordon三者差异与使用场景。