K8S HA群集已经运行蛮长一段时间了。虽然已经做了HA,但是内网环境伴随着每天开关机并偶有意外断电等不可控制因素的影响,这使用的实再是有些心惊胆颤,生怕有一天来个硬盘大罢工再附送个暴机大礼包那就完犊子。刚好这次为增强ceph的性能打算将master节点的系统盘换成高性能ssd,就顺便研究下灾备与恢复。
好吧,备份是什么?最简单的就是文件copy了。为了快速达到效果,我们不搞那么复杂的东西,这次的目标就是通过linux定时任务和shell脚本每天在关机关定时全量备份master节点文件。
需要备份什么?
1、k8s是通过etcd来保存网络及对象状态信息的这个是必备的核心
/var/lib/etcd/
2、节点配置信息、证书、静态pod等等
/etc/kubernetes/
3、kubectl连接证、缓存等信息
/root/.kube/ (root为kubectl安装用户目录)
4、flannel、cni等网络信息
/etc/cni/
/opt/cni/
/var/run/flannel/
5、kubelet应用程序
/var/lib/kubelet
6、其它一些pod使用host path形式的存储数据目录
/var/lib//rook
/etc/keepalived/keepalived.conf
注:集群中用host path只有rook和kubelived。最好不要使用host path方式存储,即使有需要也可以使用local pv统一存储方便备份和管理
如何备份?
1、生成备份shell脚本文件k8s-master-back.sh
echo "停止kubelet"; systemctl stop kubelet; echo "停止docker";
docker stop $(docker ps -aq);
systemctl stop docker; echo "开始备份"; date=$(date "+%Y%m%d"); file="/tmp/${date}-${HOSTNAME}.tar.gz" tar -zcvPf "${file}" /etc/kubernetes/ /etc/cni/ /opt/cni/ /var/lib/etcd/ /var/lib/kubelet /var/run/flannel/ /root/.kube /var/lib/rook/ /etc/keepalived/keepalived.conf
echo "复制备份文件到远程备份机"
sshpass –p 111111 scp $file root@192.168.1.230:/back;
echo "删除临时备份文件"
rm –rf $file;
echo "启动docker"; systemctl start docker; echo "启动kubelet" systemctl start kubelet; echo "结束备份,备份文件:${file}" exit 0;
注:备份时需要停止etcd容器,最好停止所有容器和kubelet,否则还原时有可有出现etcd wal文件验证不通过错误
2、安装并定义计划任务(每天晚上21点执行备份)
#进入计划任务编辑界面 crontab -e #编辑定时任务 0 21 * * * /home/back/k8s-master-back.sh #保存
节点恢复
1、拿出一块新ssd硬盘,按常规步骤设置系统各项参数,然后安装docker、kubeadm、kubectl、kubelet。注意kubelet版本、host name和ip和以前设置的一至。
2、使用备份文件恢复
read -p "请输入备份压缩包文件绝对路径:" backfile; if [ ! -f "${backfile}" ]; then echo "文件不存在"; exit 0;fi; echo "停止kubelet"; systemctl stop kubelet; echo "停止docker" systemctl stop docker; echo "还原" tar -zxvf $backfile -C /; #echo "启动docker"; #systemctl start docker; #echo "启动kubelet"; #systemctl start kubelet; echo "还原结束"; exit 0;
备份到那里?
好吧,这是一个问题。灾备,肯定是在遇到灾难时用来恢复的,那肯定是不能备份到本机硬盘的,甚至是不能备份到本地机房,万一那个离职员工一把火把机记烧了呢,这可比删库还狠^_^。
一般情况下有以下几种方式:
1、备份至云端s3等
2、异地多集群互备存储
3、额外的文件存储系统
注:我的选择是本地一台nas做raid1并同步云端,专门用来做各种备份。