Etcd 数据备份

在 Kubernetes 中,etcd 是一个重要的组件,用于存储所有的集群数据。如果想要备份 etcd 数据,可以直接备份 etcd 数据目录,通常位于 /var/lib/etcd/

etcd 的数据默认会存放在我们的命令工作目录中,我们发现数据所在的目录,会被分为两个文件夹中:

  • snap: 存放快照数据, etcd 防止 WAL 文件过多而设置的快照,存储 etcd 数据状态。
  • wal: 存放预写式日志, 最大的作用是记录了整个数据变化的全部历程。在 etcd 中,所有数据的修改在提交前,都要先写入到 WAL 中。
1
2
3
4
5
6
7
8
9
10
11
12
# 备份/etc/kubernetes目录
cp -r /etc/kubernetes/ /backup_$(date +%Y%m%d)/

# 备份/var/lib/etcd目录
cp -r /var/lib/etcd/ /backup_$(date +%Y%m%d)/

# 备份 /var/lib/kubelet目录
cp -r /var/lib/kubelet/ /backup_$(date +%Y%m%d)/

# 使用kubeadm创建的k8s集群,etcd是使用容器运行的,因此备份和还原数据库需要将容器中的etcdctl命令拷贝到操作节点系统下的/usr/bin/目录下
docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk '{print $1}'):/usr/local/bin/etcdctl /usr/bin/

数据恢复
kubeadm安装的单节点master集群,使用的API VERSION为V3
备份ETCDCTL_API为 3 的 etcd 数据到之前的备份目录下

1
ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379"  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt"   snapshot save /backup_$(date +%Y%m%d)/snap-$(date +%Y%m%d%H%M).db

需要先停掉 Master 节点的 kube-apiserver 和 etcd 容器,确保 kube-apiserver 已经停止了。
备注:/etc/kubernetes/manifests 这个目录就是 master 自动运行的一些容器,将其移走或者重命名,自然就会停止了。
image.png
停掉 Master 机器的 kube-apiserver 和 etcd

1
mv manifests  manifests.bak

查看 etcd、api 是否 up,等待全部停止

1
docker ps | grep k8s_ 

全部停止之后变更 / var/lib/etcd

1
mv /var/lib/etcd /var/lib/etcd.bak

恢复 etcd 数据

1
ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379"  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt"   snapshot restore /backup_20220108/snap-202201081337.db

恢复 manifests

1
mv manifests.bak  manifests

查看 pod 是否恢复正常