使用 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 兼容)对象存储插件。
整套配置流程分为五个阶段,这也是本文的组织脉络:
- 下载 Velero 官方发行版(包含
veleroCLI 与配套的示例 YAML); - 创建 COS 实例(resource instance);
- 在 COS 中创建 S3 桶(bucket);
- 创建具备写入权限、携带 HMAC 密钥的服务凭据(service credentials);
- 配置 Velero 服务端(命名空间、RBAC、Secret、BackupStorageLocation)并启动。
注意:本文涉及的
config/ibm/等示例 YAML 路径来自 Velero 官方 release 发行版 tarball。当前仓库中的示例文件结构有所不同(见 examples/nginx-app/with-pv.yaml 等),下文会同时给出当前仓库可参考的等价示例。
第一步:下载并解压 Velero 官方发行版
从 Velero 官方 releases 页面下载适配你客户端平台的最新发行版 tarball。
解压 tarball:
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz -C /dir/to/extract/to下文将该解压目录统称为“Velero 目录”。
将
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_idsecret_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.yaml00-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.yaml与config/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 | 类型 | 默认值 | 含义 |
|---|---|---|---|
region | string | 空 | 桶所在区域,如us-east-1;若未提供会尝试从 S3 API 查询。对 IBM COS 应填写桶实际所在区域。 |
s3ForcePathStyle | bool | false | 是否强制使用路径风格(path-style)访问,如endpoint/bucket/...。使用 MinIO 等本地/非 AWS 托管存储时设为true;IBM COS 通常也建议开启。 |
s3Url | string | 非 AWS 托管存储必填 | COS 等非 AWS 存储的访问端点地址。对 IBM COS 场景,此字段用于填入<YOUR_URL_ACCESS_POINT>。 |
publicUrl | string | 空 | 指定时,生成下载链接(如日志下载)时优先使用它而不是s3Url。 |
signatureVersion | string | "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"注意:provider填aws并非表示数据存储在 AWS,而是表示使用 Velero 内置的 AWS S3 兼容对象存储实现来访问 COS——这正是 IBM COS 兼容 S3 API 带来的便利。
6.2 从类型定义理解 BSL 结构
在 pkg/apis/velero/v1/backupstoragelocation_types.go 中,BackupStorageLocationSpec的核心字段包括:
provider:存储提供方名称(S3 兼容场景下为aws);objectStorage:ObjectStorageLocation,其中bucket必填、prefix可选(桶内子目录);config:map[string]string,承载 provider 相关的配置键值对——即上文表格中的region、s3Url、s3ForcePathStyle等;accessMode:ReadOnly或ReadWrite,定义对该位置可执行的操作权限。
当前仓库的 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.io与post.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.yaml、05-backupstoragelocation.yaml、10-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),仅供参考