CentOS 上 Kubernetes 备份与恢复实操指南
一、备份策略与范围
- 备份对象应覆盖四类关键资产:
- etcd 数据(集群状态与元数据);2) 控制面配置(/etc/kubernetes 与 kubeconfig);3) 应用与持久卷数据(数据库、对象存储等);4) 集群资源清单(通过 kubectl 导出)。
- 建议明确备份频率(如每日/每周)、保留周期(如7/30 天)、异地/多副本存储与定期恢复演练,确保可用性与一致性。
二、etcd 快照备份与恢复(控制面核心)
- 前置准备
- 使用 ETCDCTL_API=3;在 kubeadm 部署中,证书通常位于 /etc/kubernetes/pki/etcd/,etcd 数据目录为 /var/lib/etcd。
- 获取 endpoints:可从 etcd Pod 的启动参数中查看,常见为 https://127.0.0.1:2379(本地)与节点 IP 的 2379 端口。
- 备份命令(任选其一)
- 本地回环地址:
ETCDCTL_API=3 etcdctl --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
snapshot save /backup/etcd-$(date +%F-%H%M).db
- 指定节点地址(如有多 master,任选其一执行):
ETCDCTL_API=3 etcdctl --endpoints=“https://<MASTER_IP>:2379”
–cacert=/etc/kubernetes/pki/etcd/ca.crt
–cert=/etc/kubernetes/pki/etcd/server.crt
–key=/etc/kubernetes/pki/etcd/server.key
snapshot save /backup/etcd-$(date +%F-%H%M).db
- 备份后建议校验:
ETCDCTL_API=3 etcdctl --write-out=table snapshot status /backup/etcd-*.db
- 恢复要点(高风险,务必在维护窗口操作)
- 单 master(kubeadm):
- 暂停控制面:mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
- 清理旧数据:rm -rf /var/lib/etcd/*
- 恢复快照:
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-*.db
–data-dir=/var/lib/etcd
- 恢复 manifests:mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
- 等待 kubelet 拉起 etcd/apiserver,验证:kubectl get pods -n kube-system
- 多 master(每个 master 节点分别恢复为自身身份):
- 各 master 先暂停控制面(同上)并清理 /var/lib/etcd
- 在每个 master 上用本机参数恢复(示例为 master1):
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-*.db
–name master1
–initial-advertise-peer-urls https://<MASTER1_IP>:2380
–initial-cluster master1=https://<MASTER1_IP>:2380,master2=https://<MASTER2_IP>:2380,master3=https://<MASTER3_IP>:2380
–initial-cluster-token etcd-cluster-0
–data-dir=/var/lib/etcd
- 各节点恢复 manifests 后启动,检查集群状态与成员列表一致性。
三、控制面与静态资源备份
- 备份 /etc/kubernetes 与 kubeconfig(建议在备份 etcd 的同时进行):
- cp -a /etc/kubernetes /backup/etc-kubernetes-$(date +%F)
- cp ~/.kube/config /backup/kubeconfig-$(date +%F)
- 备份关键目录(可选,用于文件级回滚):
- rsync -a /var/lib/kubelet /backup/var-lib-kubelet-$(date +%F)
- 导出集群资源清单(便于审计与迁移):
- kubectl get ns -o yaml > /backup/ns-$(date +%F).yaml
- kubectl get all,ingress,configmap,secret,pvc,pv,storageclass,crd -A -o yaml > /backup/resources-$(date +%F).yaml
- 如需备份节点级重要目录,可用 tar/rsync 做定时归档与异地同步。
四、应用与持久卷数据备份
- 有状态应用(数据库、消息队列等)优先采用应用级备份(如 mysqldump、pg_dump、mongodump、应用快照),并与存储快照/备份工具联动。
- 示例(MySQL 每日备份):
mysqldump -h localhost -u root -p’PASSWORD’ --single-transaction --routines --triggers DATABASE
| gzip > /backup/mysql-DATABASE-$(date +%F).sql.gz
- 对象存储/文件数据:使用厂商工具或 s3cmd/rclone 做定期同步与异地多活。
- 无状态应用:以资源清单与镜像仓库记录为主,配合声明式部署即可快速重建。
五、Velero 进行集群级备份与恢复(含 PV 快照)
- 适用场景:跨命名空间/跨集群迁移、定时/增量备份、与云厂商快照集成。
- 基本步骤:
- 准备对象存储(如 MinIO/S3)与凭证;
- 安装 Velero 客户端与服务端(建议使用 Helm);
- 创建备份存储位置(Bucket/Region/AccessKey/Secret);
- 执行备份:
- 全量:velero backup create backup-$(date +%F) --wait
- 指定命名空间:velero backup create nginx-backup --include-namespaces nginx-example --wait
- 恢复:velero restore create --from-backup backup-$(date +%F)
- 如需 PV 快照,启用对应云提供商插件并在备份时开启 VolumeSnapshot 支持。
- 提示:Velero 主要覆盖“Kubernetes 资源层与云盘快照”,不替代 etcd 快照;关键场景建议同时保留 etcd 快照。