集群环境
使用 kubeadmin 安装,Etcd 为单节点
IP | Hostname | 用途 |
---|---|---|
10.20.1.139 | k8s-master01 | Master节点 |
10.20.1.140 | k8s-node01 | Node节点 |
10.20.1.141 | k8s-node02 | Node节点 |
10.20.1.142 | k8s-node03 | Node节点 |
一、ETCD简介
ETCD用于共享和配置服务发现的分布式,一致性的KV存储系统。 ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。
ETCD 存储 k8s 所有数据信息
ETCD 是 k8s 集群极为重要的一块服务,存储了集群所有的数据信息。同理,如果发生灾难或者 etcd 的数据丢失,都会影响集群数据的恢复。因此需要对 ETCD 数据进行备份,当集群发生崩溃或数据丢失时,可使用备份的数据对集群进行恢复操作。
二、使用 etcdctl 实现数据的备份和恢复
1. kubeadmin 安装方式
当前集群使用 kubeadmin 安装,Etcd 为单节点服务。
1.1 拷贝 etcdctl 至 master 节点
etcdctl 工具服务器默认是没有安装的,需要从容器中拷贝到宿主机上。
# 从容器中拷贝 etcdctl 工具到宿主机
$ docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk '{print $1}'):/usr/local/bin/etcdctl /usr/bin/
Successfully copied 17.9MB to /usr/bin/
# 验证,查看 etcdctl 版本
$ etcdctl version
etcdctl version: 3.5.16
API version: 3.5
1.2 基于 ETCD v3 接口实现数据备份
# 备份 etcd 数据至 root 目录下
$ ETCDCTL_API=3 etcdctl --endpoints="https://10.20.1.139:2379" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" --cacert="/etc/kubernetes/pki/etcd/ca.crt" snapshot save /root/snap-$(date +%Y%m%d%H%M).db
# 查看备份的文件
$ ll /root/snap-202509141757.db
-rw------- 1 root root 9199648 Sep 14 17:57 /root/snap-202509141757.db
1.3 恢复 etcd 数据
未防止在数据恢复的过程中存在干扰导致数据恢复失败,在执行恢复操作前,需要先停止 etcd 和 apiServer
# 查看 manifest 目录内容
$ ll /etc/kubernetes/manifests
total 16
-rw------- 1 root root 2427 Jul 27 16:32 etcd.yaml
-rw------- 1 root root 4006 Aug 11 10:13 kube-apiserver.yaml
-rw------- 1 root root 2799 Jul 27 16:32 kube-controller-manager.yaml
-rw------- 1 root root 1499 Jul 27 16:32 kube-scheduler.yaml
# 移动 manifest 目录,etcd 和 apiServer 会自动停止运行
$ mv /etc/kubernetes/manifests /etc/kubernetes/manifests-bak
在恢复前为了能看到 etcd 的恢复效果,这里先把 etcd 数据库内容移除
$ mv /data/etcd/ /data/etcd-back && mkdir /data/etcd && chmod 700 /data/etcd
# 默认etcd 目录在 /var/lib/etcd , /data/etcd 目录是在集群初始化时(kubeadm init --config /opt/software/kubeadm-config.yaml --upload-certs)修改的路径
恢复 etcd 数据
# 执行命令,讲备份的etcd 数据还原到集群中
$ ETCDCTL_API=3 etcdctl --endpoints="https://10.20.1.139:2379" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" --cacert="/etc/kubernetes/pki/etcd/ca.crt" snapshot restore /root/snap-202509141757.db
# 启动 etcd 和 api-server
$ mv /etc/kubernetes/manifests-bak /etc/kubernetes/manifests
再次查看集群
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx ingress-nginx-controller-79sh6 1/1 Running 0 49d
ingress-nginx ingress-nginx-controller-cv9bj 1/1 Running 0 49d
ingress-nginx ingress-nginx-controller-sg989 1/1 Running 0 49d
kube-system calico-kube-controllers-76dfd7b977-g9sxh 1/1 Running 7 (4m23s ago) 2d6h
kube-system calico-node-45x9j 1/1 Running 0 49d
kube-system calico-node-8rmt5 1/1 Running 0 49d
kube-system calico-node-fzs4f 1/1 Running 0 49d
kube-system calico-node-zhnlk 1/1 Running 0 49d
kube-system calico-typha-5b56944f9b-6gd7p 1/1 Running 0 49d
kube-system coredns-5c988c55b8-ckqnf 1/1 Running 0 2d6h
kube-system coredns-5c988c55b8-ljzxf 1/1 Running 0 2d6h
kube-system etcd-k8s-master01 1/1 Running 0 49d
kube-system kube-apiserver-k8s-master01 1/1 Running 0 34d
kube-system kube-controller-manager-k8s-master01 1/1 Running 0 49d
kube-system kube-proxy-9qk4c 1/1 Running 0 49d
kube-system kube-proxy-bm6rt 1/1 Running 0 49d
kube-system kube-proxy-dwz4c 1/1 Running 0 49d
kube-system kube-proxy-vsl77 1/1 Running 0 49d
kube-system kube-scheduler-k8s-master01 1/1 Running 0 49d
kube-system metrics-server-784f4d97b8-88pfh 1/1 Running 0 2d6h
nfs-storage nfs-client-provisioner-58998fc8b5-dh7w2 0/1 CrashLoopBackOff 54 (5m11s ago) 49d
test-quota test-deploy-5587d8c7c4-7b6fj 1/1 Running 0 2d7h
数据都已恢复回来。
2. 二进制集群安装方式
2.1 备份 etcd
yum install -y etcd
ETCDCTL_API=3 etcdctl snapshot save snap.20240422.db --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints="https://192.168.66.11:2379"
2.2 etcd 数据库还原
systemctl stop kube-apiserver
systemctl stop etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
查看数据库路径
systemctl cat etcd.service
ETCDCTL_API=3 etcdctl snapshot restore /data/backup/etcd-snapshot-previous.db --data-dir=/var/lib/etcd/default.etcd
chown -R etcd:etcd /var/lib/etcd
systemctl start kube-apiserver
systemctl start etcd.service
三、使用 velero 实现数据的备份和恢复
1. Velero简介
Velero 是 vmware 开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移 Kubernetes 集群资源数据;官网 https://velero.io/ 。Velero 是西班牙语意思是帆船,非常符合 Kubernetes 社区的命名风格,Velero 的开发公司 Heptio,已被 VMware 收购。Velero 支持标准的 K8S 集群,既可以是私有云平台也可以是公有云,除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。Velero 的工作方式就是把kubernetes 中的数据备份到对象存储以实现高可用和持久化,默认的备份保存时间为720小时,并在需要的时候进行下载和恢复。
2. Velero 与 etcd 快照备份的区别
etcd 快照是全局完成备份(类似于 MySQL 全部备份),即使需要恢复一个资源对象(类似于只恢复 MySQL 的一个库),但是也需要做全局恢复到备份的状态(类似于 MySQL 的全库恢复),即会影响其它 namespace 中 pod 运行服务(类似于会影响 MySQL 其它数据库的数据)。
Velero 可以有针对性的备份,比如按照 namespace 单独备份、只备份单独的资源对象等,在恢复的时候可以根据备份只恢复单独的 namespace 或资源对象,而不影响其它 namespace 中 pod 运行服务。
velero 支持 ceph、oss 等对象存储,etcd 快照是一个为本地文件。
velero 支持任务计划实现周期备份,但 etcd 快照也可以基于 cronjob 实现。
velero 支持对AWS EBS 创建快照及还原
https://www.qloudx.com/velero-for-kubernetes-backup-restore-stateful-workloads-with-aws-ebs-snapshots/
https://github.com/vmware-tanzu/velero-plugin-for-aws
3. velero 整体架构
4. velero 备份流程
Velero 客户端调用 Kubernetes API Server 创建 Backup 任务。Backup 控制器基于watch 机制通过 API Server 获取到备份任务。Backup 控制器开始执行备份动作,其会通过请求 API Server 获取需要备份的数据。Backup 控制器将获取到的数据备份到指定的对象存储 server 端。
5. 案例实操
5.1 安装 minio 服务
# 安装 minio
$ docker run --name minio \
-p 9000:9000 \
-p 9999:9999 \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=12345678" \
-v /data/minio/data:/data \
minio/minio:RELEASE.2022-04-12T06-55-35Z server /data \
--console-address '0.0.0.0:9999'
5.2 登录 minio
5.3 创建 bucket 存储桶
5.4 在 master 节点部署 velero
下载地址:https://github.com/vmware-tanzu/velero/
Velero 与 K8S 版本匹配关系:https://github.com/vmware-tanzu/velero/
Velero version | Expected Kubernetes version compatibility | Tested on Kubernetes version |
---|---|---|
1.17 | 1.18-latest | 1.31.7, 1.32.3, 1.33.1, and 1.34.0 |
1.16 | 1.18-latest | 1.31.4, 1.32.3, and 1.33.0 |
1.15 | 1.18-latest | 1.28.8, 1.29.8, 1.30.4 and 1.31.1 |
1.14 | 1.18-latest | 1.27.9, 1.28.9, and 1.29.4 |
1.13 | 1.18-latest | 1.26.5, 1.27.3, 1.27.8, and 1.28.3 |
1.12 | 1.18-latest | 1.25.7, 1.26.5, 1.26.7, and 1.27.3 |
1.11 | 1.18-latest | 1.23.10, 1.24.9, 1.25.5, and 1.26.1 |
# 下载 velero
$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.1/velero-v1.14.1-linux-amd64.tar.gz
# 解压
$ tar -zxvf velero-v1.14.1-linux-amd64.tar.gz
# 查看二进制文件
$ cd velero-v1.14.1-linux-amd64
$ ll
total 99048
-rw-r--r-- 1 root root 10255 Aug 22 2024 LICENSE
drwxr-xr-x 4 root root 36 Sep 16 00:00 examples
-rwxr-xr-x 1 root root 101412456 Aug 26 2024 velero
# 将 velero 二进制文件移动到 /usr/local/bin/ 目录
$ mv velero /usr/local/bin/
# 文件提权
$ chmod +x /usr/local/bin/velero
# 查看 velero 是否安装成功
$ velero version
Client:
Version: v1.14.1
Git commit: 8afe3cea8b7058f7baaf447b9fb407312c40d2da
<error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1">
5.5 安装 velero, 使用 minio 作为备份存储
# 创建目录
$ mkdir -p /data/velero/
# 编辑 minio 认证凭据文件
$ cat /data/velero/velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
# 在集群中安装 Velero,并将其配置为使用一个自建的 MinIO S3 兼容存储服务作为备份仓库,并且使用文件系统备份(FSB)方式来备份持久卷数据
$ velero --kubeconfig /root/.kube/config install --use-node-agent --default-volumes-to-fs-backup --provider aws --plugins velero/velero-plugin-for-aws:v1.13.0 --bucket etcd-bak --secret-file /data/velero/velero-auth.txt --use-volume-snapshots=false --namespace velero-system --backup-location-config region=minio,s3ForcePathStyle='true',s3Url=http://10.20.1.139:9000
# 不支持 hostPath 卷
# 执行上面的命令,会自动拉取镜像
# - docker pull velero/velero:v1.14.1
# - docker pull velero/velero-plugin-for-aws:v1.13.0
# 查看 velero 部署 Pod
$ kubectl get pods -n velero-system
NAME READY STATUS RESTARTS AGE
node-agent-87z2k 1/1 Running 1 (89s ago) 11m
node-agent-gqp8t 1/1 Running 4 (2m1s ago) 11m
node-agent-rz9rh 1/1 Running 2 (2m15s ago) 11m
velero-58448bc654-nhcm5 1/1 Running 0 11m
# 查看velero日志
$ kubectl logs -f deployment/velero -n velero-system
命令解析:
velero ... install
这是 Velero 客户端的主要命令,用于在集群中部署 Velero 的运维控制面(Deployment、CRD 等)。
--kubeconfig /root/.kube/config
作用:指定 Kubernetes 集群的认证配置文件路径。
解释:告诉 velero 命令行工具如何连接到目标 Kubernetes 集群。这里它使用 root 用户下的配置。
--use-node-agent
作用:启用 Node Agent 模式(也称为“上传者”模型)。
解释:这是 Velero 新版本中推荐的方式,用于替代旧的 restic 集成。每个节点会运行一个 DaemonSet(node-agent),由它来负责本节点上所有 Pod 卷的文件系统备份/恢复操作,效率更高。
--default-volumes-to-fs-backup
作用:将为所有 Pod 中的所有持久卷启用文件系统备份,无需在备份时额外指定注解。
解释:这是一个便利选项。如果不加这个参数,你需要给每个包含需要备份的 PVC 的 Pod 打上 backup.velero.io/backup-volumes=
的注解。加上这个参数后,Velero 默认会尝试备份所有挂载的卷(注:有些卷如 emptyDir 或敏感目录可能仍需排除)。 --use-volume-snapshots=false
作用:明确禁用卷快照功能。
解释:因为此命令配置的是使用文件系统备份(–use-node-agent 和 –default-volumes-to-fs-backup),而不是基于云厂商特定存储的原生快照功能,所以需要显式关闭快照功能。这与 –provider aws 并不冲突,因为我们将 AWS S3 插件用于兼容 S3 的对象存储,而不是用于快照。
--provider aws
作用:指定云提供商为 AWS。
解释:Velero 需要知道它与哪种云存储交互。虽然这里使用的是 MinIO,但 MinIO 提供了与 AWS S3 兼容的 API,因此可以使用 AWS 提供商插件来连接它。
--plugins velero/velero-plugin-for-aws:v1.13.0
作用:指定要安装的 Velero 插件镜像。
解释:为了让 –provider aws 正常工作,需要安装 AWS 插件。这个插件使 Velero 能够与 S3 API(包括 MinIO 提供的 S3 兼容 API)进行通信。
--bucket velero
作用:指定对象存储中的存储桶(Bucket)名称。
解释:Velero 将把所有备份数据存储在 MinIO 中名为 velero 的存储桶中。这个存储桶需要提前在 MinIO 中创建好。
--secret-file /data/velero/velero-auth.txt
作用:提供访问对象存储所需的认证凭据文件。
解释:该文件通常包含两行:aws_access_key_id 和 aws_secret_access_key。这些是访问 MinIO 服务的用户名和密码(MinIO 使用与 AWS 兼容的认证格式)。
--backup-location-config region=minio,s3ForcePathStyle='true',s3Url=http://10.20.1.139:9000
作用:配置备份存储位置的具体参数。
解释:这是连接 MinIO 的关键配置:
region=minio: MinIO 默认区域,可以任意设置,但必须提供,通常设为 minio 或 us-east-1。
s3ForcePathStyle=’true’: 极其重要。强制使用路径风格的 S3 URL(例如 http://endpoint/bucket/key),而不是虚拟主机风格(http://bucket.endpoint/key)。MinIO 通常需要启用这个选项。
s3Url=http://10.20.1.139:9000: 指定 MinIO 服务的访问地址和端口。Velero 将通过这个 URL 上传和下载备份数据。
--namespace velero-system
作用:指定 Velero 组件将被安装到哪个 Kubernetes 命名空间中。
解释:Velero 的所有 Pod(velero 和 node-agent)、Secret、ServiceAccount 等资源都会创建在这个名为 velero-system 的命名空间里。这是一个惯例,与其他系统组件隔离。
查看 Velero 备份存储是否健康可用
$ kubectl get BackupStorageLocation -n velero-system -o yaml
apiVersion: v1
items:
- apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
creationTimestamp: "2025-09-16T01:48:14Z"
generation: 3
labels:
component: velero
name: default
namespace: velero-system
resourceVersion: "9463671"
uid: 1ca0f267-af96-4e08-96f9-b578dd335df3
spec:
config:
region: minio
s3ForcePathStyle: "true"
s3Url: http://10.20.1.139:9000 # minio 地址
default: true
objectStorage:
bucket: etcd-bak # 备份存储的桶
provider: aws
status:
lastSyncedTime: "2025-09-16T01:49:24Z"
lastValidationTime: "2025-09-16T01:49:24Z"
phase: Available # 可用
kind: List
metadata:
resourceVersion: ""
5.6 演示 Velero 的备份和还原
资源清单:velero-demo-deploy.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: velero-demo-pvc
namespace: default
spec:
storageClassName: nfs-client # 指定存储类
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: velero-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: velero-demo
template:
metadata:
labels:
app: velero-demo
spec:
containers:
- name: velero-demo
image: nginx:1.29.0
ports:
- containerPort: 80
volumeMounts: # 挂载卷
- name: velero-storage
mountPath: /usr/share/nginx/html # 挂载路径
volumes:
- name: velero-storage
persistentVolumeClaim: # 挂载PVC
claimName: velero-demo-pvc
执行资源清单
# 查看PVC,已绑定
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
velero-demo-pvc Bound pvc-0976d62a-08fe-43fe-8882-3a64379bd4c9 1Gi RWO nfs-client <unset> 12m
# 查看POD运行成功
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
velero-demo-cbbcc8454-k78rj 1/1 Running 0 12m 171.20.85.204 k8s-node01 <none> <none>
# 在 nfs 挂载目录写入内容
$ echo "Hello Velero" >> index.html
# 测试 Nginx 访问
$ curl http://171.20.85.204
Hello Velero
执行 Velero 备份命令
# 备份 default 命名空间的数据
$ velero backup create default-backup-`date +%Y%m%d%H%M%S` --include-namespaces default --kubeconfig=/root/.kube/config --namespace velero-system
Backup request "default-backup-20250916210829" submitted successfully.
Run `velero backup describe default-backup-20250916210829` or `velero backup logs default-backup-20250916210829` for more details.
# 执行操作成功
# --ttl 24h0m0s 如果未指定,将应用 30 天的默认 TTL 值
删除 default 命名空间的数据
# 删除挂载目录的index.html文件
$ rm -rf index.html
# 删除pvc 和 pod
$ kubectl delete -f velero-demo-deploy.yaml
persistentvolumeclaim "velero-demo-pvc" deleted
deployment.apps "velero-demo" deleted
使用 Velero 恢复数据
# 使用 velero 恢复数据
$ velero restore create --from-backup default-backup-20250916210829 --wait --kubeconfig=/root/.kube/config --namespace velero-system
Restore request "default-backup-20250916210829-20250916211224" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.
............................................................................................................................................................................................................................................................
Restore completed with status: Completed. You may check for more information using the commands `velero restore describe default-backup-20250916210829-20250916211224` and `velero restore logs default-backup-20250916210829-20250916211224`.
# 会自动拉取镜像:velero/velero-restore-helper:v1.14.1
# 查看Pod
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
velero-demo-cbbcc8454-k78rj 1/1 Running 0 4m31s 171.20.85.203 k8s-node01 <none> <none>
# 访问Pod,nginx已恢复
$ curl http://171.20.85.203
Hello Velero
默认情况下,Velero 执行非破坏性恢复,这意味着它不会删除目标集群上的任何数据。如果备份中的资源已存在于目标集群中,Velero 将跳过该资源
$ velero restore create --from-backup default-backup-20250916210829 --wait --kubeconfig=/root/.kube/config --namespace velero-system
6. velero 常用命令
6.1 为与标签选择器匹配的任何对象创建备份 :app=velero-demo
$ velero backup create nginx-backup --selector app=nginx
# 示例
$ velero backup create backup-`date +%Y%m%d%H%M%S` --selector app=velero-demo --include-namespaces default --kubeconfig=/root/.kube/config --namespace velero-system
6.2 备份除与标签匹配的对象之外的所有对象 :app=velero-demo
$ velero backup create nginx-backup --selector 'app notin (velero-demo)'
# 示例
$ velero backup create backup-`date +%Y%m%d%H%M%S` --selector 'app notin (velero-demo)' --include-namespaces default --kubeconfig=/root/.kube/config --namespace velero-system
6.3 定时备份数据
# 每分钟执行执行一次备份
$ velero schedule create schedule-backup --schedule="* * * * *" --include-namespaces=default --default-volumes-to-fs-backup
# 示例:每天2点执行一次备份
$ velero schedule create schedule-backup --schedule="0 2 * * *" --include-namespaces=default --default-volumes-to-fs-backup --kubeconfig=/root/.kube/config --namespace velero-system
# 查看 velero 定时任务
$ velero schedule get
NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR PAUSED
schedule-backup Enabled 2025-09-17 20:15:31 +0800 CST 0 2 * * * 0s n/a <none> false
# 查看定时任务详情
$ velero schedule describe schedule-backup -n velero-system
# 暂停定时任务
$ velero schedule pause schedule-backup -n velero-system
# 删除定时任务
$ velero schedule delete schedule-backup -n velero-system
Are you sure you want to continue (Y/N)? Y
Schedule deleted: schedule-backup
# 或者 --confirm 跳过确认,直接删除
$ velero schedule delete schedule-backup -n velero-system --confirm
# 每天备份一次,@daily 相当于 0 * * * *
$ velero schedule create nginx-daily --schedule="@daily" --selector app=nginx
7. 卸载 Velero
如果部署的 velero 有问题,需要重新部署,那么才需要删除 velero。
# 方式一:
$ velero --kubeconfig /root/.kube/config uninstall --namespace velero-system
# 方式二:
# 删除命名空间(这会删除该命名空间下的所有资源)
kubectl --kubeconfig /root/.kube/config delete namespace velero-system
# 删除 CRDs(自定义资源定义)
kubectl --kubeconfig /root/.kube/config delete crds \
backups.velero.io \
backupstoragelocations.velero.io \
deletebackuprequests.velero.io \
downloadrequests.velero.io \
podvolumebackups.velero.io \
podvolumerestores.velero.io \
resticrepositories.velero.io \
restores.velero.io \
schedules.velero.io \
serverstatusrequests.velero.io \
volumesnapshotlocations.velero.io
8.补充
8.1 常用命令
# 备份存储库是否存在并且准备好
$ velero repo get
NAME STATUS LAST MAINTENANCE
default-default-kopia-59zrm Ready 2025-09-17 20:09:24 +0800 CST
# Velero 备份/恢复中是否存在任何错误
$ velero backup describe BACKUP_NAME
# 示例:$ velero backup describe <BACKUP_NAME> -n velero-system
$ velero backup logs BACKUP_NAME
$ velero restore describe RESTORE_NAME
$ velero restore logs RESTORE_NAME
# Pod 卷备份/恢复的状态如何
$ kubectl -n velero get podvolumebackups -l velero.io/backup-name=BACKUP_NAME -o yaml
$ kubectl -n velero get podvolumerestores -l velero.io/restore-name=RESTORE_NAME -o yaml
# 示例:$ kubectl -n velero get podvolumebackups -l velero.io/backup-name=default-backup-20250916210829 -o yaml -n velero-system
8.2 安全的还原
# 修改 velero-system 命名空间中名为 default 的 BackupStorageLocation 资源,将其 accessMode 设置为 ReadOnly。
# 效果:Velero 将无法向该存储位置写入新备份(例如,新的备份任务会失败),但可以读取现有备份以进行恢复操作。以防止意外修改或覆盖备份数据
$ kubectl patch backupstoragelocation default --namespace velero-system --type merge --patch '{"spec":{"accessMode":"ReadOnly"}}'
# 修改 velero-system 命名空间中名为 default 的 BackupStorageLocation 资源,将其 accessMode 设置为 ReadWrite。
# 效果:Velero 恢复完整的读写权限,可以创建新备份、删除备份(根据策略)以及读取备份进行恢复。在生产环境中,ReadWrite 是默认模式
$ kubectl patch backupstoragelocation default --namespace velero-system --type merge --patch '{"spec":{"accessMode":"ReadWrite"}}'
8.3 资源过滤
–include-namespaces
备份命名空间及其对象
velero backup create <backup-name> --include-namespaces <namespace>
恢复两个命名空间及其对象
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
–include-resources
备份集群中的所有 deployment
velero backup create <backup-name> --include-resources deployments
恢复集群中的所有 deployment 和 configmap
velero restore create <backup-name> --include-resources deployments,configmaps
备份指定命名空间中的 deployment
velero backup create <backup-name> --include-resources deployments --include-namespaces <namespace>
–include-cluster-resources
备份整个集群,包括集群范围的资源
velero backup create <backup-name>
仅恢复集群中的命名空间资源
velero restore create <backup-name> --include-cluster-resources=false
备份命名空间并包含集群范围的资源
velero backup create <backup-name> --include-namespaces <namespace> --include-cluster-resources=true
–selector,该选项不能与 --selector
一起使用
包含与标签选择器匹配的资源
velero backup create <backup-name> --selector <key>=<value>
包含与选择器不匹配的资源
velero backup create <backup-name> --selector "<key> notin (<value>)"
–or-selector
包含与任一标签选择器匹配的资源,foo=bar 或者 baz=qux
velero backup create backup1 --or-selector "foo=bar or baz=qux"
包括标记为 environment=production 或 environment=prod ,env=prod 或 env=production 的资源
velero restore create restore-prod --from-backup=prod-backup --or-selector "env in (prod,production) or environment in (prod, production)"
–include-cluster-scoped-resources
备份集群中的所有 StorageClasses 和 ClusterRoles
velero backup create <backup-name> --include-cluster-scoped-resources="storageclasses,clusterroles"
备份集群中所有集群范围的资源
velero backup create <backup-name> --include-cluster-scoped-resources="*"
–include-namespace-scoped-resources,格式为 resources.group
备份集群中的所有 Deployment 和 ConfigMap
velero backup create <backup-name> --include-namespace-scoped-resources="deployments.apps,configmaps"
备份集群中所有命名空间资源
velero backup create <backup-name> --include-namespace-scoped-resources="*"
–exclude-namespaces
从集群备份中排除 kube-system
velero backup create <backup-name> --exclude-namespaces kube-system
在恢复期间排除两个命名空间
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
–exclude-resources
从备份中排除 secrets
velero backup create <backup-name> --exclude-resources secrets
排除 secret 和 rolebindings
velero backup create <backup-name> --exclude-resources secrets,rolebindings
velero.io/exclude-from-backup=true
具有该标签的资源velero.io/exclude-from-backup=true
不会包含在备份中,即使它包含匹配的选择器标签也是如此
–exclude-cluster-scoped-resources
从备份中排除 StorageClasses 和 ClusterRoles
velero backup create <backup-name> --exclude-cluster-scoped-resources="storageclasses,clusterroles"
从备份中排除所有集群范围的资源
velero backup create <backup-name> --exclude-cluster-scoped-resources="*"
–exclude-namespace-scoped-resources,格式为 resources.group
从备份中排除所有 Deployment 和 ConfigMap
velero backup create <backup-name> --exclude-namespace-scoped-resources="deployments.apps,configmaps"
从备份中排除所有命名空间资源
velero backup create <backup-name> --exclude-namespace-scoped-resources="*"
Velero 提供资源策略来过滤资源以进行备份或恢复。目前仅支持通过资源策略跳过备份卷
① 创建资源策略配置映射
用户需要从定义资源策略的 YAML 文件在 Velero 安装命名空间中创建一个配置映射。创建命令如下所示:
kubectl create cm <configmap-name> --from-file <yaml-file> -n velero
② 创建对已定义资源策略的备份引用
velero backup create --resource-policies-configmap <configmap-name>
③ YAML 模板
# currently only supports v1 version
version: v1
volumePolicies:
# each policy consists of a list of conditions and an action
# we could have lots of policies, but if the resource matched the first policy, the latters will be ignored
# each key in the object is one condition, and one policy will apply to resources that meet ALL conditions
# NOTE: capacity or storageClass is suited for [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes), and pod [Volume](https://kubernetes.io/docs/concepts/storage/volumes) not support it.
- conditions:
# capacity condition matches the volumes whose capacity falls into the range
capacity: "10,100Gi"
# pv matches specific csi driver
csi:
driver: aws.ebs.csi.driver
# pv matches one of the storage class list
storageClass:
- gp2
- standard
action:
type: skip
- conditions:
capacity: "0,100Gi"
# nfs volume source with specific server and path (nfs could be empty or only config server or path)
nfs:
server: 192.168.200.90
path: /mnt/data
action:
type: skip
- conditions:
nfs:
server: 192.168.200.90
action:
type: skip
- conditions:
# nfs could be empty which matches any nfs volume source
nfs: {}
action:
type: skip
- conditions:
# csi could be empty which matches any csi volume source
csi: {}
action:
type: skip
- conditions:
volumeTypes:
- emptyDir
- downwardAPI
- configmap
- cinder
action:
type: skip
并行文件上传
$ velero backup create <BACKUP_NAME> --include-namespaces <NAMESPACE> --parallel-files-upload <NUM> --wait
参考链接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com