Kubernetes

k8s备份工具之velero

本文主要是介绍k8s备份工具之velero,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

veleo备份原理

  1. 本地 Velero 客户端发送备份指令。

  2. Kubernetes 集群内就会创建一个 Backup 对象。

  3. BackupController 监测 Backup 对象并开始备份过程。

  4. BackupController 会向 API Server 查询相关数据。

  5. BackupController 将查询到的数据备份到远端的对象存储。

Velero 在 Kubernetes 集群中创建了很多 CRD 以及相关的控制器,进行备份恢复等操作实质上是对相关 CRD 的操作。

Velero 支持的后端存储

Velero 支持两种关于后端存储的 CRD,分别是 BackupStorageLocation 和 VolumeSnapshotLocation

  1. BackupStorageLocation

BackupStorageLocation 主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。主要支持的后端存储是 S3 兼容的存储,比如:Mino 和阿里云 OSS 等。

使用 Minio

复制代码
apiVersion: velero.io/v1    
kind: BackupStorageLocation    
metadata:    
  name: default    
  namespace: velero    
spec:    
# 只有 aws gcp azure    
  provider: aws    
  # 存储主要配置    
  objectStorage:    
  # bucket 的名称    
    bucket: myBucket    
    # bucket内的    
    prefix: backup    
# 不同的 provider 不同的配置    
  config:    
    #bucket地区    
    region: us-west-2    
    # s3认证信息    
    profile: "default"    
    # 使用 Minio 的时候加上,默认为 false    
    # AWS 的 S3 可以支持两种 Url Bucket URL    
    # 1 Path style URL:http://s3endpoint/BUCKET    
    # 2 Virtual-hosted style URL:http://oss-cn-beijing.s3endpoint 将 Bucker Name 放到了 Host Header中    
    # 3 阿里云仅仅支持 Virtual hosted 如果下面写上 true, 阿里云 OSS 会报错 403    
    s3ForcePathStyle: "false"    
    # s3的地址,格式为 http://minio:9000    
    s3Url: http://minio:9000
复制代码

使用阿里云的 OSS

复制代码
apiVersion: velero.io/v1    
kind: BackupStorageLocation    
metadata:    
  labels:    
    component: velero    
  name: default    
  namespace: velero    
spec:    
  config:    
    region: oss-cn-beijing    
    s3Url: http://oss-cn-beijing.aliyuncs.com    
    s3ForcePathStyle: "false"    
  objectStorage:    
    bucket: build-jenkins    
    prefix: ""    
  provider: aws
复制代码
  1. VolumeSnapshotLocation

VolumeSnapshotLocation 主要用来给 PV 做快照,需要云提供商提供插件。阿里云已经提供了插件,这个需要使用 CSI 等存储机制。你也可以使用专门的备份工具 Restic,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。

复制代码
# 安装时需要自定义选项    
--use-restic    
 
    
# 这里我们存储 PV 使用的是 OSS 也就是 BackupStorageLocation,因此不用创建 VolumeSnapshotLocation 对象    
--use-volume-snapshots=false
复制代码

安装veleo

1、下载

复制代码
https://github.com/vmware-tanzu/velero/releases/download/v1.4.0/velero-v1.4.0-linux-amd64.tar.gz
tar zxvf velero-v1.4.0-linux-amd64.tar.gz
cd velero-v1.4.0-linux-amd64
mv velero /usr/local/bin/
复制代码

2、安装miniio

创建minio凭证 

vi examples/minio/credentials-velero

[default]
aws_access_key_id = minio
aws_secret_access_key = minio123

3、创建minio对象存储

kubectl create -f examples/minio/00-minio-deployment.yaml 
namespace/velero created
deployment.apps/minio created
service/minio created
job.batch/minio-setup created

4、开放端口

kubectl expose deployment minio -n velero --type=NodePort --name=minio-nodeport  --target-port=9000 
复制代码
[root@master velero-v1.4.0-linux-amd64]# kubectl get svc -n velero                                                                          
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
minio            ClusterIP   10.254.155.172   <none>        9000/TCP         5m24s
minio-nodeport   NodePort    10.254.203.212   <none>        9000:32027/TCP   2s
[root@master velero-v1.4.0-linux-amd64]# 
复制代码

5、登录minio,地址:宿主机IP:32152,查看buckets(已创建名为velero的bucket)

6. 安装velero (使用本地集群minio作为备份存储)

复制代码
velero install 
   --provider aws 
   --bucket velero 
   --secret-file examples/minio/credentials-velero 
   --use-volume-snapshots=false 
   --plugins velero/velero-plugin-for-aws:v1.0.0 
   --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.178.7.5:32027
复制代码
provider 只有 aws gcp azure
bucket 备份位置,之前minio页面只有velero这一个,所以使用它做备份位置

复制代码
[root@master velero-v1.4.0-linux-amd64]# kubectl get pod   -n velero                           
NAME                      READY   STATUS      RESTARTS   AGE
minio-557f9875fd-8g65x    1/1     Running     0          107m
minio-setup-wbgtn         0/1     Completed   3          107m
velero-6fb968d5cc-v7t6s   1/1     Running     0          34s
[root@master velero-v1.4.0-linux-amd64]# 
复制代码

7、对某个namespace备份

复制代码
[root@master velero-v1.4.0-linux-amd64]# kubectl get po -n test
NAME                     READY   STATUS    RESTARTS   AGE
centos-5f9b47d65-nrjvc   1/1     Running   4          9d
[root@master velero-v1.4.0-linux-amd64]# 
复制代码

8、备份test  namespace

velero backup create test-backup --include-namespaces test  --wait #执行备份
velero backup describe test-backup                          #查看备份

备份完毕后,登录minio页面可以看到数据已经在了

9、备份验证恢复

 kubectl delete ns test
velero restore create --from-backup test-backup  #指定对应的备份名称

再次查看,可以看到已经恢复了

复制代码
[root@master velero-v1.4.0-linux-amd64]# kubectl get po -n test
NAME                     READY   STATUS    RESTARTS   AGE
centos-5f9b47d65-nrjvc   1/1     Running   4          9d
[root@master velero-v1.4.0-linux-amd64]# 
复制代码

此时登录minio页面可以看到执行恢复后,minio中创建了对应恢复目录及文件

 

10、定期备份

复制代码
# 每日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
复制代码

11、资源查看

velero  get  backup   #备份查看
velero  get  schedule #查看定时备份
velero  get  restore  #查看已有的恢复
velero  get  plugins  #查看插件
复制代码
velero restore create --from-backup all-ns-backup  #恢复集群所有备份,(对已经存在的服务不会覆盖)
velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example #仅恢复 default nginx-example namespace

Velero可以将资源还原到与其备份来源不同的命名空间中。为此,请使用--namespace-mappings标志
velero restore create RESTORE_NAME --from-backup BACKUP_NAME --namespace-mappings old-ns-1:new-ns-1,old-ns-2:new-ns-2
例如下面将test-velero 命名空间资源恢复到test-velero-1下面
velero restore create restore-for-test --from-backup everyday-1-20210203131802 --namespace-mappings test-velero:test-velero-1
复制代码

12、备份带pv的pod

velero backup create pvc-backup  --snapshot-volumes --include-namespaces test-velero

恢复

velero  restore create --from-backup pvc-backup --restore-volumes

备份pv数据需要云厂商支持,参考:

https://blog.csdn.net/easylife206/article/details/102927512

https://blog.51cto.com/kaliarch/2531077?source=drh      

可以先创建一个configmap自定义一些内容,可有可无的,不想自定义就不创建,参考:https://velero.io/docs/v1.5/restic/#troubleshooting

安装时velero需加上--use-restic参数表示使用restic备份pv数据

复制代码
velero install 
   --provider aws 
   --bucket velero 
   --secret-file examples/minio/credentials-velero 
   --use-volume-snapshots=true 
   --plugins velero/velero-plugin-for-aws:v1.0.0 
   --use-restic     
   --snapshot-location-config region=minio 
   --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.178.7.5:32027
复制代码

restic相关知识:https://github.com/restic/restic

使用 Restic 给带有 PVC 的 Pod 进行备份,必须先给 Pod 加上注解

格式:

$ kubectl -n YOUR_POD_NAMESPACE annotate pod/YOUR_POD_NAME backup.velero.io/backup-volumes=YOUR_VOLUME_NAME_1,YOUR_VOLUME_NAME_2,...
YOUR_VOLUME_NAME_1指的是pod spec.template.spec.volumes.name的值
比如我的volumes是www,则 annotate 就要是backup-volumes=www

例如:

复制代码
kubectl -n test-velero annotate  pod nfs-pvc-7d75fbbcdf-dn7xw  backup.velero.io/backup-volumes=www

#查看结果
kubectl  get po -n test-velero nfs-pvc-7d75fbbcdf-dn7xw -o jsonpath='{.metadata.annotations}'
复制代码

再次备份

velero backup create pvc-backup-2  --snapshot-volumes --include-namespaces test-velero

 恢复

velero  restore create --from-backup pvc-backup-2 --restore-volumes

可以看已经能把pv的数据恢复了

备份原理:https://velero.io/docs/v1.5/restic/#troubleshooting 

minio 高可用

复制代码
apiVersion: v1
kind: Service
metadata:
  name: minio
  labels:
    app: minio
spec:
  clusterIP: None
  ports:
    - port: 9000
      name: minio
  selector:
    app: minio
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
spec:
  selector:
    matchLabels:
      app: minio
  serviceName: minio
  replicas: 4
  template:
    metadata:
      labels:
        app: minio
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: minio
        env:
        - name: MINIO_ACCESS_KEY
          value: "RGifLiRPS6KFmuEq"
        - name: MINIO_SECRET_KEY
          value: "quTAJguUiio4fJV8"
        image: minio/minio:RELEASE.2020-06-01T17-28-03Z
        args:
        - server
        - http://minio-{0...3}.minio.default.svc.cluster.local/data
        ports:
        - containerPort: 9000
        # These volume mounts are persistent. Each pod in the PetSet
        # gets a volume mounted based on this field.
        volumeMounts:
        - name: data
          mountPath: /data
  # These are converted to volume claims by the controller
  # and mounted at the paths mentioned above.
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      # Uncomment and add storageClass specific to your requirements below. Read more https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
      storageClassName: nfs-client
复制代码

helm安装

客户端安装

wget https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz
tar -xf helm-v3.2.0-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/

添加源

helm repo add aliyuncs https://apphub.aliyuncs.com
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo update

安装velero

添加源

复制代码
[root@master velero]# helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
"vmware-tanzu" has been added to your repositories

[root@master velero]# helm search repo vmware-tanzu
NAME                    CHART VERSION   APP VERSION     DESCRIPTION            
vmware-tanzu/velero     2.12.0          1.4.0           A Helm chart for velero
[root@master velero]# 
复制代码

下载安装

helm pull vmware-tanzu/velero

https://blog.csdn.net/weixin_41476014/article/details/106800677?%3E
https://zhuanlan.zhihu.com/p/92853124
https://blog.csdn.net/easylife206/article/details/102927512
https://docs.signalfx.com/en/latest/integrations/agent/monitors/prometheus-velero.html
这篇关于k8s备份工具之velero的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!