etcd数据的备份和恢复

732 阅读1分钟

目前,仍有很多etcd以容器的方式运行。在多种安装方式中,大部分仍运行在容器中。比如,rancher安装,kubeadm,minikube(以pod的形式运行)。所以,我们可以在宿主机上使用etcdctl操作容器中的etcd

环境准备

  • etcd的运行
root@node45 certs]# ps -ef | grep etcd
root      7101  7081  1 11:15 ?        00:02:17 etcd --advertise-client-urls=https://192.168.5.45:2379 --cert-file=/var/lib/minikube/certs/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/minikube/etcd --initial-advertise-peer-urls=https://192.168.5.45:2380 --initial-cluster=node45=https://192.168.5.45:2380 --key-file=/var/lib/minikube/certs/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.5.45:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.5.45:2380 --name=node45 --peer-cert-file=/var/lib/minikube/certs/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/var/lib/minikube/certs/etcd/peer.key --peer-trusted-ca-file=/var/lib/minikube/certs/etcd/ca.crt --proxy-refresh-interval=70000 --snapshot-count=10000 --trusted-ca-file=/var/lib/minikube/certs/etcd/ca.crt
  • etcdctl安装
wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
tar zxvf etcd-v3.4.13-linux-amd64.tar.gz
mv etcd-v3.4.13-linux-amd64/etcdctl /usr/bin

基础命令检查

  • endpoint health
ECTD_API=3 etcdctl  --cacert=$PWD/etcd/ca.crt  --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key  -endpoints=https://192.168.5.45:2379 endpoint health
  • get
# 查看所有的key
ECTD_API=3 etcdctl  --cacert=$PWD/etcd/ca.crt  --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key  --endpoints=https://192.168.5.45:2379 get /  --prefix --keys-only
# 查看某一个key
ECTD_API=3 etcdctl  --cacert=$PWD/etcd/ca.crt  --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key  --endpoints=https://192.168.5.45:2379 get /registry/namespaces/default

实验

  • 创建namespace etcd-test之后,备份
[root@node45 certs]# pwd
/var/lib/minikube/certs

kubectl create ns etcd-test
ECTD_API=3 etcdctl  --cacert=$PWD/etcd/ca.crt  --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key  --endpoints=https://192.168.5.45:2379 snapshot save  /tmp/etcd-snapshot-`date +%Y%m%d`.db
  • 删除namespace etcd-test,再恢复
kubectl delete ns etcd-test
rm -rf /var/lib/minikube/etcd/
ECTD_API=3 etcdctl  --cacert=$PWD/etcd/ca.crt  --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key  --endpoints=https://192.168.5.45:2379 snapshot restore  /tmp/etcd-snapshot-20201104.db --name=node45  --initial-cluster=node45=https://192.168.5.45:2380 --initial-advertise-peer-urls=https://192.168.5.45:2380 --data-dir=/var/lib/minikube/etcd

注意: restore对应的参数需要与之前etcd启动的参数一一对应。

  • 查看
[root@node45 certs]# kubectl  get pod -n kube-system | grep etcd
etcd-node45                      1/1     Running            1          3h26m
[root@node45 certs]# kubectl  get ns 
NAME              STATUS   AGE
default           Active   3h27m
etcd-test         Active   30m
kube-node-lease   Active   3h27m
kube-public       Active   3h27m
kube-system       Active   3h27m
[root@node45 certs]# 

注: etcd-node45重启过一次(因为删除了之前的etcd内容),同时,namespace etcd-test也恢复了。

其他

  • 在操作etcd时,最好能够先将kube-apiserver停止,再暂停etcd,之后再执行恢复操作
  • 如果是以rancher或者二进制的方式直接安装的k8s,是可以暂停容器或者停止进程的。但是,如果以kubeadm,minikube安装的k8s,etcd都是以pod的形式运行的,因此,无法停止pod,可以直接删除原有的数据之后,执行snapshot restore命令。
  • 在实际生产过程中,为了防止etcd数据丢失,可以编写定时任务脚本,备份etcd中的数据,脚本如下:
[root@node45 certs]# cat /tmp/save_etcd 

# /bin/bash

ETCD_PATH=/var/lib/minikube/certs
CACERT=$ETCD_PATH/etcd/ca.crt
CERT=$ETCD_PATH/etcd/server.crt
KEY=$ETCD_PATH/etcd/server.key
ENDPOINTS=https://192.168.5.45:2379

ETCDCTL_API=3 etcdctl \
--cacert="${CACERT}" --cert="${CERT}" --key="${KEY}" \
--endpoints=${ENDPOINTS} \
snapshot save /etcd-backup/etcd-snapshot-`date +%Y%m%d%H%M%S`.db