
回复
在上篇文章中,介绍了 Kubernetes 资源的备份工具 Velero,我们可以安全快速的备份出运行在 Kubernetes 的资源,但是 Kubernetes 本身的备份更多的依赖 etcd 备份策略,所以我们本篇文章介绍备份 etcd 数据库。
了解这两篇文章的精髓,那么玩转 Kubernetes 云环境的备份恢复就如鱼得水。
一般情况的 Kubernetes 部署分为 kubeadm 部署和二进制部署,二进制部署备份etcd 相对较为简单,所以本篇文章介绍 kubeadm 及其边缘依赖kubeadm ,比如 sealos、kubekey 部署的 etcd 备份,此种部署方式, etcd 部署在容器内部,我们就需要备份容器内部的数据。
在 master 主机或者 etcd 所在节点的主机执行如下命令,将容器中的 etcdctl
命令拷贝至本机系统 PATH
路径下。
docker cp $(docker ps | grep etcd | grep -v pause | head -1 |awk '{print $1}'):/usr/local/bin/etcdctl /usr/local/bin/
kubectl exec -i -n <some-namespace> <some-pod> -- tar xf -
,是需要容器中支持 tar 命令,官方 etcd 镜像并没有 tar 命令,所以会有 command terminated with exit code 126
报错。nerdctl cp $(nerdctl ps | grep etcd | grep -v pause | head -1 | awk '{print $1}'):/usr/local/bin/etcdctl /usr/local/bin/
本命令支持单节点多 etcd pod ,所以可以直接执行。
mkdir -pv /data/etcd-backup
这个操作一般仅需执行一次即可。
cp -r /etc/kubernetes/ /data/k8s-static-resource-backup
这个操作一般仅需执行一次即可。
cp -r /var/lib/etcd/ /data/etcd-config-backup
一般配置为定时任务,每天晚上定时备份即可。
export ETCDCTL_API=3
etcdctl --endpoints 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 /data/etcd-backup/snap-$(date +%Y-%m-%d).db
etcdctl snapshot status /opt/etcd-backup/snap-2022-09-01.db --write-out=table
Deprecated: Use `etcdutl snapshot status` instead.
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| e27b7615 | 29913645 | 6585 | 40 MB |
+----------+----------+------------+------------+
清空该目录前清注意是否有备份,没有的话需要先备份该目录,防止还原失败。若不清除该目录,则还原操作会失败。
rm -rf /var/lib/etcd
etcdctl snapshot restore /opt/etcd-backup/snap-2022-09-01.db --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --data-dir=/var/lib/etcd/ --endpoints=https://127.0.0.1:2379
本文章展示的是单点 etcd ,备份恢复策略,集群的也类似,只不过 endpoint 需要添加 etcd 集群中的节点,其余是是类似的。
这是本人生产环境的备份数据,也要定期拷贝至其他备份存储上。