ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Velero v1.1 文档导读:Kubernetes 集群备份、迁移与持久化卷恢复实战指南

Velero v1.1 文档导读:Kubernetes 集群备份、迁移与持久化卷恢复实战指南 Velero v1.1 文档导读Kubernetes 集群备份、迁移与持久化卷恢复实战指南【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/veleroVelero前身 Heptio Ark是 Kubernetes 生态中用于备份与恢复集群资源及持久化卷的开源工具本文以仓库中 v1.1.0 版本文档首页为骨架系统讲解 Velero 的架构组成、安装方式云厂商 / 本地 / Helm、基于 Minio 的完整上手演练、restic 卷备份集成以及常见故障排查方法。读完本文你将掌握从零搭建 Velero 环境、完成一次备份 → 模拟灾难 → 恢复全流程并能熟练使用velero install、velero backup、velero restore、velero schedule等核心命令处理日常备份与迁移任务。Velero 是什么核心能力与组成结构Velero 的定位非常明确为 Kubernetes 集群提供备份与恢复工具其核心能力可以概括为三类依据 v1.1.0 文档首页集群备份与灾备恢复对集群资源进行备份在数据丢失、集群损坏时恢复业务集群间迁移将集群资源从一套 Kubernetes 环境迁移到另一套环境环境复制将生产集群复制到开发、测试集群用于预发布验证与演练。Velero 由两部分组成服务端Server以 Deployment 形式运行在集群内部负责执行备份、恢复等实际工作命令行客户端Clientvelero二进制运行在本地通过 Kubernetes API 与服务端交互。Velero 可以运行在云厂商提供的集群上也可以运行在本地on-premises集群中前提是需要一个可用的对象存储作为备份数据的落盘位置详细的兼容存储提供商列表见 支持矩阵。与当前仓库的对应关系从仓库结构看Velero 的服务端 客户端架构在代码层面有清晰的落点服务端入口位于 cmd/velero/velero.goserver子命令启动时注册了 pkg/controller 下的一系列控制器backup、restore、schedule、GC 等客户端命令实现集中在 pkg/cmd/cli 目录其中 install.go 就是velero install命令的选项定义与执行入口。安装 Velero三种路径与velero install详解v1.1.0 文档首页明确建议优先使用官方 release 的 tarball每个 release 的 tarball 中都包含velero命令行客户端而仓库主分支的代码和示例 YAML 处于活跃开发中不保证稳定。完整安装指引见 安装概览。1. 云厂商环境velero install一键部署对于 AWS、GCP、Azure、IBM Cloud 等受支持的云厂商客户端内置了install命令通过参数指定云厂商和存储桶即可生成并应用全部部署资源velero install \ --provider YOUR_PROVIDER \ --bucket YOUR_BUCKET \ [--secret-file PATH_TO_FILE] \ [--no-secret] \ [--backup-location-config] \ [--snapshot-location-config] \ [--namespace] \ [--use-volume-snapshots] \ [--use-restic] \ [--pod-annotations]关键参数说明参数作用--provider云厂商标识如aws、gcp、azure、ibm--bucket存放备份数据的对象存储桶名称--secret-file云厂商凭证文件路径使用节点级 IAM 策略时可不提供但必须加上--no-secret确认--backup-location-configBackupStorageLocation的附加配置如 S3 的region、s3Url--snapshot-location-configVolumeSnapshotLocation的附加配置--namespace部署 Velero 的命名空间默认velero--use-volume-snapshots是否创建VolumeSnapshotLocation默认开启使用 restic 且存储平台不支持快照时需设为false--use-restic是否启用 restic 卷备份集成额外部署 DaemonSet--pod-annotations为 Velero 服务端 Pod 附加注解各云厂商的具体配置说明见 AWS、GCP、Azure、IBM Cloud 文档。两个非常实用的技巧想预览velero install将要应用的 YAML而不真正部署使用--dry-run -o yaml即可将全部资源输出到终端需求复杂时可以直接基于生成的 YAML 修改或者改用 Helm chart 安装。从源码看velero install的选项结构定义在 pkg/cmd/cli/install/install.go 的Options结构体中包含Namespace、Image、BucketName、ProviderName、SecretFile、NoSecret、DryRun、UseVolumeSnapshots等字段而实际生成 Deployment、DaemonSet、CRD、RBAC 等资源对象的逻辑在 pkg/install 包中例如 deployment.go、daemonset.go、resources.go。2. 本地环境对象存储 卷快照方案的选择在本地on-premises集群上运行 Velero 需要解决两个问题选择对象存储后端Velero 需要对象存储来存放备份数据。兼容存储提供商列表见 支持矩阵。如果想完全本地化且没有现成的 S3 兼容对象存储Minio 是文档明确推荐的选项Minio 部署清单在仓库 examples/minio/00-minio-deployment.yaml。选择卷数据备份方案如果业务有持久化卷需要备份必须选择一种卷备份方案原生快照插件如果存储平台有对应的快照插件如 Portworx 提供的 Velero 插件可以直接获得原生快照能力卷快照提供商列表见 支持矩阵restic 集成如果存储平台没有原生快照插件可以使用 Velero 的 restic 集成它提供与平台无关的卷数据备份能力详见下文。3. 资源配额定制velero install默认给 Velero Deployment 设置了资源请求与限制500m CPU / 128Mi 内存request1000m CPU / 256Mi 内存limit。restic Pod 默认不设置 request/limit因为其 CPU/内存消耗高度依赖被备份卷的大小。需要定制时使用以下参数取值格式遵循 Kubernetes 资源量纲规范如500m、128Mivelero install \ --provider YOUR_PROVIDER \ --bucket YOUR_BUCKET \ --secret-file PATH_TO_FILE \ --velero-pod-cpu-request CPU_REQUEST \ --velero-pod-mem-request MEMORY_REQUEST \ --velero-pod-cpu-limit CPU_LIMIT \ --velero-pod-mem-limit MEMORY_LIMIT \ [--use-restic] \ [--restic-pod-cpu-request CPU_REQUEST] \ [--restic-pod-mem-request MEMORY_REQUEST] \ [--restic-pod-cpu-limit CPU_LIMIT] \ [--restic-pod-mem-limit MEMORY_LIMIT]4. 自定义命名空间与卸载Velero 默认部署在velero命名空间也可以部署到任意自定义命名空间需要额外定制见 namespace 文档。彻底卸载 Velero 时执行以下命令移除velero install创建的所有资源kubectl delete namespace/velero clusterrolebinding/velero kubectl delete crds -l componentvelero5. Helm Chart 安装使用 Helm chart 安装时需要把云厂商凭证追加到 values 中。最简单的方式是利用 Helm 2.10 的--set-file参数helm install --set-file credentials.secretContents.cloud./credentials-velero stable/velerocredentials-velero文件的内容与创建方式见各云厂商文档。基于 Minio 的完整上手演练v1.1.0 文档首页指向的 快速入门 提供了一套完整的服务端搭建 → 备份 → 模拟灾难 → 恢复演练。为简化起见示例使用 Minio运行在集群内的 S3 兼容存储作为备份存储注意这仅用于体验基础功能生产环境配置 Minio 不在文档范围内。前置条件Kubernetes 集群 1.7 及以上restic 支持则需要 1.10或开启了 mount propagation 的更早版本集群内配置了 DNS 服务已安装kubectl。客户端下载与安装从官方 release 页面下载对应平台的 tarball 并解压得到velero二进制tar -xvf RELEASE-TARBALL-NAME.tar.gz -C /dir/to/extract/to将velero二进制放入 PATHmacOS 用户可直接用 Homebrew 安装brew install velero。搭建服务端与 Minio创建本地凭证文件credentials-velero[default] aws_access_key_id minio aws_secret_access_key minio123启动 Minio 存储服务部署清单见 examples/minio/00-minio-deployment.yamlkubectl apply -f examples/minio/00-minio-deployment.yaml安装 Velero 服务端通过--backup-location-config把备份存储指向 Minio 的 S3 接口velero install \ --provider aws \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshotsfalse \ --backup-location-config regionminio,s3ForcePathStyletrue,s3Urlhttp://minio.velero.svc:9000示例假设运行在本地集群、没有可用的卷快照提供商因此用--use-volume-snapshotsfalse避免创建无用的VolumeSnapshotLocation。此外可以追加--use-restic启用 restic--wait等待 Deployment 就绪。部署示例 nginx 应用并验证kubectl apply -f examples/nginx-app/base.yaml kubectl get deployments -l componentvelero --namespacevelero kubectl get deployments --namespacenginx-examplenginx 示例清单见 examples/nginx-app/base.yaml无 PV 版与 examples/nginx-app/with-pv.yaml含 PV 版。创建备份按标签选择器备份appnginx的所有对象velero backup create nginx-backup --selector appnginx如果只想备份除backupignore标签之外的对象可以用velero backup create nginx-backup --selector backup notin (ignore)需要周期性备份时创建基于 cron 表达式的定时任务也支持daily等非标准简写velero schedule create nginx-daily --schedule0 1 * * * --selector appnginx velero schedule create nginx-daily --scheduledaily --selector appnginx模拟灾难并恢复删除整个命名空间模拟灾难可能需要几分钟完成清理kubectl delete namespace nginx-example确认资源已消失kubectl get deployments --namespacenginx-example kubectl get services --namespacenginx-example kubectl get namespace/nginx-example从备份恢复velero restore create --from-backup nginx-backup velero restore get恢复期间STATUS为InProgress完成后变为Completed且WARNINGS与ERRORS均为 0nginx-example命名空间下的所有对象应与删除前一致。若有错误或警告用velero restore describe RESTORE_NAME查看详情。清理velero backup delete BACKUP_NAME # 删除备份含对象存储中的数据与卷快照 kubectl delete namespace/velero clusterrolebinding/velero kubectl delete crds -l componentvelero kubectl delete -f examples/nginx-app/base.yaml将 Minio 暴露到集群外velero describe、获取日志等操作需要 Velero 服务端生成预签名 URL 供客户端下载因此需要把 Minio 暴露到集群外三种方式NodePort把 examples/minio/00-minio-deployment.yaml 中 Service 的spec.type从ClusterIP改为NodePort然后获取访问地址minikube service minio --namespacevelero --url # Minikube 环境 kubectl -n velero get svc/minio -o jsonpath{.spec.ports[0].nodePort} # 其他环境再编辑BackupStorageLocation在spec.config下添加publicUrl: http://节点IP:NodePort需带http://或https://前缀。Ingress保持 Service 为ClusterIP在spec.config下添加publicUrl: INGRESS_URL_AND_PORT。KinD 环境KinD 暂不支持 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。restic 集成平台无关的卷备份方案云厂商的块存储快照AWS EBS、Azure Managed Disks、GCP Persistent Disks要求存储平台提供原生快照能力。而restic 集成让 Velero 获得开箱即用、几乎覆盖所有卷类型的能力——EFS、AzureFile、NFS、emptyDir、local 等没有原生快照概念的卷都可以备份。文档强调这是新增能力而非替代方案如果已在 AWS 上使用 EBS 快照无需切换到 restic。注意hostPath卷不受支持但 Kubernetes 的 local 持久卷 支持。restic 集成详情见 restic.md。安装与平台适配前置条件是 Kubernetes 支持 MountPropagation 特性v1.10.0 起默认启用。安装时只需在velero install后追加--use-resticVelero 会额外部署一个 restic DaemonSet。部分基于 Kubernetes 的 PaaS/CaaS 平台需要对 DaemonSet 规格做修改RancherOShostPath 不是/var/lib/kubelet/pods而是/opt/rke/var/lib/kubelet/pods需要修改 restic DaemonSet 的hostPath.pathOpenShiftrestic 容器需要以 privileged 模式运行才能挂载正确的 hostPath 访问 Pod 卷默认 SELinux 策略会阻止非特权访问。操作步骤先oc adm policy add-scc-to-user privileged -z velero -n velero把veleroServiceAccount 加入 privileged SCC再修改 DaemonSethostPath 改为/var/lib/origin/openshift.local.volumes/pods并给容器加上securityContext.privileged: true。另外需要在安装前给命名空间加注解oc annotate namespace velero namespace openshift.io/node-selector否则 Pod 不会调度到所有节点Enterprise PKS需要在 plan 配置中启用Allow Privileged并把 hostPath 改为/var/vcap/data/kubelet/pods。卷备份给 Pod 打注解对每个包含待备份卷的 Pod 执行注解命令卷名取自 Pod spec 中的 volumes 名称kubectl -n YOUR_POD_NAMESPACE annotate pod/YOUR_POD_NAME backup.velero.io/backup-volumesYOUR_VOLUME_NAME_1,YOUR_VOLUME_NAME_2,...例如下面的 PodapiVersion: v1 kind: Pod metadata: name: sample namespace: foo spec: containers: - image: k8s.gcr.io/test-webserver name: test-webserver volumeMounts: - name: pvc-volume mountPath: /volume-1 - name: emptydir-volume mountPath: /volume-2 volumes: - name: pvc-volume persistentVolumeClaim: claimName: test-volume-claim - name: emptydir-volume emptyDir: {}对应注解为kubectl -n foo annotate pod/sample backup.velero.io/backup-volumespvc-volume,emptydir-volume注解同样可以写在使用控制器如 Deployment管理的 Pod 模板 spec 中。之后执行velero backup create NAME OPTIONS...备份完成后用以下命令查看 Pod 卷备份状态velero backup describe YOUR_BACKUP_NAME kubectl -n velero get podvolumebackups -l velero.io/backup-nameYOUR_BACKUP_NAME -o yaml卷恢复与自定义恢复辅助容器恢复直接复用普通恢复命令完成后同样可以查看PodVolumeRestore资源velero restore create --from-backup BACKUP_NAME OPTIONS... velero restore describe YOUR_RESTORE_NAME kubectl -n velero get podvolumerestores -l velero.io/restore-nameYOUR_RESTORE_NAME -o yamlVelero 在 restic 恢复时会在 Pod 中注入一个 init 容器默认镜像为gcr.io/heptio-images/velero-restic-restore-helper:VERSION。可以通过在velero命名空间创建 ConfigMap 来自定义镜像与资源配额ConfigMap 使用固定标签velero.io/plugin-config: 和velero.io/restic: RestoreItemAction被 Velero 识别apiVersion: v1 kind: ConfigMap metadata: name: restic-restore-action-config namespace: velero labels: velero.io/plugin-config: velero.io/restic: RestoreItemAction data: image: myregistry.io/my-custom-helper-image[:OPTIONAL_TAG] cpuRequest: 200m # 未设置时默认 100m值为 0 视为不限制 memRequest: 128Mi # 未设置时默认 128Mi值为 0 视为不限制 cpuLimit: 200m # 未设置时默认 100m值为 0 视为不限制 memLimit: 128Mi # 未设置时默认 128Mi值为 0 视为不限制注意image的值可以带 tag 也可以不带不带时会自动沿用主 Velero 镜像的 tag。restic 备份/恢复的底层工作流Velero 为 restic 集成引入了三个自定义资源及对应控制器这些 CRD 在 config/crd 下有对应定义控制器实现位于 pkg/controllerResticRepository管理 restic 仓库的生命周期。当某个命名空间第一次发起 restic 备份时Velero 会为该命名空间创建一个 restic 仓库对应控制器负责执行restic init、restic check、restic prunePodVolumeBackup代表一个 Pod 内某个卷的 restic 备份。主备份流程发现带注解的 Pod 后创建集群每个节点通过 DaemonSet运行控制器处理本节点 Pod 的PodVolumeBackup执行restic backupPodVolumeRestore代表一个 Pod 卷的 restic 恢复。恢复流程为每个有 restic 备份关联的 Pod 创建节点上的控制器执行restic restore。备份流程逐步主进程检查每个待备份 Pod 的注解backup.velero.io/backup-volumes→ 为 Pod 所在命名空间确保 restic 仓库存在不存在则创建并等待ResticRepository控制器 init/check→ 为注解中的每个卷创建PodVolumeBackup→ 等待全部完成或失败同时节点控制器通过挂载/var/lib/kubelet/podshostPath 找到卷子目录并执行restic backup更新 CR 状态为Completed/Failed。全部完成后结果被写入backup-name-podvolumebackups.json.gz并随备份包上传到对象存储供后续恢复使用。恢复流程逐步主进程检查集群中已有的PodVolumeBackup→ 确保对应命名空间的 restic 仓库存在此时仓库应已在对象存储中控制器仅做完整性 check→ 为 Pod 注入等待 init 容器并提交 Pod → 为每个待恢复卷创建PodVolumeRestore→ 等待完成节点控制器执行restic restore成功后会在卷的.velero子目录写入以恢复 UID 命名的标记文件init 容器中的进程轮询到该文件后成功退出Pod 才继续启动其他容器。restic 已知限制hostPath卷不受支持local 持久卷支持Velero 为所有 restic 仓库使用静态公共加密密钥任何能访问你存储桶的人都可能解密 restic 备份数据必须严格控制桶的访问权限完整备份加密计划在后续版本实现集成依赖 Pod 名关联 restic 备份与父资源Pod 重启后如 Deployment 滚动更新下一次备份会被视为全新备份而非增量restic 以单线程扫描文件大文件如数据库文件即使实际差异很小去重扫描也会耗时较长。故障排查指南v1.1.0 文档首页的 troubleshooting 章节给出了系统的排障思路相关深度文档见 调试安装问题 与 调试恢复问题。基础排障命令velero bug打开浏览器窗口预填 OS、CPU 架构、kubectl客户端/服务端版本、velero客户端版本等信息用于提交 GitHub issuevelero backup describe backupName查看备份详情velero backup logs backupName获取该备份的日志用于查看失败与警告含未能备份的资源velero restore describe restoreName查看恢复详情velero restore logs restoreName获取该恢复的日志kubectl logs deployment/velero -n velero查看 Velero 服务端进程日志。获取 debug 级日志通过编辑 Deployment 增加--log-level debug参数来提高服务端日志详细度kubectl edit deployment/velero -n velero # ... containers: - name: velero image: gcr.io/heptio-images/velero:latest command: - /velero args: - server - --log-level # 新增 - debug # 新增已知问题与常见误区LoadBalancer 类型 Service 恢复后地址变化Kubernetes 会根据 Service 的 UID 自动生成云负载均衡器资源名恢复后 UID 变化导致负载均衡器名称变化。如果应用的 DNS CNAME 指向云负载均衡器 DNS 名恢复后需要更新 CNAME如果云厂商支持也可以使用spec.loadBalancerIP保持连接有效。启动时报custom resource not foundVelero 服务端在缺少所需 CRD 时无法启动重新执行velero install安装缺失的 CRD 即可。velero backup logs报SignatureDoesNotMatch从对象存储下载工件依赖临时签名 URLS3 兼容存储如 Ceph与官方 S3 API 实现存在差异。建议确认 S3 兼容层使用 signature version 4如 Ceph RADOS v12.2.7并在 Ceph 场景使用原生 Ceph 账号而非 OpenStack Keystone 等外部凭证。备份期间 Velero或被备份 Pod重启导致备份卡在InProgressVelero 目前无法恢复被中断的备份。卡在InProgress阶段的备份可用kubectl delete backup name -n velero-namespace删除此类备份尚未向对象存储上传任何文件。支持矩阵与扩展机制v1.1.0 支持矩阵 从三个维度说明了 Velero 的兼容性Kubernetes 版本Velero 一般支持 Kubernetes 1.7CRD 引入的版本restic 支持需要 1.10或开启了 mount propagation 的更早版本备份存储提供商AWS S3、Azure Blob Storage、Google Cloud Storage 由 Velero 团队官方支持S3 兼容存储Velero 通过 Amazon Go SDK 连接 S3 API用户报告可用的第三方存储包括 IBM Cloud、Minio、Ceph RADOS v12.2.7、DigitalOcean、Quobyte、NooBaa、Oracle Cloud 等注意这些未被 Velero 团队常规测试。部分存储如 Quobyte可能需要不同的签名算法版本见 BackupStorageLocation 的 AWS 配置说明卷快照提供商AWS EBS、Azure Managed Disks、GCE Disks、restic 由 Velero 团队支持Portworx、DigitalOcean、OpenEBS、AlibabaCloud、HPE 等由对应厂商或社区维护插件。插件扩展机制Velero 采用插件系统任何人无需修改 Velero 主代码库即可为新的存储平台添加兼容性。编写新插件可参考示例插件仓库插件发布后通过 PR 把插件加入对应列表。在仓库代码中插件接口定义位于 pkg/plugin/protogRPC 协议与 pkg/plugin/framework框架实现插件化也是 Velero 支持众多云厂商与存储后端的基石。版本选择与升级文档首页特别强调了两点版本注意事项优先使用官方 releasetarball 内含velero客户端主分支代码与示例 YAML 处于活跃开发中不保证稳定使用正确的版本文档站点顶部提供版本选择器请确保阅读的文档与你的 Velero 版本匹配。v1.1.0 用户可参考 升级到 1.1 指南 完成版本升级并查看仓库 changelogs/CHANGELOG-1.1.md 了解该版本的功能变更。如需构建调试或从源码运行可参考 run-locally 与 development 文档。总结Velero v1.1 提供了一套完整的 Kubernetes 备份恢复方案通过velero install即可在主流云厂商或本地环境完成部署基于 Minio 的入门演练可以在数分钟内跑通备份 → 灾难 → 恢复全流程restic 集成弥补了非云厂商存储卷备份的空白配套的排障命令与支持矩阵则帮助你在生产环境快速定位问题。围绕本文涉及的文档你可以继续深入仓库源码pkg/controller 下的备份/恢复/调度控制器、pkg/cmd/cli 下的全部 CLI 命令实现、pkg/install 下的安装资源生成逻辑以及 examples 目录中的可直接运行的示例清单。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表