在Debian系统上备份Kubernetes数据,核心目标是保护**etcd(集群状态存储)和持久卷(PV/PVC)**等关键数据。以下是具体方法及步骤:
etcd是Kubernetes的分布式键值存储,保存了集群的所有配置、状态和元数据(如Pod、Service、ConfigMap等)。备份etcd是Kubernetes备份的核心环节。
确保etcdctl
版本与集群中的etcd版本一致(可通过kubectl exec -it etcd-<node-name> -n kube-system -- etcdctl version
查看集群etcd版本)。
下载并安装对应版本的etcdctl(以v3.5.7为例):
wget https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz
tar -zxvf etcd-v3.5.7-linux-amd64.tar.gz
sudo mv etcd-v3.5.7-linux-amd64/etcdctl /usr/local/bin/
sudo chmod +x /usr/local/bin/etcdctl
使用etcdctl snapshot save
命令创建快照,需指定TLS证书路径(etcd默认启用TLS加密):
# 创建备份目录
sudo mkdir -p /opt/etcd-backup
# 设置环境变量(替换为实际证书路径)
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS="https://127.0.0.1:2379" # 若etcd运行在Master节点,通常为127.0.0.1
export ETCDCTL_CACERT="/etc/kubernetes/pki/etcd/ca.crt"
export ETCDCTL_CERT="/etc/kubernetes/pki/etcd/server.crt"
export ETCDCTL_KEY="/etc/kubernetes/pki/etcd/server.key"
# 执行备份(文件名包含时间戳)
sudo etcdctl snapshot save "/opt/etcd-backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db"
使用etcdutl snapshot status
命令检查快照文件的完整性:
sudo etcdutl snapshot status "/opt/etcd-backup/etcd-snapshot-20251010-120000.db"
输出应显示快照的revision
和size
,无报错则表示备份成功。
通过kubectl
导出所有资源的YAML定义,便于后续快速重建集群资源(如Deployment、Service等)。
kubectl get all --all-namespaces -o yaml > k8s-resources-all.yaml
kubectl get all -n <namespace> -o yaml > k8s-resources-<namespace>.yaml
kubectl get pv,pvc --all-namespaces -o yaml > k8s-pv-pvc.yaml
kubectl get configmap,secret --all-namespaces -o yaml > k8s-config-secret.yaml
若集群中有持久化存储需求(如数据库、日志等),需额外备份PV中的数据。常用工具为restic
(支持加密、增量备份)。
sudo apt-get update
sudo apt-get install restic
选择存储路径(如本地目录/mnt/backup
或远程存储如S3),并设置密码:
sudo restic init --repo /mnt/backup --password-file /etc/restic.password
备份指定目录(如PV挂载路径/mnt/data
):
sudo restic backup /mnt/data --repo /mnt/backup --password-file /etc/restic.password
列出备份内容:
sudo restic ls latest --repo /mnt/backup --password-file /etc/restic.password
使用cron
定时任务自动执行备份脚本,避免人工遗漏。
新建/usr/local/bin/k8s-backup.sh
,内容如下:
#!/bin/bash
# 备份etcd
/opt/etcd-backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db
# 备份Kubernetes资源
kubectl get all --all-namespaces -o yaml > /opt/k8s-backup/k8s-resources-$(date +%Y%m%d-%H%M%S).yaml
# 备份PV数据
restic backup /mnt/data --repo /mnt/backup --password-file /etc/restic.password
# 删除7天前的备份(可选)
find /opt/etcd-backup -name "etcd-snapshot-*.db" -mtime +7 -delete
find /opt/k8s-backup -name "k8s-resources-*.yaml" -mtime +7 -delete
赋予执行权限:
sudo chmod +x /usr/local/bin/k8s-backup.sh
编辑crontab:
sudo crontab -e
添加以下内容(每天凌晨2点执行):
0 2 * * * /usr/local/bin/k8s-backup.sh >> /var/log/k8s-backup.log 2>&1
etcdctl
、Velero
)版本与集群组件版本一致。通过以上步骤,可实现Debian系统上Kubernetes数据的全面备份,保障集群数据安全。