在 AWS 上部署 Ark(Velero 前身)备份 Kubernetes:S3 存储桶、IAM 权限与云凭证配置完整指南
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
导读
本文以当前仓库中 Heptio Ark v0.7.0 的官方部署文档 aws-config.md 为骨架,完整讲解如何在 AWS 上部署 Ark(Velero 的前身),用于备份和迁移 Kubernetes 应用及其持久化卷。读完本文,你将掌握完整的四步部署路径:创建 S3 存储桶 → 创建并授权 IAM 用户 → 配置 Ark 服务器与云凭证 Secret → 启动服务器,并深入理解Config自定义资源中与 AWS/S3 兼容存储相关的全部参数含义。这些知识与今天 Velero 的BackupStorageLocation配置一脉相承,对理解 Velero 的 AWS 与 S3 兼容存储体系依然有直接价值。
部署前置条件
在 AWS 上运行 Ark,需要依次完成四件事:
- 创建 S3 存储桶(用于存放备份数据);
- 为 Ark 创建 AWS IAM 用户(授予 S3 与 EC2 快照所需权限);
- 配置 Ark 服务器(Config 自定义资源 + Deployment 环境变量);
- 为云凭证创建 Kubernetes Secret。
如果你的本地机器还没有安装aws命令行工具,请先按照 AWS 官方用户指南完成安装与配置。此外,本指南基于 Ark v0.7.0 时期的目录结构展开,其中 v0.7.0 相关文档位于 site/content/docs/v0.7.0/,整个 v0.7.0 版本的 Ark 概览可参考 v0.7.0 文档首页。
创建 S3 存储桶
Ark 需要一个对象存储桶来存放备份。使用aws s3api create-bucket创建,注意替换其中的<YOUR_BUCKET>与<YOUR_REGION>占位符:
aws s3api create-bucket \ --bucket <YOUR_BUCKET> \ --region <YOUR_REGION> \ --create-bucket-configuration LocationConstraint=<YOUR_REGION>注意:
us-east-1区域不支持LocationConstraint参数。如果区域是us-east-1,请省略存储桶配置参数,直接执行:
aws s3api create-bucket \ --bucket <YOUR_BUCKET> \ --region us-east-1创建 IAM 用户并授权
Ark 服务器进程需要访问 S3(读写备份文件)与 EC2(创建/恢复卷快照)的权限,因此需要创建一个专用的 IAM 用户(文档中命名为heptio-ark)而不是使用根账号或过于宽泛的凭证。
1. 创建 IAM 用户
aws iam create-user --user-name heptio-ark2. 附加策略授予必要权限
将 AWS 托管策略AmazonS3FullAccess与AmazonEC2FullAccess附加给该用户:
aws iam attach-user-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess \ --user-name heptio-ark aws iam attach-user-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess \ --user-name heptio-ark其中AmazonS3FullAccess负责备份数据的上传与读取,AmazonEC2FullAccess负责持久化卷快照的创建与回滚。在实际生产环境中,通常建议进一步收敛为最小权限的自定义策略(例如仅允许指定桶的s3:PutObject/s3:GetObject以及指定卷的快照操作),但 v0.7.0 文档采用 AWS 托管策略以保证开箱即用。
3. 创建访问密钥
aws iam create-access-key --user-name heptio-ark返回结果形如:
{ "AccessKey": { "UserName": "heptio-ark", "Status": "Active", "CreateDate": "2017-07-31T22:24:41.576Z", "SecretAccessKey": <AWS_SECRET_ACCESS_KEY>, "AccessKeyId": <AWS_ACCESS_KEY_ID> } }请务必妥善保管输出的AccessKeyId与SecretAccessKey,它们只在创建时展示一次。
4. 生成本地凭证文件
在本地目录创建 Ark 专用凭证文件credentials-ark:
[default] aws_access_key_id=<AWS_ACCESS_KEY_ID> aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>其中<AWS_ACCESS_KEY_ID>与<AWS_SECRET_ACCESS_KEY>来自上一步create-access-key的返回值。该文件采用 AWS 共享凭证文件的标准 INI 格式,字段名与 AWS CLI 使用的凭证文件完全一致。
凭证与配置
第一步:创建命名空间、RBAC 等基础资源
在 Ark 根目录下,先应用预置文件以创建自定义资源定义(CRD)、命名空间、服务账号与 RBAC 规则:
kubectl apply -f examples/common/00-prereqs.yaml关于00-prereqs.yaml具体定义的内容(Ark 各类对象的 CRD、Ark 命名空间、服务账号与授权规则),可参考 v0.7.0 文档 namespace.md。如果要在自定义命名空间中运行,需要先编辑相关 YAML 文件指定命名空间(详见下文「在自定义命名空间中运行」小节)。
需要说明的是,当前仓库的
examples/目录结构已随 Velero 版本演进做了重组:v0.7.0 时代的examples/common/00-prereqs.yaml、examples/aws/00-ark-config.yaml已不再保留,现仓库保留了examples/minio/00-minio-deployment.yaml(本地 S3 兼容存储)与examples/nginx-app/(示例应用)。因此在现代版本中请以 examples/minio/00-minio-deployment.yaml 与 examples/nginx-app/with-pv.yaml 为参照;而本节以下命令为 v0.7.0 文档的原始步骤,适用于 checkout 该版本源码的场景。
第二步:创建云凭证 Secret
在刚才创建凭证文件的目录中执行:
kubectl create secret generic cloud-credentials \ --namespace <ARK_NAMESPACE> \ --from-file cloud=credentials-ark这里的关键点:
--from-file cloud=credentials-ark将本地文件内容以 key 为cloud的形式写入 Secret;<ARK_NAMESPACE>需替换为 Ark 所在命名空间(默认heptio-ark);- 该 Secret 随后会被挂载进 Ark 服务器 Pod,供 AWS SDK 读取。
第三步:修改示例文件中的占位符
需要修改三处示例文件:
1.examples/aws/00-ark-config.yaml
将<YOUR_BUCKET>与<YOUR_REGION>替换为实际值。该文件对应 Ark 的Config自定义资源,其中 AWS 相关参数的完整定义见 config-definition.md。
2.examples/common/10-deployment.yaml
确认spec.template.spec.containers[*].env.name为AWS_SHARED_CREDENTIALS_FILE。Ark 服务器容器通过该环境变量告诉 AWS SDK 凭证文件(即挂载的cloudSecret 内容)所在路径,这是 Ark 在 AWS 上正确读取credentials-ark凭证的机制核心。
3.(可选)examples/nginx-app/with-pv.yaml
如果运行 nginx 示例,将<YOUR_STORAGE_CLASS_NAME>替换为gp2,这是 AWS 默认的StorageClass名称。该文件在现仓库中的版本可见 examples/nginx-app/with-pv.yaml,其中同时演示了通过pre.hook.backup.velero.io/post.hook.backup.velero.io注解在备份前后执行fsfreeze冻结/解冻文件系统的用法,保证卷内数据一致性。
启动 Ark 服务器
在 Ark 根目录依次执行:
kubectl apply -f examples/aws/00-ark-config.yaml kubectl apply -f examples/common/10-deployment.yamlArk 服务器以 Kubernetes Deployment 形式运行。根据 config-definition.md 的说明,服务器首次部署后会等待名为default的Config对象出现在heptio-ark命名空间;如果后续修改了defaultConfig,服务器会优雅关闭,待 kubelet 重启 Pod 后使用新配置。启动完成后即可使用ark命令行客户端执行备份与恢复(ark backup create、ark restore create),完整的端到端验证流程(含带 PV 的快照备份与灾难恢复演练)见 cloud-common.md。
深入理解:Config 中的 AWS/S3 兼容存储参数
AWS 配置的灵魂在 Ark 的Config自定义资源中。一个完整的 AWS 配置示例如下:
apiVersion: ark.heptio.com/v1 kind: Config metadata: namespace: heptio-ark name: default persistentVolumeProvider: name: aws config: region: us-west-2 backupStorageProvider: name: aws bucket: ark config: region: us-west-2 backupSyncPeriod: 60m gcSyncPeriod: 60m scheduleSyncPeriod: 1m restoreOnlyMode: false主配置参数
| Key | 类型 | 默认值 | 含义 |
|---|---|---|---|
persistentVolumeProvider | CloudProviderConfig | None(可选) | 集群持久化卷所用云厂商的配置(用于快照)。不设置时,请求 PV 快照的备份/恢复将被视为无效。 |
persistentVolumeProvider/name | String | None(可选) | 持久化卷云厂商名称。Ark 原生支持aws、gcp、azure,其他厂商可经外部插件提供。 |
persistentVolumeProvider/config | map[string]string | None(可选) | 传递给云厂商的持久化卷配置键值对,AWS 仅需region。 |
backupStorageProvider | CloudProviderConfig | 必填 | 实际存放备份文件的云厂商配置。 |
backupStorageProvider/name | String | 必填 | 备份存储云厂商名称(aws/gcp/azure或插件)。 |
backupStorageProvider/bucket | String | 必填 | 备份上传的目标存储桶。 |
backupStorageProvider/config | map[string]string | None(可选) | 传递给备份存储云厂商的配置键值对。 |
backupSyncPeriod | metav1.Duration | 60m0s | Ark 查询对象存储以同步 Backup 资源对象的频率。 |
gcSyncPeriod | metav1.Duration | 60m0s | Ark 查询对象存储以删除已超过 TTL 的备份文件的频率。 |
scheduleSyncPeriod | metav1.Duration | 1m0s | Ark 检查 Schedule 资源以判断是否需要触发备份的频率。 |
restoreOnlyMode | bool | false | 开启后,备份、调度与过期备份删除功能全部关闭,仅从对象存储中的既有备份执行恢复。 |
backupStorageProvider/config(AWS 或 S3 兼容存储)
| Key | 类型 | 默认值 | 含义 |
|---|---|---|---|
region | string | 必填 | 存储桶所在区域,例如us-east-1。 |
s3ForcePathStyle | bool | false | 使用 Minio 等本地存储服务时设为true。 |
s3Url | string | 非 AWS 托管存储时必填 | 例如http://minio:9000。AWS S3 场景可省略(Ark 可根据region、bucket自动生成 URL),此字段主要面向 Minio 等本地服务。 |
kmsKeyId | string | 空 | 指定 AWS KMS 密钥 ID 或别名(如alias/<KMS-Key-Alias-Name>)以启用 S3 备份加密;仅适用于 AWS S3,可能需要显式授予密钥使用权限。 |
persistentVolumeProvider/config(仅 AWS)
| Key | 类型 | 默认值 | 含义 |
|---|---|---|---|
region | string | 必填 | PV 快照所在区域,例如us-east-1。 |
上述s3ForcePathStyle与s3Url两个参数是 Ark 支持“非 AWS 的 S3 兼容对象存储”的关键:在现仓库中,本地快速体验方案正是利用这一点,通过 examples/minio/00-minio-deployment.yaml 在集群内起一个 Minio,再在配置中指向http://minio:9000并开启 path-style 访问,从而在完全离线的环境下走通 Ark/Velero 的备份恢复全流程。
在自定义命名空间中运行
Ark v0.7.0 起支持在任意命名空间运行,操作分两步:
编辑示例文件指定命名空间:编辑
examples/common/00-prereqs.yaml(定义 CRD、Ark 命名空间、服务账号与 RBAC);AWS 场景还需编辑examples/aws/00-ark-config.yaml与examples/common/10-deployment.yaml。各云厂商需要修改的文件清单详见 namespace.md。客户端命令指定命名空间:执行
ark client config set namespace=<NAMESPACE_VALUE>即可让所有
ark客户端命令指向自定义命名空间,例如ark backup create、ark restore create、ark restore get、ark restore describe都会自动带上该命名空间。
部署后的端到端验证(带 PV 快照场景)
服务器启动成功后,可以用带持久化卷的 nginx 示例验证 AWS 场景下“备份 → 灾难 → 恢复”的完整链路:
# 1. 启动带 PV 的示例应用 kubectl apply -f examples/nginx-app/with-pv.yaml # 2. 创建备份(包含 PV 快照) ark backup create nginx-backup --include-namespaces nginx-example # 3. 模拟灾难:删除命名空间 kubectl delete namespaces nginx-example由于动态制备 PV 的默认回收策略是 Delete,删除命名空间会触发云厂商异步删除底层磁盘,务必先确认 AWS 侧磁盘已被删除,再执行恢复。
# 4. 从备份恢复 ark restore create nginx-backup执行ark restore get可观察恢复状态:进行中为InProgress,成功后为Completed且WARNINGS、ERRORS均为 0;如有告警或错误,可用ark restore describe <RESTORE_NAME>查看细节。完整的无 PV / 有 PV 两套演练流程见 cloud-common.md。
小结
在 AWS 上部署 Ark(Velero 前身)的关键路径清晰且可复现:S3 存储桶提供备份数据的持久化载体,IAM 用户隔离 Ark 对 S3 与 EC2 的访问权限,credentials-ark凭证文件 + Kubernetes Secret +AWS_SHARED_CREDENTIALS_FILE环境变量完成服务器侧的云身份注入,而Config自定义资源中的backupStorageProvider/persistentVolumeProvider及其 AWS 参数(region、s3ForcePathStyle、s3Url、kmsKeyId)决定了备份的存放与快照行为。这套设计奠定了 Velero 后续版本对象存储与快照体系的基石——理解它,也就理解了现代 Velero 在 AWS 与各类 S3 兼容存储上配置的来龙去脉。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考