k8s

velero介绍

简介

官方文档地址:https://velero.io/docs/v1.9/contributions/minio/
Velero(前身为Heptio Ark)为您提供了备份和恢复Kubernetes集群资源和持久卷的工具。你可以通过云提供商或本地运行Velero。

Velero的功能:

  • 对您的集群进行备份,并在丢失时进行恢复。
  • 迁移集群资源到其他集群。
  • 将生产集群复制到开发和测试集群。

Velero包括:

  • 运行在集群上的服务器
  • 本地运行的命令行客户端

工作原理

每个Velero操作(按需备份、计划备份、恢复)都是使用Kubernetes自定义资源定义(CRD)定义的自定义资源,并存储在etcd中。Velero还包括处理自定义资源的控制器,以执行备份、恢复和所有相关操作。可以备份或恢复集群中的所有对象,也可以按类型、名称空间和/或标签筛选对象。
Velero非常适合灾难恢复,也非常适合在集群上执行系统操作(如升级)之前对应用程序状态进行快照。

按需备份

该备份操作:

  • 将复制的Kubernetes对象的压缩文件上传到云对象存储中。
  • 调用云提供程序API以创建持久卷的磁盘快照(如果指定)。
    您可以选择指定在备份期间执行的备份挂钩。例如,您可能需要在拍摄快照之前告诉数据库将其内存中的缓冲区刷新到磁盘。

请注意,集群备份不是严格的原子备份,如果在备份时创建或编辑Kubernetes对象,则它们可能不包含在备份中,虽然捕获不一致信息的几率很低,但是有可能会发生这种现象

定时备份

通过定时操作,您可以定期重复备份数据,第一次创建日程表时将执行第一次备份,随后的备份将按日程表的指定间隔进行,这些间隔由Cron表达式指定。

定时备份保存的名称,其中被格式化为YYYYMMDDhhmmss。

备份工作流程

运行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选项禁用快照。

file

部署

下载velero压缩包

wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.2/velero-v1.9.2-linux-amd64.tar.gz
tar xvf velero-v1.9.2-linux-amd64.tar.gz -C velero

创建velero认证文件

cat credentials-velero
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123

启动minio存储

cd /root/velero/examples/minio
kubectl apply -f 00-minio-deployment.yaml
kubectl get po,svc -n velero

启动velero服务

velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.2.1 \
    --bucket velero \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=false \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000

file

查看部署情况

kubectl get po,svc -n velero

file

创建minio-console svc

cat minio-console-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    component: minio
  name: minio-console
spec:
  ports:
  - port: 44145
    targetPort: 44145
    nodePort: 30154
  selector:
    component: minio
  type: NodePort

kubectl get svc -n velero

file

用户名minio,密码minio123,访问 ip:30154

file

创建nginx服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: my-nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: ClusterIP

kubectl apply -f nginx.yaml
kubectl get po,svc | grep nginx

file

创建velero备份

velero backup create nginx-backup --selector app=nginx

file

查看velero备份

velero backup describe nginx-backup

file

查看minio的bucket存储情况

file

删除nginx

kubectl delete -f nginx.yaml

恢复velero备份

velero restore create --from-backup nginx-backup

file

查看恢复情况

velero restore describe nginx-backup-20221009162617
velero restore get

file

file

查看nginx恢复情况

file

这里只还原了ReplicaSet,没有还原deployment。
file

删除velero备份

velero backup delete nginx-backup

file

创建定时备份

# Create a backup every 6 hours
velero create schedule NAME --schedule="0 */6 * * *"

# Create a backup every 6 hours with the @every notation
velero create schedule NAME --schedule="@every 6h"

# Create a daily backup of the web namespace
velero create schedule NAME --schedule="@every 24h" --include-namespaces web

# Create a weekly backup, each living for 90 days (2160 hours)
velero create schedule NAME --schedule="@every 168h" --ttl 2160h0m0s
kubectl get schedules  --all-namespaces
kubectl get schedules  test -n velero -o yaml

file

过滤备份对象

包括

--include-namespaces:备份该命名空间下的所有资源,不包括集群资源
velero backup create <backup-name> --include-namespaces <namespace>
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>

--include-resources:要备份的资源类型
velero backup create <backup-name> --include-resources deployments
velero restore create <backup-name> --include-resources deployments,configmaps
velero backup create <backup-name> --include-resources deployments --include-namespaces <namespace>

--include-cluster-resources:是否备份集群资源
此选项可以具有三个可能的值:
    true:包括所有群集范围的资源;
    false:不包括群集范围内的资源;
    nil (“自动”或不提供)
备份或还原所有命名空间时,将包括集群范围的资源,默认值:true;
使用命名空间过滤时,不包括集群范围的资源,默认值:false;
velero restore create <backup-name> --include-cluster-resources=false
velero backup create <backup-name> --include-namespaces <namespace> --include-cluster-resources=true 
有些特定的命名空间下的资源(例如PV),在备份pvc时仍会触发备份PV操作,除非使用--include-cluster-resources=false指明不备份集群资源

--selector:通过标签选择匹配的资源备份
velero backup create <backup-name> --selector <key>=<value>

不包括

--exclude-namespaces:备份时该命名空间下的资源不进行备份
velero backup create <backup-name> --exclude-namespaces kube-system
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>

--exclude-resources:备份时该类型的资源不进行备份
velero backup create <backup-name> --exclude-resources secrets,rolebindings

--velero.io/exclude-from-backup=true:当标签选择器匹配到该资源时,若该资源带有此标签,也不进行备份
kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true

指定顺序备份

可通过使用–ordered-resources参数,按特定顺序备份特定种类的资源,需要指定资源名称和该资源的对象名称列表,资源对象名称以逗号分隔,其名称格式为“命名空间/资源名称”,对于集群范围资源,只需使用资源名称。映射中的键值对以分号分隔,资源类型是复数形式。

velero backup create backupName --include-cluster-resources=true --ordered-resources 'pods=ns1/pod1,ns1/pod2;persistentvolumes=pv4,pv8' --include-namespaces=ns1

velero backup create backupName --ordered-resources 'statefulsets=ns1/sts1,ns1/sts0' --include-namespaces=ns1

备份hooks

Velero支持在备份任务执行之前和执行后在容器中执行一些预先设定好的命令。

执行备份时,可以指定一个或多个命令,以在待备份的pod的容器中执行,可以将要执行的命令配置为在任何自定义动作处理之前(pre hook)运行,或者在所有自定义动作完成并且完成了备份动作指定的任何其他项(post hook)之后运行。注意,钩子不在容器的shell内执行。

有两种方法可以指定钩子:pod本身的注释声明和在定义Backup任务时的Spec中声明。

metadata:
  name: nginx-deployment
  namespace: nginx-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pre.hook.backup.velero.io/container: fsfreeze
        pre.hook.backup.velero.io/command: '["/sbin/fsfreeze", "--freeze", "/var/log/nginx"]'
        post.hook.backup.velero.io/container: fsfreeze
        post.hook.backup.velero.io/command: '["/sbin/fsfreeze", "--unfreeze", "/var/log/nginx"]'

引导使用前置和后置挂钩冻结文件系统。冻结文件系统有助于确保所有挂起的磁盘IO操作在拍摄快照之前已经完成。

当然我们可以使用这种方式执行备份mysql或其他的文件,但是只建议使用小文件会备份恢复,针对于pod进行备份恢复。

将备份数据还原到与备份时不同的命名空间中

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

相关crd

kubectl get crd | grep velero

file

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x