Featured image of post etcd数据备份和恢复

etcd数据备份和恢复

etcd数据备份和恢复

ETCD 简介

ETCD 是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD 是k8s集群极为重要的一块服务,存储了集群所有的数据信息,如果发生灾难或者 etcd 的数据丢失,都会影响集群数据的恢复,本文重点讲如何备份和恢复数据。

备份

注意:ETCD 不同的版本的 etcdctl 命令不一样,但大致差不多,本文备份使用 napshot save , 每次备份一个节点就行。

假设证书都在/etc/kubernetes/ssl/,并且主节点域名叫做node1.etcd.k8s

1
2
3
4
5
6
7
$ ETCDCTL_API=3; \
  ENDPOINT=node1.etcd.k8s; \
  etcdctl --cacert=/etc/kubernetes/ssl/ca.pem \
          --cert=/etc/kubernetes/ssl/nodecert.pem \
          --key=/etc/kubernetes/ssl/nodecert-key.pem \
          --endpoints=$ENDPOINT:2379 \
          snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

备份脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/bash

date;

CACERT="/etc/kubernetes/ssl/ca.pem"
NODECERT="/etc/kubernetes/ssl/nodecert.pem"
NODEEKY="/etc/kubernetes/ssl/nodecert-key.pem"
ENDPOINTS="node1.etcd.k8s"

ETCDCTL_API=3 etcdctl \
              --cacert="${CACERT}" --cert="${NODECERT}" --key="${NODEEKY}" \
              --endpoints=${ENDPOINTS} \
              snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

# 备份保留30天
find /data/etcd_backup_dir/ -name *.db -mtime +30 -exec rm -f {} \;

恢复

准备工作

  • 停止所有 Master 上 kube-apiserver 服务
1
$ systemctl stop kube-apiserver
  • 停止集群中所有 ETCD 服务
1
$ systemctl stop etcd
  • 移除所有 ETCD 存储目录下数据
1
$ mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
  • 拷贝 ETCD 备份快照
1
2
# 从 node1.etcd.k8s 机器上拷贝备份 
scp /data/etcd_backup_dir/etcd-snapshot-${最后备份时间}.db root@${其他节点,每个节点都要执行}:/data/etcd_backup_dir/

恢复备份

1
2
3
4
# 每个节点机器上操作
$ ETCDCTL_API=3 etcdctl snapshot restore \
                        /data/etcd_backup_dir/etcd-snapshot-${最后备份时间}.db \
                        --config-file=${配置文件路径}

或者每个节点执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
  --name ${etcd的节点名} \
  --initial-cluster "${完整的引导初始集群配置的字符串}" \
  --initial-cluster-token etcd-cluster \
  --initial-advertise-peer-urls ${当前节点的peerurl} \
  --data-dir=/var/lib/etcd/default.etcd

# 示例:
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20231201.db \
  --name etcd-0 \
  --initial-cluster "etcd-0=https://192.168.1.1:2380,etcd-1=https://192.168.1.2:2380,etcd-2=https://192.168.1.3:2380" \
  --initial-cluster-token etcd-cluster \
  --initial-advertise-peer-urls https://192.168.1.1:2380 \
  --data-dir=/var/lib/etcd/default.etcd

上面三台 ETCD 都恢复完成后,依次登陆三台机器启动 ETCD

1
$ systemctl start etcd

三台 ETCD 启动完成,检查 ETCD 集群状态

1
2
3
4
5
6
$ systemctl status etcd
$ ETCDCTL_API=3 etcdctl \
                --cacert=/etc/kubernetes/ssl/ca.pem \
                --cert=/etc/kubernetes/ssl/server.pem \
                --key=/etc/kubernetes/ssl/server-key.pem \
                --endpoints=${ENDPOINTS} endpoint health

三台 ETCD 全部健康,分别到每个节点启动 kube-apiserver

检查 Kubernetes 集群是否恢复正常

1
$ kubectl get cs 

总结

Kubernetes 集群备份主要是备份 ETCD 集群。而恢复时,主要考虑恢复整个顺序:停止kube-apiserver --> 停止ETCD --> 恢复数据 --> 启动ETCD --> 启动kube-apiserve

注意:由于集群的强一致性,备份ETCD集群时,只需要备份一个ETCD节点就行了,恢复时拿同一份备份数据恢复。