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

参考引用