数据容灾是集群维护中重要的工作之一,避免误删,机器宕机,病毒入侵,不可抗因素导致的服务不可用,或数据缺失等灾难性问题
为了让服务可靠稳定的运行,数据备份工作就需要在集群搭建之初一起设计,集群运行之后开始实施
背景
需要备份的数据
- k8s集群所有数据都存放在 etcd中,因此要备份k8s集群就是备份etcd数据
- 但是还有一些配置在服务器上,比如kubelet 配置文件,集群的CA各组件证书
- 另外有状态服务如mysql,mongo等数据
备份方式
- 备份数量两份以上
- 存放位置异机备份,跨区或跨省存放
- 脚本+开源工具
- 定时任务按规则运行
作用
- 恢复故障集群
- 修复不完整数据
- 保障服务可靠稳定运行
容灾事项
-
按数据重要性或数据量进行定期恢复演练
-
定期检查备份数据是否被删除,或锁定
-
定期检查数据大小变化
工具
etcd工具
- 使用etcd自带的snapshot 功能备份
- 使用etcd-backup工具备份
- 使用etcd-backup-restore工具备份基于k8s集群的etcd
k8s集群工具
- 使用velero工具备份或迁移或复制k8s集群
- 使用kube-dump备份资源清单
- 使用stash工具备份有状态应用(没有测试过)
实践
etcd自带命令
下载一个etcd包,放到k8s节点上,指定私钥和证书文件
备份
etcdctl --endpoints=https://ip:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
snapshot save /backup/etcd-snapshot.db
复制代码
恢复
etcdctl snapshot restore /backup/etcd-snapshot.db; mv /default.etcd/member/ /var/lib/etcd/
复制代码
默认会恢复到 /default.etcd/member/ 目录下,这里使用 mv 命令在移动到挂载目录 /var/lib/etcd/ 下
etcd-backup工具
该工具使用go语言编写,代码清晰简洁,因为笔者也一直在使用go编写工具,所以有需要可以改改源代码,方便开发更多功能,比如备份上传到指定服务器或oss等
直接源码包: github.com/gravitation…
这里需要我们自已编译,而且没说说明怎么打包编译,我们这里使用go model
go mod init etcd-backup
go build
复制代码
备份
etcd-backup backup --etcd-cafile /etc/kubernetes/pki/etcd/ca.crt \
--etcd-certfile /etc/kubernetes/pki/etcd/healthcheck-client.crt \
--etcd-keyfile /etc/kubernetes/pki/etcd/healthcheck-client.key \
--etcd-servers https://ip:2379
复制代码
恢复
etcd-backup restore --etcd-servers https://ip:2379
复制代码
stash工具
该工具分社区版本企业版,功能限制较多,因为一些原因没有测试过,对于有兴趣的同学可以试试
kube-dump工具
该工具是将集群备份为yaml清单
使用:
安装依赖和工具
# kubectl
curl -sLo ~ /.local/bin/kubectl \
https://storage.googleapis.com/kubernetes-release/release/v1.20.2/bin/linux/amd64/kubectl
chmod +x ~ /.local/bin/kubectl
# jq
curl -sLo ~ /.local/bin/jq \
https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod +x ~ /.local/bin/jq
# yq
curl -sLo ~ /.local/bin/yq \
https://github.com/mikefarah/yq/releases/download/v4.5.0/yq_linux_amd64
chmod +x ~ /.local/bin/yq
#下载kube-dump
curl -Lso ~/.local/bin/kube-dump \
https://raw.githubusercontent.com/WoozyMasta/kube-dump/v1.0.6/kube-dump && \
chmod +x ~/.local/bin/kube-dump
复制代码
备份
./kube-dump all -d /bakcupdir/
复制代码
velero工具
完全开源的一个备份,迁移,复制工具,接下来重点展开实战
我们根据最新版文档一步一步操作 传送门: velero.io/docs/v1.6/
概述
Velero(以前称为 Heptio Ark)为您提供了用于备份和恢复 Kubernetes 集群资源和持久卷的工具。
您可以通过云提供商或本地运行 Velero。
Velero 作用:
-
备份您的集群并在丢失时恢复。
-
将集群资源迁移到其他集群。
-
将您的生产集群复制到开发和测试集群。
Velero 组件:
-
在集群上运行的服务器
-
本地运行的命令行客户端
工作原理
每个 Velero 操作——按需备份、计划备份、恢复——都是一个自定义资源,使用 Kubernetes自定义资源定义 (CRD) 定义并存储在etcd 中。
Velero 还包括处理自定义资源以执行备份、恢复和所有相关操作的控制器。
您可以备份或恢复集群中的所有对象,也可以按类型、命名空间和/或标签过滤对象。
Velero 非常适合灾难恢复用例,以及在集群上执行系统操作(如升级)之前对应用程序状态进行快照。
按需备份:
- 将复制的 Kubernetes 对象的 tarball 上传到云对象存储中,或调API制作持久卷快照
计划备份:
- 循环间隔备份的数据,按照cront来执行任务
恢复:
- 恢复所有对象和持久卷从先前创建的备份,也可以只回复部分
过期:
-
设置指定 TTL(生存时间)来删除过期的备份
备份工作流程
当你运行velero backup create test-backup
:
-
Velero 客户端调用 Kubernetes API 服务器来创建一个
Backup
对象。 -
该
BackupController
注意到新的Backup
对象,并进行验证。 -
在
BackupController
开始备份过程。它通过向 API 服务器查询资源来收集要备份的数据。 -
将
BackupController
使得对象存储服务的调用-例如,AWS S3 -上传备份文件。
默认情况下,velero backup create
为任何持久卷制作磁盘快照。您可以通过指定附加标志来调整快照。运行velero backup create --help
以查看可用标志。可以使用选项禁用快照--snapshot-volumes=false
。
安装
下载压缩包,然后解到/usr/local/bin 目录下
wget https://github.com/vmware-tanzu/velero/releases/download/v1.6.1/velero-v1.6.1-linux-amd64.tar.gz
cp velero-v1.6.1-linux-amd64/velero /usr/local/bin/备
复制代码
备份数据存放,velero支持众多第三方存储,包括腾讯云和阿里云的对象存储,因为它允许社区自建插件
这里以minio为例
启动minio, 在velero包中自带了相应的depoyment文件,minio默认的账密是minio/minio123
kubectl create -f velero-v1.6.1-linux-amd64/examples/minio/00-minio-deployment.yaml
复制代码
开放端口
sed -i "/type: /s#ClusterIP#NodePort#" velero-v1.6.1-linux-amd64/examples/minio/00-minio-deployment.yaml
复制代码
上述命令执行不生效,因为Console端口已经是动态的了
端口是(查看日志确定),因为最新的minio镜像把Console端口弄成动态的了,api的端口还是9000
这个动态端口每次都不一样,需要去看minio pod日志确定,开放这个是为了在页面看,下面的install 必须是9000端口。因为api是9000端口
kubectl expose deployment minio -n velero --type=NodePort --name=minio-nodeport --target-port=40610
复制代码
但是ui界面还是得以40610转发出来的端口为准
如果觉得命令行不方便,可以使用rancher界面修改,找到minio服务发现,编辑既可
创建账密文件
vim velero-v1.6.1-linux-amd64/examples/minio/credentials-velero
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
复制代码
部署veleor
velero install \
--provider aws \
--bucket velero \
--secret-file /root/velero-v1.6.1-linux-amd64/examples/minio/credentials-velero \
--use-volume-snapshots=false \
--plugins velero/velero-plugin-for-aws:v1.2.0 \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000
复制代码
安装过程需要一会,请看图
查看velero所有服务
kubectl get all -n velero
复制代码
备份恢复例子
备份
还是以springboot-hive为例,传送门: juejin.cn/post/697645…
在devops 命名空间中只有一个deploy和一service
如果觉得上述例子麻烦,可以使用官方自带的例子 目录: velero-v1.6.1-linux-amd64/examples/nginx-app/
创建备份
velero backup create backup-devops-ns --include-namespaces devops
复制代码
查看进度
velero backup describe backup-devops-ns
复制代码
查看minio中的备份数据
恢复
删除devops这个namespace
kubectl delete ns/devops
kubectl get all -n devops #没有任何资源
复制代码
执行恢复命令
velero restore create --from-backup backup-devops-ns
复制代码
查看资源已恢复
kubectl get all -n devops
复制代码
velero资源查看命令
velero get backup #备份查看
velero get schedule #查看定时备份
velero get restore #查看已有的恢复
velero get plugins #查看插件
velero uninstall #卸载 包括前面创建的minio
复制代码
定时备份
# 每日1点进行备份
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
# 每日1点进行备份,备份保留72小时
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
# 每5小时进行一次备份
velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
# 每日对 指定 namespace 进行一次备份 (如panshi-qtc-dev)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev
复制代码
恢复到另外的namespace
velero restore create backup-devops-ns --from-backup backup-devops-ns-20210708174958 --namespace-mappings devops:devops-1
复制代码
恢复事项
velero restore
恢复不会覆盖已有的资源
,只恢复当前集群中不存在的资源
。已有的资源不会回滚到之前的版本,如需要回滚,需在restore之前提前删除现有的资源。
带PV的备份
对于kubernetes1.7.2以上的版本,已经支持有PV的备份,从官方2个例子一模一样中可以看出
但是在install velero时需要指定 参数: --use-restic
更多其他参数 详见: velero.io/docs/v1.6/c…
云厂商对象存储
velero支持众多的 后端存储,包括阿里云和腾讯云的,如果想备份至公有云,请参考官网提到的 第三方 插件支持: velero.io/docs/v1.6/s…
近期评论