写在前面:如有问题,以你为准,
目前24年应届生,各位大佬轻喷,部分资料与图片来自网络
内容较长,页面右上角目录方便跳转
基础
Velero (以前称为Heptio Ark) 为您提供了备份和恢复Kubernetes集群资源和特久卷的工具。您可以
存储支持
- AWS S3
- Azure Blob
- Google Cloud Storage
- Alibaba Cloud OSS
- MinIO
官方文档
架构
- Velero 客户端调用 Kubernetes API 服务器来创建对象 Backup。
- 注意到 BackupController 新 Backup 对象并执行验证。
- BackupController 备份过程开始。它通过向 API 服务器查询资源来收集要备份的数据。
- 调用 BackupController 对象存储服务(例如 AWS S3)来上传备份文件
实际出现过的场景
集群所在机子坏了,然后通过velero进行了备份,将机子重装并用velero恢复备份
Velero 备份与 etcd 备份的区别
与Etcd备份相比,直接备份Etcd是将集群的全部资源备份起来。
Velero可以对Kubernetes集群内对象级别进行备份。
除了对Kubernetes集群进行整体备份外,Velero还可以通过对Type、Namespace、Label等对象进行分类备份或者恢复
备份有状态数据
文件复制会进行加密、压缩、增量备份,压缩比在60%左右,备份文件都是加密后的二进制文件,打开乱码
Restic(默认) References — restic 0.16.2 documentation
Kopia Architecture | Kopia
备份最佳实践
同步机制
由于velero备份会将本次备份任务的元信息上传到s3中,当在集群中删除了备份任务,但是s3中数据为删除,velero会定时将s3的备份任务同步到集群内
坑
安装
注:这里为了测试放在了集群的机子里面通过docker跑的,但是实际环境不要放在集群的机子,一旦集群的机子崩了,可能导致数据丢失,而且是docker 一定要将卷挂载到宿主机,保证数据不丢失
docker pull minio/minio
docker run -d -p 9000:9000 -p 9001:9001 --name minio1 -v /home/minio/data:/data -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" minio/minio server /data --console-address ":9001"
问题:可能docker0 网络有问题,可以跑nginx 测试一下
## 下载
wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.1/velero-v1.11.1-linux-amd64.tar.gz
## 解压
tar -zxvf velero-v1.11.1-linux-amd64.tar.gz -C /usr/local/bin && mv /usr/local/bin/velero-v1.11.1-linux-amd64/velero /usr/local/bin
其中有一个example目录,里面有一个测试nginx和minio,如果按照上面直接跑docker,就不用这个minio部署方式
该 minio 部署需要修改,控制台访问端口31900
创建一个 velerodata 桶
cat >velero-auth.txt << EOF
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin
EOF
根据情况修改参数
--bucket velerodata
s3Url=http://192.168.100.53:9000
--secret-file ./velero-auth.txt
velero --kubeconfig /root/.kube/config install \
--use-node-agent --provider aws --plugins velero/velero-plugin-for-aws:v1.7.0 \
--bucket velerodata --secret-file ./velero-auth.txt \
--use-volume-snapshots=false --namespace velero default-volumes-to-restic \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.100.53:9000
[root@master velero]# kubectl get crd | grep velero
# 查看velero 在kubernetes 创建的资源对象
backuprepositories.velero.io 2024-01-04T08:11:11Z
backups.velero.io 2024-01-04T08:11:11Z
backupstoragelocations.velero.io 2024-01-04T08:11:11Z
datadownloads.velero.io 2024-01-04T08:11:11Z
datauploads.velero.io 2024-01-04T08:11:12Z
deletebackuprequests.velero.io 2024-01-04T08:11:11Z
downloadrequests.velero.io 2024-01-04T08:11:11Z
podvolumebackups.velero.io 2024-01-04T08:11:11Z
podvolumerestores.velero.io 2024-01-04T08:11:11Z
restores.velero.io 2024-01-04T08:11:11Z
schedules.velero.io 2024-01-04T08:11:11Z
serverstatusrequests.velero.io 2024-01-04T08:11:11Z
volumesnapshotlocations.velero.io 2024-01-04T08:11:11Z
[root@master velero]# kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
node-agent-l4vmr 1/1 Running 0 3m33s
node-agent-zm98b 1/1 Running 0 3m33s
velero-b95f88d6b-cgnq5 1/1 Running 0 3m33s
[root@master velero]# kubectl get backupstoragelocations -A
NAMESPACE NAME PHASE LAST VALIDATED AGE DEFAULT
velero default Available 10s 8m30s true
命令
命令示例
# 查看帮助
velero -h
velero get -h
# 创建
velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup
velero restore create --from-backup test1
# 备份所有资源
velero backup create backup1
# 查看基本信息
velero get backups
velero get restore
kubectl get backup -A
kubectl get restore -A
velero backup-location get
kubectl get backupstoragelocations -A
# 查看详细信息
velero describe backup test1 --details
velero describe restore test1 --details
--details 查看详细信息
可以资源名字,直接查看全部
# 删除
kubectl delete backup -n velero test1 # 假删除,只是删除了资源对象,s3资源没被删
# 下面是真删除
velero delete backup test1
参数
备份与恢复
部署相关组件
kind: Namespace
metadata:
name: study
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: study
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: study
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: study
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
创建备份
velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup
# test3 任务名字
# --include-namespaces=study 指定命名空间
# --default-volumes-to-fs-backup 备份pv
查看备份
[root@master k8s]# velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup
Backup request "test1" submitted successfully.
Run `velero backup describe test1` or `velero backup logs test1` for more details.
查看 相关命令
kubectl get backup -A
velero backup describe test1
velero backup describe test1 --details # 更详细的信息(资源清单)
velero backup logs test1
定时备份
Explain[root@master1 yaml]# velero schedule create schedule-backup --schedule="* * * * *" --include-namespaces=study --default-volumes-to-fs-backup
Schedule "schedule-backup" created successfully.
注:(分时日月周) 不支持秒的
[root@master1 yaml]# kubectl get schedule -A
NAMESPACE NAME STATUS SCHEDULE LASTBACKUP AGE PAUSED
velero schedule-backup Enabled * * * * * 15s
# 每分钟创建一次,命名为:schedule-backup-20230901132958
恢复备份
[root@master k8s]# kubectl delete -f ingress-test.yaml
namespace "study" deleted
deployment.apps "nginx-deployment" deleted
service "nginx-service" deleted
ingress.networking.k8s.io "nginx-ingress" deleted
创建恢复任务
velero restore create --from-backup test1
查看恢复任务
[root@master k8s]# kubectl get restores -A
NAMESPACE NAME AGE
velero test1-20240104040113 50s
kubectl describe restores -A
velero restore logs test1-20240104040113
velero restore describe test1-20240104040113 (最好)
重点信息如下:
Phase: Completed
Total items to be restored: 11
Items restored: 11
Started: 2024-01-04 04:01:13 -0500 EST
Completed: 2024-01-04 04:01:14 -0500 EST
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
nginx-deployment-765d7cffb-mtvpn 1/1 Running 0 2m47s
nginx-deployment-765d7cffb-s4bz5 1/1 Running 0 2m47s
[root@master k8s]# kubectl get pod,svc,ingress -n study
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-765d7cffb-mtvpn 1/1 Running 0 2m56s
pod/nginx-deployment-765d7cffb-s4bz5 1/1 Running 0 2m56s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service ClusterIP 10.105.34.88 <none> 80/TCP 2m56s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/nginx-ingress nginx * 10.111.123.202 80 2m56s
# curl 192.168.100.51
恢复问题(重点)
实现类似快照
没办法实现,比如deploy从2扩到3,恢复成2是没办法实现的
could not restore, Deployment "nginx-deployment" already exists. Warning: the in-cluster version is different than the backed-up version
会出现上面类似的问题,恢复是将删除的资源进行恢复而不是将资源恢复到某一个快照
容器init
[root@master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-dep-5984d97dc4-8fp7p 0/1 Init:0/1 0 10s
nginx-deployment-6787dfdbf6-gf88w 0/1 Init:0/1 0 10s
velero 从s3 桶里面拉取数据到本地,并进行文件解压缩和解密
这个初始化时间取决于数据量的大小,30多个g恢复要7-8分钟
跨集群问题
删除备份
root@master k8s]# kubectl get backup -A
NAMESPACE NAME AGE
velero test1 10m
[root@master k8s]# kubectl delete backup -n velero test1
backup.velero.io "test1" deleted
# 这是伪删除,实际数据还在s3上,这个只是删除了资源对象
# 过一分钟又会恢复,因为velero 会定期检测s3中的数据
# 自动加载的资源对象里面,只要s3中的数据不要丢(可能是1分钟)
集群迁移
将另一个集群的业务进行备份,然后将s3中的备份文件放入到新集群的s3中
velero 会定期检测s3中的数据,自动加载的资源对象里面,只要s3中的数据不要丢(可能是1分钟)
也可以在另一个集群安装velero时直接指定备份集群的minio,来实现集群资源迁移
文档资料
一只云原生萌新 - 如何使用Velero备份与恢复K8s集群及应用