k8sseries15:集群备份8月更文挑战

  数据容灾是集群维护中重要的工作之一,避免误删,机器宕机,病毒入侵,不可抗因素导致的服务不可用,或数据缺失等灾难性问题

  为了让服务可靠稳定的运行,数据备份工作就需要在集群搭建之初一起设计,集群运行之后开始实施 

背景

需要备份的数据

  • k8s集群所有数据都存放在 etcd中,因此要备份k8s集群就是备份etcd数据
  • 但是还有一些配置在服务器上,比如kubelet 配置文件,集群的CA各组件证书
  • 另外有状态服务如mysql,mongo等数据

备份方式

  • 备份数量两份以上
  • 存放位置异机备份,跨区或跨省存放
  • 脚本+开源工具
  • 定时任务按规则运行

作用

  • 恢复故障集群
  • 修复不完整数据
  • 保障服务可靠稳定运行

容灾事项

  • 按数据重要性或数据量进行定期恢复演练

  • 定期检查备份数据是否被删除,或锁定

  • 定期检查数据大小变化

工具

etcd工具

  • 使用etcd自带的snapshot 功能备份
  • 使用etcd-backup工具备份

地址: github.com/gravitation…

  • 使用etcd-backup-restore工具备份基于k8s集群的etcd

地址: github.com/gardener/et…

k8s集群工具

  • 使用velero工具备份或迁移或复制k8s集群

地址: github.com/vmware-tanz…

  • 使用kube-dump备份资源清单

地址: github.com/WoozyMasta/…

  • 使用stash工具备份有状态应用(没有测试过)

地址: github.com/stashed/sta…

实践

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

  1. Velero 客户端调用 Kubernetes API 服务器来创建一个Backup对象。

  2. BackupController注意到新的Backup对象,并进行验证。

  3. BackupController开始备份过程。它通过向 API 服务器查询资源来收集要备份的数据。

  4. BackupController使得对象存储服务的调用-例如,AWS S3 -上传备份文件。

默认情况下,velero backup create为任何持久卷制作磁盘快照。您可以通过指定附加标志来调整快照。运行velero backup create --help以查看可用标志。可以使用选项禁用快照--snapshot-volumes=false

19

安装

下载压缩包,然后解到/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

配置来源 github.com/vmware-tanz…

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个例子一模一样中可以看出

velero.io/docs/v1.6/e…

但是在install velero时需要指定 参数:  --use-restic

更多其他参数 详见:   velero.io/docs/v1.6/c…

云厂商对象存储

velero支持众多的 后端存储,包括阿里云和腾讯云的,如果想备份至公有云,请参考官网提到的 第三方 插件支持:  velero.io/docs/v1.6/s…

参考

velero.io/docs/v1.6/b…

github.com/vmware-tanz…

juejin.cn/post/686591…