Velero备份Kubernetes

警告
本文最后更新于 2023-07-25,文中内容可能已过时。

Velero(前身为Heptio Ark)为您提供了备份和恢复Kubernetes集群资源和持久卷的工具。您可以通过云提供商或内部部署运行Velero。Velero让你:

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

Velero包括:

  • 在您的集群上运行的服务器
  • 本地运行的命令行客户端
1
2
3
4
wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.0/velero-v1.10.0-linux-amd64.tar.gz
tar -xzf velero-v1.10.0-linux-amd64.tar.gz
cd velero-v1.10.0-linux-amd64
mv velero /usr/local/bin

在您的本地目录中创建特定于 Velero 的凭证文件

1
2
3
4
5
6
7
8
mkdir /data/velero
cd /data/velero

cat > credentials-velero <<EOF
[default]
aws_access_key_id = admin
aws_secret_access_key = minio123
EOF
1
2
3
4
5
6
7
8
velero --kubeconfig /root/.kube/config \
install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.4.1 \
--bucket velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.0.201:9000

执行以下命令可以删除 velero

1
2
3
velero --kubeconfig /root/.kube/config uninstall
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

为与app=boot标签选择器匹配的任何对象创建备份

1
2
velero backup create boot-backup --selector app=boot
velero backup create boot-backup --selector app=boot --namespace velero-system

如果velero服务不在默认命名空间,在执行velero命令时需要添加--namespace <velero-namespaces>

使用app=boot标签选择器基于 cron 表达式创建定期计划的备份

1
velero schedule create test-daily --schedule="0 1 * * *" --selector app=boot

列出所有备份

1
2
velero backup get
velero backup get --namespace velero-system

查看备份描述

1
velero backup describe wms-backup-20221214031344

查看备份日志

1
velero backup logs wms-backup-20221214031344

基于linux的定时备份

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat > velero-k8s-backup.sh <<'EOF'
#!/bin/bash
NS_NAME=$(kubectl get ns |awk '{if(NR>1){print $1}}')
DATE=$(date +%Y%m%d%H%M%S)
cd /data/velero/

for i in $NS_NAME;do
  /usr/local/bin/velero backup create ${i}-ns-backup-${DATE} \
  --include-cluster-resources=true \
  --include-namespaces ${i} \
  --kubeconfig=/root/.kube/config
done
EOF

删除备份

1
velero backup delete BACKUP_NAME

从 Velero 备份中还原

1
2
3
velero restore create RESTORE_NAME --from-backup BACKUP_NAME
# 可忽略RESTORE_NAME参数
velero restore create --from-backup wms-backup-20221214031344

恢复到指定命名空间

1
velero restore create RESTORE_NAME --from-backup BACKUP_NAME --namespace-mappings test:test1

列出所有恢复

1
velero restore get

查看恢复描述

1
velero restore describe wms-backup-20221214031344-20221214031655

查看备份日志

1
velero restore logs wms-backup-20221214031344-20221214031655

按 namespace、类型或标签筛选对象。

当不使用任何筛选选项时,Velero 会将所有对象包括在备份或还原中。

仅包括特定资源,不包括所有其他资源。

如果同时包含通配符和特定资源,则通配符优先。

  • 备份 namespace 及其对象。

    1
    
    velero backup create <backup-name> --include-namespaces <namespace>
    
  • 恢复两个 namespace 及其对象。

    1
    
    velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
    
  • 备份集群中的所有 deployments:

    1
    
    velero backup create <backup-name> --include-resources deployments
    
  • 恢复集群中的所有 deployments 和 configmaps。

    1
    
    velero restore create <backup-name> --include-resources deployments,configmaps
    
  • 在 namespace 中备份 deployments。

    1
    
    velero backup create <backup-name> --include-resources deployments --include-namespaces <namespace>
    

此选项可以具有三个可能的值:

  • true: 包括所有群集范围的资源。

  • false: 不包括群集范围的资源。

  • nil(“auto” 或不提供):

    • 备份或还原所有 namespace 时,将包括群集范围的资源。 默认值:true
    • 使用 namespace 过滤时,不包括群集范围的资源。 默认值:false
      • 除非--include-cluster-resources = false,否则如果由自定义操作(例如,PVC-> PV)触发某些相关的群集作用域资源,则可能仍会进行备份 / 还原。
  • 备份整个群集,包括群集范围内的资源。

    1
    
    velero backup create <backup-name>
    
  • 仅还原群集中的命名空间资源。

    1
    
    velero restore create <backup-name> --include-cluster-resources=false
    
  • 备份 namespace 并包括群集范围的资源。

    1
    
    velero backup create <backup-name> --include-namespaces <namespace> --include-cluster-resources=true
    

包括与 label selector 匹配的资源。

1
velero backup create <backup-name> --selector <key>=<value>

从备份中排除特定资源。

通配符排除将被忽略。

  • Exclude kube-system from the cluster backup.

    1
    
    velero backup create <backup-name> --exclude-namespaces kube-system
    
  • 还原期间排除两个 namespace。

    1
    
    velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
    
  • 从备份中排除 secrets:

    1
    
    velero backup create <backup-name> --exclude-resources secrets
    
  • 排除 secrets 和 rolebindings:

    1
    
    velero backup create <backup-name> --exclude-resources secrets,rolebindings
    

标签为 velero.io/exclude-from-backup=true 的资源不包括在备份中,即使它包含匹配的选择器标签也是如此。

参考链接:

https://velero.io/docs/v1.10/

https://ewhisper.cn/posts/25524/