一、前言

Kubernets集群在企业中的运用,数据备份是至关重要的,而k8s集群数据是存储在etcd键值数据库中,倘若出现数据误删除或者服务器集群宕机等情况,会导致etcd数据的丢失或者某个etcd节点异常。此时我们最快速最有效的方法就是从备份中去恢复集群数。

二、实验环境

首先准备了一套标配的二进制部署的k8s集群,三个(master、etcd)节点+两个node节点,创建名为"test-bak"命名空间,并在下面任意创建pod数据

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据备份

2.1、数据备份

etcd数据备份可以在etcd活跃的集群状态进行,且不影响集群性能

内置快照

etcd 支持内置快照。快照可以从使用 etcdctl snapshot save 命令的活动成员中创建, 也可以通过从目前没有被 etcd 进程使用的 etcd 数据目录 中拷贝 member/snap/db 文件。创建快照并不会影响 etcd 成员的性能。

2.1.1、数据快照备份

#etcdctl --endpoints="x.x.x.x:2379" \
--cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem \
--cert=/etc/kubernetes/pki/etcd/etcd.pem \
--key=/etc/kubernetes/pki/etcd/etcd-key.pem \
snapshot save /backup/etcd-snapshot.db

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据备份_02

2.1.2、模拟数据误删除

手动清除命名空间下的pod数据,以此来模拟数据丢失问题

#kubectl delete deploy nginx
#kubectl delete ns test-bak

2.2、数据恢复

2.2.1、停止kube-apiserver服务

为了保证etcd不在与任何集群组件进行数据交互,在数据恢复之前先手动停止kube-apiserver服务

#systemctl stop kube-apiserver

2.2.2、停止etcd服务

停止etcd服务,避免数据新数据再次写入

#systemctl stop etcd

2.2.3、恢复备份

附上Kubernetes官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据恢复_03

不同集群环境下,etcd数据目录可能不一样,在这里可以通过systemctl status etcd查看配置参数,找到对应的配置文件,重点关注下name、initial-cluster、initial-cluster-token、initial-advertise-peer-urls和data-dir参数的值,另外数据恢复需要注意两点,第一,保证当前的数据目录为空,第二自 etcd v3.5.x 起,使用 etcdctl 进行恢复的功能已被 弃用,并计划在 etcd v3.6 中移除。 建议改用 etcdutl。目前当前我是用的etcd版本为3.5.1, 经过测试,已经无法正常使用ecdctl进行数据还原了

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据_04

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据恢复_05

master1数据恢复
#export ETCDCTL_API=3 
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master01 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据备份_06

master2数据恢复
#export ETCDCTL_API=3 
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master02 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据_07

master3数据恢复
#export ETCDCTL_API=3 
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master03 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据_08

2.2.4、恢复服务实例

数据恢复完毕之后,依次将节点kube-apiserver、etcd服务示例启动

#systectl start kube-apiserver
#systectl start etcd

三、回归验证

可以看到我们的"test-bak"数据已经恢复正常,  PVC 持久化卷也恢复正常

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据恢复_09

企业级Kubernetes Etcd 键值数据库备份与恢复实战_数据_10

四、总结

Kubernetes集群备份主要是备份etcd集群,而恢复时,主要考虑恢复整个顺序:

停止Kube-apiserver
停止etcd
恢复数据
启动etcd
启动-kubeapiserver