
Velero 示例工程详解用 Minio 与 nginx 示例应用跑通备份恢复全流程【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本篇以 Velero 仓库 examples 目录 的两组官方示例为主线minio/提供一套本地 S3 兼容对象存储让开发者和贡献者无需绑定任何云厂商即可验证 Veleronginx-app/提供可一键部署的测试应用用于验证资源备份/恢复以及 PV 快照能力。读完本文你将能独立完成本地存储安装 Velero → 部署示例应用 → 创建备份与定时任务 → 模拟灾难 → 恢复验证 → 清理的完整闭环并理解示例清单中关键设计emptyDir 存储、bucket 初始化 Job、fsfreeze 备份钩子背后的实现原理。一、examples 目录的定位examples/README.md 明确说明该目录包含可用于探索 Velero 的示例 YAML 配置文件由两个子目录组成目录用途适用场景minio/部署 Minio本地 S3 兼容对象存储供 Quickstart 使用不绑定特定云厂商低成本测试 Veleronginx-app/一个可测试备份与恢复的示例 nginx 应用验证资源备份/恢复以及 PV 快照功能这两个示例并非孤立存在仓库文档 site/content/docs/main/contributions/minio.mdQuick start evaluation install with Minio正是基于这份清单编写了完整的演练流程。下面先逐份拆解示例清单本身。二、minio/本地对象存储的完整清单examples/minio/00-minio-deployment.yaml 一次性定义了 4 个对象全部位于velero命名空间Namespacevelero与 Velero 服务端同命名空间便于后续velero install默认落在velero命名空间。Deploymentminio镜像minio/minio:latest启动参数server /storage --config-dir/config凭据通过环境变量注入MINIO_ACCESS_KEYminio、MINIO_SECRET_KEYminio123即 Quickstart 中credentials-velero文件里使用的aws_access_key_id/aws_secret_access_key数据目录/storage与配置目录/config均使用emptyDir卷。清单中注释和文档都强调节点必须有待备份数据 至少 1GB的可用空间Minio 在可用空间不足 1GB 时会拒绝工作空间不够时应把 emptyDir 换成 Persistent Volume部署策略为Recreate避免滚动升级期间出现两个 Minio 实例争抢端口与数据目录。Serviceminio默认type: ClusterIP暴露 9000 端口。清单中的注释说明生产环境推荐 ClusterIP只有在 Minikube 等测试/试用环境下才改为 NodePort。Jobminio-setup使用minio/mc:latest镜像完成两个动作——通过mc alias set velero http://minio:9000 minio minio123配置别名再执行mc mb -p velero/velero创建velerobucket-p表示 bucket 创建成功时不报错可重复执行。Job 与 Deployment 通过共享的 emptyDir/config复用 mc 配置目录restartPolicy: OnFailure保证失败可重试。这份清单的设计意图是自包含从存储引擎到 bucket 初始化全部就绪用户只需一条命令kubectl apply -f examples/minio/00-minio-deployment.yaml三、安装 Velero 服务端指向本地 Minio 的关键参数部署好 Minio 后在 Velero 客户端目录下创建凭据文件credentials-velero[default] aws_access_key_id minio aws_secret_access_key minio123然后安装服务端velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.14.0 \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshotsfalse \ --backup-location-config regionminio,s3ForcePathStyletrue,s3Urlhttp://minio.velero.svc:9000各参数与示例清单的对应关系以仓库 Quickstart 文档为准--provider aws本地 Minio 走 S3 兼容接口故使用 AWS 插件--bucket velero与minio-setupJob 创建的 bucket 名称一致--use-volume-snapshotsfalse本地集群假设没有支持快照的 volume 提供商因此不创建VolumeSnapshotLocation--backup-location-config中三个键值regionminio占位 region满足 AWS SDK 要求s3Urlhttp://minio.velero.svc:9000指向 Serviceminio的集群内地址minio.velero.svc即服务名.命名空间.svcs3ForcePathStyletrue必须设置。AWS SDK 默认采用 virtual-host 风格寻址而 MinIO 默认只支持 path-style 风格不匹配时会出现能上传、不能下载的问题。文档同时给出替代方案给 MinIO 服务端配置MINIO_DOMAIN环境变量使其支持 virtual-host 风格。此外还可按需追加--use-node-agent启用文件系统备份、--wait等待部署就绪。四、nginx-app/两个层级的测试应用examples/nginx-app/README.md 将该目录描述为nginx-example命名空间下、两个版本的示例 Nginx 应用的 manifest。base.yaml最简验证版examples/nginx-app/base.yaml 包含三个对象可以直接部署Namespacenginx-example带标签app: nginxDeploymentnginx-deployment2 副本镜像nginx:1.17.6暴露容器端口 80Servicemy-nginxLoadBalancer类型80 → 80 映射选择器app: nginx。它覆盖 Velero 最核心的能力面Namespaced 资源Namespace、Deployment、Service的备份与恢复。标签app: nginx是后续备份选择器的锚点。with-pv.yamlPV 快照验证版examples/nginx-app/with-pv.yaml 让 nginx 把日志写入持久卷用于测试 Velero 的 PV 快照能力。与 base 版相比有三处关键差异PVCnginx-logs50Mi、ReadWriteOnce。storageClassName: YOUR_STORAGE_CLASS_NAME默认被注释——需要先替换占位符为你的 StorageClass 名称再取消注释若集群存在唯一/默认 StorageClass也可不指定由集群自动绑定。副本数从 2 降为 1PV 是ReadWriteOnce只允许单节点单挂载因此必须单副本。fsfreeze 备份钩子Pod 模板上带有两组 annotation并多出一个特权容器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]其中fsfreeze容器基于ubuntu:bionic、privileged: true与 nginx 容器共享挂载/var/log/nginx命令为sleep infinity保持存活以便 Velero 在其中执行 hook 命令。从源码结构看这套 annotation 由 internal/hook/item_hook_handler.go 解析并执行备份前在指定容器内运行pre.hook.backup.velero.io/command备份后运行 post 命令internal/hook/item_hook_handler_test.go 中的用例直接使用了pre.hook.backup.velero.io/container/command这对 annotation 验证解析逻辑。fsfreeze 冻结文件系统后做快照可保证卷内数据一致性——这正是 with-pv 版想演练的完整 PV 快照数据路径。注意--use-volume-snapshotsfalse的 Minio 安装方式下没有 VolumeSnapshotLocationwith-pv.yaml 主要用于在具备快照能力的集群或另行配置快照位置后测试该功能仅测资源备份/恢复时部署 base.yaml 即可。五、完整演练流程备份、定时、灾难与恢复以下流程来自 Quickstart 文档 site/content/docs/main/contributions/minio.md与仓库示例清单一一对应1. 部署应用并检查状态kubectl apply -f examples/nginx-app/base.yaml kubectl get deployments -l componentvelero --namespacevelero kubectl get deployments --namespacenginx-example2. 创建备份按标签选择器velero backup create nginx-backup --selector appnginx也可用排除式选择器备份除backupignore之外的全部对象velero backup create nginx-backup --selector backup notin (ignore)3.可选创建定时备份velero schedule create nginx-daily --schedule0 1 * * * --selector appnginx # 或使用简写 velero schedule create nginx-daily --scheduledaily --selector appnginx4. 模拟灾难kubectl delete namespace nginx-example稍等片刻后用kubectl get deployments/services/namespace确认资源已消失。5. 恢复并验证velero restore create --from-backup nginx-backup velero restore get恢复完成后STATUS应为Completed、WARNINGS与ERRORS均为 0恢复期间该列显示InProgress。如有异常可用velero restore describe RESTORE_NAME查看明细。6. 清理velero backup delete BACKUP_NAME # 删除备份及其对象存储数据/PV快照 velero backup get BACKUP_NAME # 确认已不可见 kubectl delete namespace/velero clusterrolebinding/velero kubectl delete crds -l componentvelero kubectl delete -f examples/nginx-app/base.yaml六、延伸让客户端访问 Minio 签名 URLvelero logs/velero describe依赖 Velero 服务端生成的预签名 URL 从对象存储拉取数据因此客户端必须能访问到 Minio。清单默认 ClusterIP仅集群内可达Quickstart 给出三类方案NodePortMinikube 等可直连节点的环境把 examples/minio/00-minio-deployment.yaml 中 Service 的spec.type改为NodePort再用minikube service minio --namespacevelero --urlMinikube或节点外网 IP kubectl -n velero get svc/minio -o jsonpath{.spec.ports[0].nodePort}拼出 URL最后把publicUrl: URL须带http:///https://前缀写入BackupStorageLocation的spec.configIngress保持 ClusterIP把 Ingress 地址写入publicUrlKinDKubernetes in Dockerport-forwardKinD 不支持 NodePort可用端口转发模拟外部访问MINIO_POD$(kubectl get pods -n velero -l componentminio -o jsonpath{.items[0].metadata.name}) kubectl port-forward $MINIO_POD -n velero 9000:9000然后在另一个终端kubectl edit backupstoragelocation default -n velero在spec.config下加publicUrl: http://localhost:9000。另若 Minio 走 HTTPSvelero describe/velero logs输出可能显示乱码可通过 patch 为 BSL 添加公网 URL 修复kubectl patch -n velero backupstoragelocation default --type merge -p {spec:{config:{publicUrl:https://a public IP for your Minio instance:9000}}}七、小结examples 目录用两份清单搭出了 Velero 的最小可运行验证环境minio/ 解决了对象存储从哪来emptyDir 自动建桶 Job path-style 强制配置nginx-app/ 解决了拿什么练手base 版测资源备份恢复with-pv 版借助 fsfreeze 钩子 annotation 测 PV 快照一致性。所有参数与命令均可直接复制执行如需在生产集群落地应改用 site/content/docs/main/contributions/minio.md 中Set up Velero on your platform对应的正式安装方式而不是这套以 emptyDir 为底的本地区探配置。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考