etcd 数据备份与恢复
etcd 数据备份与恢复
etcd 是高性能K/V数据库,Kubernetes系统中所有数据都存储于etcd数据中,所以为保障Kubernetes的可用性,针对etcd的备份还是很有必要的。
etcd容器运行
备份
冷备份
Kubeadm默认安装时,etcd的存储数位于节点的/var/lib/etcd/目录,将此目录下的文件定期复制归档压缩起来,如果以后etcd的数据出现问题,需要恢复时,直接将文件还原到此目录下,就实现了单节点的etcd数据恢复。
故而此种方式的备份和恢复,用基于文件的备份即可。
热备份[推荐]
一般来说,一般比较推荐使用etcd的自带的工具etcdctl 来实现数据备份,该方式相对灵活,只要有证书且能访问etcd的2379端口即可实现数据备份。
备份伪脚本:
export BK_DIR=/data/backup/etcd
export BK_TIME=$(date +%Y%m%d)
test -d $BK_DIR || mkdir -p $BK_DIR
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 ${BK_DIR}/snap-${BK_TIME}.db
提示:该方式在kubernetes节点,若使用其它节点备份时需要将证书复制到备份节点。
验证快照数据
ETCDCTL_API=3 etcdctl --write-out=table snapshot status ${BK_DIR}/snap-${BK_TIME}.db
恢复
为了防止在恢复期间,apiserver 写入新数据,需要先把 apiserver 和 etcd 容器暂停。
mv /etc/kubernetes/manifests/{kube-apiserver.yaml,etcd.yaml} /tmp/
或
mv /etc/kubernetes/manifests /etc/kubernetes/manifests.back
备注:/etc/kubernetes/manifests 这个目录就是master自动运行的一些容器,将其移走或者重命名,自然就会停止
将etcd目录重命名
mv /var/lib/etcd /var/lib/etcd.bak
恢复etcd数据
export BK_DIR=/data/backup/etcd
export BK_TIME=$(date +%Y%m%d)
ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" \
--data-dir=/var/lib/etcd \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
--cacert="/etc/kubernetes/pki/etcd/ca.crt" \
snapshot restore ${BK_DIR}/snap-${BK_TIME}.db
恢复启动静态容器
mv /tmp/{kube-apiserver.yaml,etcd.yaml} /etc/kubernetes/manifests/
或
mv /etc/kubernetes/manifests.back /etc/kubernetes/manifests
提示:高可用集群的备份恢复类同。
运维专区
查看etcd集群成员
# 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" \
member list --write-out=table
+------------------+---------+---------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+---------+----------------------------+----------------------------+------------+
| 9f6ce524feeab7ed | started | master0 | https://172.20.200.21:2380 | https://172.20.200.21:2379 | false |
+------------------+---------+---------+----------------------------+----------------------------+------------+
备份脚本
也可以使用以下脚本来创建个 Crontab来实现自动脚本。
#!/usr/bin/env bash
# 文件名: etcd_backup.sh
# 功 能: etcd 数据备份脚本
export BACKUP_DIR="/data/backup/etcd"
export BACKUP_DATE="$(date +%Y%m%d)"
export BACKUP_FILE="snap-$(date +%H%M).db"
export BACKUP_KEEP_DAYS="${BACKUP_DIR}/$(date -d "-7 days" +%Y%m%d)"
export CACERT="/etc/kubernetes/pki/etcd/ca.crt"
export ETCD_CERT="/etc/kubernetes/pki/etcd/server.crt"
export ETCD_KEY="/etc/kubernetes/pki/etcd/server.key"
export ENDPOINTS="https://127.0.0.1:2379"
export ETCDCTL_API=3
test -d ${BACKUP_DIR}/${BACKUP_DATE} || mkdir -p ${BACKUP_DIR}/${BACKUP_DATE}
etcdctl --endpoints="${ENDPOINTS}" \
--cert="${ETCD_CERT}" \
--key="${ETCD_KEY}" \
--cacert="${CACERT}" \
snapshot save ${BACKUP_DIR}/${BACKUP_DATE}/${BACKUP_FILE}
if [[ -d ${BACKUP_KEEP_DAYS} ]]
then
rm -rf ${BACKUP_KEEP_DAYS}
echo "$(basename $0): ${BACKUP_KEEP_DAYS} deleted" >>${BACKUP_DIR}/delete.log
fi