别只盯着etcd了!聊聊K8s备份里那些容易被忽略的‘边角料’数据

张开发
2026/4/13 8:33:47 15 分钟阅读

分享文章

别只盯着etcd了!聊聊K8s备份里那些容易被忽略的‘边角料’数据
别只盯着etcd了K8s备份中那些被遗忘的关键数据凌晨三点整个运维团队盯着监控大屏上的一片红色告警——集群网络完全瘫痪。尽管etcd和PV数据都完整恢复但业务依然无法访问。问题最终定位到没人记得备份Calico的IPAM状态文件。这个真实案例揭示了Kubernetes备份中最大的认知盲区我们往往只关注心脏(etcd)和血液(PV)却忽略了让器官协同工作的神经系统。1. 为什么这些边角料能让你前功尽弃在Kubernetes集群中有类数据像空气一样存在——平时感觉不到它的重要性直到失去时才追悔莫及。它们通常具有三个特征非集中存储分散在节点文件系统、第三方数据库或内存中动态生成部分数据运行时产生不在静态配置中版本敏感与特定K8s版本或插件版本强绑定最典型的反面教材是某金融公司使用Velero完整备份后恢复时发现集群网络插件(Calico)的IP分配状态丢失节点kubelet自动生成的证书过期Ingress Controller的灰度规则配置未保存Helm的release状态与集群实际状态不一致最终导致恢复时间从预计的1小时延长到8小时。下表对比了核心数据与辅助数据的差异数据类型存储位置备份工具覆盖故障表现恢复复杂度etcd数据集中式数据库所有工具集群完全不可用低PV数据存储系统大部分工具业务数据丢失中网络插件状态文件/内存/第三方存储极少工具网络不通或IP冲突高节点配置节点本地无节点注册失败或证书错误高2. 被忽视的六大关键数据清单2.1 网络组件的记忆碎片以Calico为例以下数据必须纳入备份范围# Calico的IPAM分配状态etcd后端 ETCDCTL_API3 etcdctl --endpoints$ETCD_ENDPOINTS \ get --prefix /calico/ipam/v2 # BGP对等配置文件形式 cp -r /etc/calico/confd /backup/calico-config-$(date %s)特别注意使用host-local插件的Flannel需要备份/var/lib/cni/networks/flannel/*2.2 节点上的身份证件每个节点的kubelet都会生成唯一身份凭证包含在# kubelet自动生成的密钥对 tar -czf /backup/node-$(hostname)-kubelet-$(date %Y%m%d).tgz \ /var/lib/kubelet/pki \ /etc/kubernetes/kubelet.conf恢复时若证书过期需要手动删除旧证书并重启kubelet触发重新生成2.3 Ingress控制器的交通规则以Nginx Ingress为例这些动态生成的配置常被遗漏# 内存中的动态路由表需通过admin接口导出 kubectl -n ingress-nginx exec deploy/ingress-nginx-controller \ -- curl http://localhost:10246/configuration/backup ingress-config-$(date %s).json2.4 Helm的隐藏账本即使使用--atomic参数Helm的release状态也可能与实际不符# 备份所有release的元数据 helm list -A -o json helm-releases-$(date %s).json # 针对每个release备份values和manifest for r in $(helm list -A -q); do ns$(helm list -A -o json | jq -r .[] | select(.name\$r\) | .namespace) helm get values -n $ns $r helm-$r-values-$(date %s).yaml helm get manifest -n $ns $r helm-$r-manifest-$(date %s).yaml done2.5 监控告警的神经系统Prometheus的Alertmanager配置常被忽略# 备份Prometheus规则和Alertmanager配置 kubectl -n monitoring get secret alertmanager-main -o jsonpath{.data.alertmanager\.yaml} | base64 -d alertmanager-config-$(date %s).yaml kubectl -n monitoring get prometheus k8s -o jsonpath{.spec.ruleFiles} prometheus-rules-$(date %s).json2.6 自定义调度器的决策依据若使用了自定义调度器需要备份# 调度器策略配置 kubectl get cm -n kube-system scheduler-policy -o yaml scheduler-policy-$(date %s).yaml # 节点打分数据如有 kubectl get --raw /metrics | grep scheduler_ scheduler-metrics-$(date %s).txt3. 构建全维度备份方案3.1 分层备份策略设计数据层级备份频率保留周期工具选择验证方法核心数据每小时7天Velero快照定期恢复测试集群关键配置每天30天自定义脚本Git版本控制配置diff检查节点状态节点变更时永久系统镜像配置管理工具新节点启动测试动态生成数据实时15天Sidecar收集对象存储模拟故障注入测试3.2 自动化备份流水线示例#!/bin/bash # 全量备份流程 BACKUP_DIR/backup/$(date %Y%m%d-%H%M%S) mkdir -p $BACKUP_DIR # 阶段1标准Velero备份 velero backup create full-$(date %s) --wait # 阶段2网络插件状态备份 calico_backup $BACKUP_DIR/calico # 阶段3节点关键配置收集 for node in $(kubectl get nodes -o name); do kubectl debug $node -it --imagealpine -- \ sh -c tar -czf - /etc/kubernetes /var/lib/kubelet $BACKUP_DIR/${node#node/}.tgz done # 阶段4打包上传到对象存储 tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR aws s3 cp $BACKUP_DIR.tar.gz s3://my-backup-bucket/关键技巧为每个备份打上集群指纹标签避免恢复时混淆echo cluster-fingerprint: $(kubectl get ns kube-system -o jsonpath{.metadata.uid}) $BACKUP_DIR/meta3.3 验证备份有效性的四步检查法元数据校验# 检查备份文件完整性 velero backup describe backup-name --details | grep -i error最小化恢复测试# 在隔离环境恢复核心组件 velero restore create --from-backup backup-name \ --include-namespaces kube-system,default网络连通性验证# 测试跨命名空间网络通信 kubectl run test-$RANDOM --imagealpine --restartNever -- \ ping 其他命名空间的Service数据一致性采样# 对关键PV数据进行校验和比对 kubectl exec -it pod-name -- \ find /data -type f -exec sha256sum {} checksum-$(date %s).txt4. 从故障中学习的恢复手册4.1 网络插件恢复实战场景Calico IPAM状态丢失导致Pod无法获取IP# 步骤1暂停所有Pod调度 kubectl cordon 所有节点 # 步骤2恢复IPAM数据库 ETCDCTL_API3 etcdctl --endpoints$ETCD_ENDPOINTS \ put /calico/ipam/v2/host/节点名 - backup/ipam-host.json # 步骤3逐个节点恢复 for node in $(kubectl get nodes -o name); do kubectl uncordon ${node#node/} sleep 30 # 等待节点稳定 done4.2 节点证书过期的应急处理当kubelet证书过期时快速恢复# 在故障节点执行 systemctl stop kubelet rm -f /var/lib/kubelet/pki/kubelet.* systemctl start kubelet # 在控制平面批准新CSR kubectl certificate approve $(kubectl get csr -o name | grep kubelet)4.3 Helm状态不一致的修复方案当Helm release状态与实际不符时# 找出差异资源 helm get manifest -n ns release | kubectl diff -f - # 强制同步状态 helm rollback -n ns release revision5. 构建备份文化的三个习惯变更即备份任何涉及网络插件、存储配置、安全策略的变更后立即触发相关组件备份标签化管理为每个备份打上清晰的场景标签例如velero backup create name --labels changenetwork-upgrade,ownerteam-a故障预演每季度选择以下场景进行演练随机删除一个节点的系统目录清空某个网络组件的数据库修改Helm release状态使其与实际不符

更多文章