使用 Velero 将 IBM Cloud Object Storage(COS)配置为备份存储目标
2026/9/16 16:09:25 网站建设 项目流程

使用 Velero 将 IBM Cloud Object Storage(COS)配置为备份存储目标

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

导读

本文基于 Velero 官方文档中的 IBM 配置指南,完整讲解如何将 IBM Cloud Object Storage(COS)作为 Velero 的备份存储目标(BackupStorageLocation)使用。无论你的 Velero 部署在 IBM Public Cloud、IBM Private Cloud 还是其他任何 Kubernetes 集群上,都可以通过本文的步骤,让备份数据落到 COS 的 S3 兼容对象存储桶中。读完本文,你将掌握从下载 Velero 发行版、创建 COS 实例与桶、生成 HMAC 服务凭据,到配置 BackupStorageLocation 并启动 Velero 服务端的完整实操链路,同时理解其背后的 S3 兼容认证原理与配置项含义。

总体思路:为什么 IBM COS 可以作为 Velero 的目标存储

Velero 本身并不直接依赖某个特定云厂商的存储 API,而是通过BackupStorageLocation这一自定义资源(CRD)抽象出“备份存储在哪里”。IBM Cloud Object Storage 提供了与 AWS S3 兼容的 REST API,因此可以复用 Velero 内置的 AWS(S3 兼容)对象存储插件。

整套配置流程分为五个阶段,这也是本文的组织脉络:

  1. 下载 Velero 官方发行版(包含veleroCLI 与配套的示例 YAML);
  2. 创建 COS 实例(resource instance);
  3. 在 COS 中创建 S3 桶(bucket);
  4. 创建具备写入权限、携带 HMAC 密钥的服务凭据(service credentials);
  5. 配置 Velero 服务端(命名空间、RBAC、Secret、BackupStorageLocation)并启动。

注意:本文涉及的config/ibm/等示例 YAML 路径来自 Velero 官方 release 发行版 tarball。当前仓库中的示例文件结构有所不同(见 examples/nginx-app/with-pv.yaml 等),下文会同时给出当前仓库可参考的等价示例。

第一步:下载并解压 Velero 官方发行版

  1. 从 Velero 官方 releases 页面下载适配你客户端平台的最新发行版 tarball。

  2. 解压 tarball:

    tar -xvf <RELEASE-TARBALL-NAME>.tar.gz -C /dir/to/extract/to

    下文将该解压目录统称为“Velero 目录”。

  3. velero二进制从 Velero 目录移动到 PATH 中的某个位置,例如:

    sudo mv velero-<VERSION>/velero /usr/local/bin/

强烈建议使用官方正式发行版:每个发行版的 tarball 中既包含velero命令行客户端,也包含与该版本配套的、可用于向集群部署 Velero 的示例 YAML 文件。仓库主分支中的代码与示例 YAML 处于持续开发中,不保证稳定,自行承担使用风险。

第二步:创建 COS 实例

如果还没有 COS 实例,请按照 IBM 官方文档《Creating a new resource instance》的指引在 IBM Cloud 控制台创建。创建实例时会选择存储类型(如 Standard 或 Vault)、区域与资源组,这些属性会决定后续桶的创建位置与计费方式。本步骤在 IBM Cloud 控制台完成,Velero 侧无需额外操作。

第三步:创建 S3 桶

Velero 需要一个对象存储桶来存放备份数据。按照 IBM 官方文档《Create some buckets to store your data》在已创建的 COS 实例中创建一个桶。

几点建议:

  • 桶名必须全局唯一(S3 命名空间是全局共享的);
  • 建议一个 Kubernetes 集群对应一个专用桶,便于备份数据隔离与后续清理;
  • 记录桶所在的区域(region)与桶的访问端点(endpoint / URL access point),第三步配置 BackupStorageLocation 时会用到。

第四步:创建服务凭据(Service Credentials)并生成 HMAC 密钥

4.1 角色要求:Writer 写入权限

Velero 服务端会把备份写入桶中,因此服务凭据必须具有对该桶的Writer(写入者)访问角色。如果权限不足,后续备份会上传失败。

4.2 关键原理:Velero 通过 AWS S3 兼容 API 认证

Velero 使用与 AWS S3 兼容的 API 访问 COS,即它使用一对 access key 与 secret key(即HMAC 凭据)按 AWS 签名算法对请求进行签名认证。因此,在创建服务凭据时,必须通过可选的 inline 参数显式生成 HMAC 凭据:

{"HMAC":true}

这是整个 IBM 配置中容易遗漏的关键点——若创建凭据时未指定{"HMAC":true},则凭据中不会包含cos_hmac_keys字段,Velero 将无法获得签名所需的 access key / secret key。

4.3 从凭据 JSON 中提取密钥

服务凭据创建成功后,查看其 JSON 定义。在cos_hmac_keys条目下可以看到两个字段:

  • access_key_id
  • secret_access_key

这两个值将用于构造 Velero 的本地凭据文件。

4.4 创建 Velero 专用的凭据文件

在本地目录创建一个名为credentials-velero的文件,内容格式如下(INI 风格,与 AWS CLI 凭据文件兼容):

[default] aws_access_key_id=<ACCESS_KEY_ID> aws_secret_access_key=<SECRET_ACCESS_KEY>

其中<ACCESS_KEY_ID><SECRET_ACCESS_KEY>分别替换为上一步从cos_hmac_keys中提取到的值。

第五步:配置命名空间、RBAC 与凭据

5.1 初始化命名空间、CRD 与 RBAC

在 Velero 目录中执行以下命令,完成命名空间、自定义资源定义(CRD)、ServiceAccount 与 RBAC 规则的初始化:

kubectl apply -f config/common/00-prereqs.yaml

00-prereqs.yaml定义了 Velero 对象的 CRD(backups、schedules、restores、downloadrequests 等)、Velero 服务端运行所在的命名空间、备份等数据存放的命名空间、Velero 使用的 ServiceAccount 及其 RBAC 权限。

如需在自定义命名空间中运行,必须在应用前修改各 YAML 文件中的命名空间。参考 site/content/docs/v0.11.0/namespace.md:对 IBM 场景,需要编辑config/ibm/05-backupstoragelocation.yamlconfig/ibm/10-deployment.yaml中的命名空间;同时自定义命名空间下也需要创建cloud-credentialsSecret。另外还可以通过客户端命令固定后续所有 CLI 操作的命名空间:

velero client config set namespace=<NAMESPACE_VALUE>

5.2 创建凭据 Secret

在刚才创建credentials-velero文件的目录下执行:

kubectl create secret generic cloud-credentials \ --namespace <VELERO_NAMESPACE> \ --from-file cloud=credentials-velero

这里--from-file cloud=credentials-velero会把本地文件内容以名为cloud的 key 存入 Secret。Velero 服务端将挂载该 Secret 并从中读取 S3 兼容凭据,用于向 COS 发起签名请求。

第六步:配置 BackupStorageLocation

6.1 编辑config/ibm/05-backupstoragelocation.yaml

在该文件中替换以下三个占位符:

  • <YOUR_BUCKET>:COS 桶名;
  • <YOUR_REGION>:COS 桶所在区域;
  • <YOUR_URL_ACCESS_POINT>:COS 的访问端点(endpoint),形如s3.us-south.cloud-object-storage.appdomain.cloud

从 site/content/docs/v0.11.0/api-types/backupstoragelocation.md 的 AWS(或其它 S3 兼容存储)配置说明可知,S3 兼容存储的config中常用以下键:

Key类型默认值含义
regionstring桶所在区域,如us-east-1;若未提供会尝试从 S3 API 查询。对 IBM COS 应填写桶实际所在区域。
s3ForcePathStyleboolfalse是否强制使用路径风格(path-style)访问,如endpoint/bucket/...。使用 MinIO 等本地/非 AWS 托管存储时设为true;IBM COS 通常也建议开启。
s3Urlstring非 AWS 托管存储必填COS 等非 AWS 存储的访问端点地址。对 IBM COS 场景,此字段用于填入<YOUR_URL_ACCESS_POINT>
publicUrlstring指定时,生成下载链接(如日志下载)时优先使用它而不是s3Url
signatureVersionstring"4"签名算法版本,可选"1""4";通常默认的版本 4 即可。

对应的 YAML 形态如下:

apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: default namespace: velero spec: provider: aws objectStorage: bucket: <YOUR_BUCKET> config: region: <YOUR_REGION> s3Url: <YOUR_URL_ACCESS_POINT> s3ForcePathStyle: "true"

注意:provideraws并非表示数据存储在 AWS,而是表示使用 Velero 内置的 AWS S3 兼容对象存储实现来访问 COS——这正是 IBM COS 兼容 S3 API 带来的便利。

6.2 从类型定义理解 BSL 结构

在 pkg/apis/velero/v1/backupstoragelocation_types.go 中,BackupStorageLocationSpec的核心字段包括:

  • provider:存储提供方名称(S3 兼容场景下为aws);
  • objectStorageObjectStorageLocation,其中bucket必填、prefix可选(桶内子目录);
  • configmap[string]string,承载 provider 相关的配置键值对——即上文表格中的regions3Urls3ForcePathStyle等;
  • accessModeReadOnlyReadWrite,定义对该位置可执行的操作权限。

当前仓库的 tilt-resources/examples/velero_v1_backupstoragelocation.yaml 给出了一个完整的 S3 兼容存储示例(此处指向 MinIO),结构与 IBM COS 场景完全一致,可作为编写 COS BSL 的参照:

apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: default namespace: velero spec: config: region: minio s3ForcePathStyle: "true" s3Url: http://minio.velero.svc:9000 objectStorage: bucket: velero provider: aws

s3Url换成你的 COS 访问端点、bucket换成 COS 桶名、region换成 COS 区域,即可复用到 IBM 场景。

6.3 (可选)运行 nginx 示例应用

如果后续要跑 nginx 示例验证备份,需要编辑config/nginx-app/with-pv.yaml,将<YOUR_STORAGE_CLASS_NAME>替换为你集群中的StorageClass名称。当前仓库中的 examples/nginx-app/with-pv.yaml 提供了等价示例:该文件在 PVC 的spec.storageClassName处预留了storageClassName: <YOUR_STORAGE_CLASS_NAME>的注释占位,同时使用pre.hook.backup.velero.iopost.hook.backup.velero.io注解挂载了 fsfreeze 钩子,用于在备份时对/var/log/nginx卷执行冻结/解冻,保证文件系统一致性。若集群采用 AWS 默认存储类,可替换为gp2;IBM Cloud Kubernetes Service(IKS/ROKS)集群则需替换为平台提供的 StorageClass 名称(如ibmc-block-gold等,以实际集群为准)。

第七步:启动 Velero 服务端

在 Velero 目录根下依次执行:

kubectl apply -f config/ibm/05-backupstoragelocation.yaml kubectl apply -f config/ibm/10-deployment.yaml

第一个命令创建BackupStorageLocation资源,第二个命令部署 Velero 服务端(Deployment)。部署完成后,可通过以下方式确认状态:

kubectl -n velero get backupstoragelocations

当 BSL 的Phase变为Available(参见 pkg/apis/velero/v1/backupstoragelocation_types.go 中定义的BackupStorageLocationPhaseAvailable)时,表示 Velero 可以正常读写该 COS 桶,随后即可创建 Backup 将集群资源与数据备份到 IBM COS。

常见问题与排障要点

  • 凭据中没有cos_hmac_keys:创建服务凭据时漏掉了{"HMAC":true}参数,导致没有生成 access key / secret key,需重新创建凭据。
  • 备份上传 403/签名错误:通常是 HMAC 密钥填错,或凭据角色不是 Writer;请核对credentials-velero文件与 IBM 控制台中的cos_hmac_keys值。
  • 连接超时/端点错误:检查s3Url是否填写为 COS 的访问端点(URL access point)而非桶的域名拼接,并确认网络可以访问该端点;私有云或内网环境下还需确认防火墙与 DNS 可达性。
  • 自定义命名空间不生效:需同步修改00-prereqs.yaml05-backupstoragelocation.yaml10-deployment.yaml中的命名空间,并在目标命名空间创建cloud-credentialsSecret。

总结

IBM Cloud Object Storage 借助 S3 兼容 API 与 Velero 内置的 AWS 对象存储实现无缝对接,无需额外开发插件。整个配置的关键点集中在三处:以{"HMAC":true}生成 S3 签名所需的密钥、以[default]INI 格式构造credentials-velero并注入cloud-credentialsSecret、在BackupStorageLocation中正确填写 COS 的桶名、区域与访问端点。把握住这三个要点,即可在任意 Kubernetes 集群上把备份稳定地落到 IBM COS。

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询