在 AWS 上部署配置 Heptio Ark(Velero):S3 存储桶、IAM 权限与 kube2iam 完整指南
2026/9/17 6:54:53 网站建设 项目流程

在 AWS 上部署配置 Heptio Ark(Velero):S3 存储桶、IAM 权限与 kube2iam 完整指南

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

本文基于仓库 site/content/docs/v0.9.0/aws-config.md 编写。该文档出自项目 v0.9.0 时代——当时项目还名为Heptio Ark(后更名为 Velero),因此文中命令、命名空间、CRD 版本均沿用当时的ark/heptio-ark/ark.heptio.com/v1约定。文章将完整继承原文档的 S3 存储桶创建、IAM 用户与权限策略、云凭证 Secret、服务端启动以及 kube2iam 备选方案等全部实操步骤,并结合仓库源码与当前目录中的配置示例做纵深补充。

本篇技术指南讲解的是:在 AWS 上为 Heptio Ark(Velero 前身)准备对象存储(S3)、IAM 权限、云凭证并启动 Ark 服务端的完整流程。读者按本文操作后,将掌握 S3 存储桶与 IAM 策略的精确配置方法、Ark Config 自定义资源的 AWS 参数写法、cloud-credentialsSecret 的创建方式,以及基于 kube2iam 免 Access Key 的授权方案。

一、文档背景与适用前提

v0.9.0 版本的 Ark 以Config 自定义资源kind: Config,位于heptio-ark命名空间,名称为default)描述备份与云厂商配置,并依赖两块核心能力:

  • backupStorageProvider(备份存储提供者):负责把备份文件写入对象存储(本场景即 S3)。
  • persistentVolumeProvider(持久卷提供者):负责对集群中的持久卷做云厂商原生快照(本场景即 EC2 Snapshot)。

在动手之前需要满足以下前提:

  • 本地安装了kubectl,并已配置好可访问目标 Kubernetes 集群的kubeconfig
  • 本地安装了awsCLI(若未安装,请参考 AWS 官方 CLI 用户指南完成配置);
  • 目标集群已具备创建 CRD、ServiceAccount、RBAC 等资源的权限。

相关配套文档见:平台安装总览、Ark Config 定义详解、自定义命名空间运行。

二、创建 S3 存储桶

Ark 需要一个对象存储桶来存放备份。S3 存储桶名称需在整个 AWS 中全局唯一,因此请选择一个有辨识度的名称,并用--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

创建完成后,<YOUR_BUCKET><YOUR_REGION>两个值稍后要填入 Ark 的 Config 示例文件中。

三、创建 IAM 用户并授予权限

Ark 服务端运行在集群内,需要一组 AWS 凭证(Access Key)来读写 S3 备份对象、创建/删除 EC2 卷快照。官方推荐的做法是创建独立 IAM 用户heptio-ark,仅授予最小必要权限,而不是使用高权限的管理员凭证。

1. 创建 IAM 用户

aws iam create-user --user-name heptio-ark

2. 附加权限策略

将下面 JSON 写入heptio-ark-policy.json,然后通过put-user-policy附加到该用户。策略分为三个部分,职责非常清晰:

权限块涉及 Action用途
EC2 快照ec2:DescribeVolumesec2:DescribeSnapshotsec2:CreateTagsec2:CreateVolumeec2:CreateSnapshotec2:DeleteSnapshot支撑persistentVolumeProvider,对 EBS 卷做原生快照(备份)与从快照恢复(还原)
S3 对象读写s3:GetObjects3:DeleteObjects3:PutObjects3:AbortMultipartUploads3:ListMultipartUploadParts支撑backupStorageProvider,向桶内上传/读取/删除备份对象
S3 桶列举s3:ListBucket支撑备份同步与 GC(列举桶内备份文件)
BUCKET=<YOUR_BUCKET> cat > heptio-ark-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "ec2:DescribeSnapshots", "ec2:CreateTags", "ec2:CreateVolume", "ec2:CreateSnapshot", "ec2:DeleteSnapshot" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::${BUCKET}/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${BUCKET}" ] } ] } EOF aws iam put-user-policy \ --user-name heptio-ark \ --policy-name heptio-ark \ --policy-document file://heptio-ark-policy.json

3. 创建访问密钥

aws iam create-access-key --user-name heptio-ark

命令返回结果大致如下(请妥善保存AccessKeyIdSecretAccessKey,Secret 只在创建时完整返回一次):

{ "AccessKey": { "UserName": "heptio-ark", "Status": "Active", "CreateDate": "2017-07-31T22:24:41.576Z", "SecretAccessKey": <AWS_SECRET_ACCESS_KEY>, "AccessKeyId": <AWS_ACCESS_KEY_ID> } }

4. 生成本地凭证文件

在本地目录创建一个 Ark 专用的凭证文件credentials-ark(INI 格式,节名固定为default):

[default] aws_access_key_id=<AWS_ACCESS_KEY_ID> aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>

其中aws_access_key_idaws_secret_access_key即上一步create-access-key的返回值。这个文件稍后会被封装为 Kubernetes Secret 挂载给 Ark 服务端使用。

四、配置 Ark 服务端与云凭证 Secret

1. 初始化命名空间、RBAC 与 CRD

在 Ark 仓库根目录下,先应用预置文件,完成命名空间、CRD(backups、schedules、restores、configs、downloadrequests)、ServiceAccount 与 RBAC 规则的创建。若要在自定义命名空间运行,需先编辑这些 YAML 中的命名空间字段,详见 Run in custom namespace。

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

说明:examples/common/00-prereqs.yaml属于 v0.9.0 时期的示例文件,当前仓库根目录的 examples 目录已调整为以 Minio、nginx 应用为主的示例集,但流程语义一致:先就绪 CRD 与 RBAC,再部署服务端。

2. 创建云凭证 Secret

credentials-ark文件所在目录执行,将凭证封装为名为cloud-credentials的 Secret,并把文件内容挂到键cloud下:

kubectl create secret generic cloud-credentials \ --namespace <ARK_NAMESPACE> \ --from-file cloud=credentials-ark

默认场景下<ARK_NAMESPACE>heptio-ark;若按自定义命名空间运行,则必须改为对应命名空间,并确保 Secret 与 Ark 服务端同命名空间(详见 namespace.md)。

3. 修改 AWS 示例配置

需要按实际情况替换以下示例文件中的占位符:

  • examples/aws/00-ark-config.yaml:替换<YOUR_BUCKET><YOUR_REGION>。其中 S3 的region为可选项——如果不填,Ark 会从 AWS S3 API 自动查询;完整参数含义见 Config 定义文档。
  • (可选)nginx 带卷示例:若运行examples/nginx-app/with-pv.yaml,将其中的<YOUR_STORAGE_CLASS_NAME>替换为gp2——这是 AWS 默认的StorageClass名称。当前仓库仍保留该示例文件:with-pv.yaml。

4. 深入:Ark Config 的 AWS 相关参数

Ark 通过一个名为default的 Config 自定义资源(apiVersion: ark.heptio.com/v1)描述云厂商与备份设置,示例如下:

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

其中与本文场景直接相关的核心参数如下(详见 config-definition.md):

Key类型默认值含义
persistentVolumeProviderCloudProviderConfig可选(默认无)指定集群持久卷所属的云厂商(用于快照)。不配置时,请求 PV 快照/恢复的备份与恢复将被视为无效
persistentVolumeProvider/nameString可选云厂商名,Ark 原生支持awsgcpazure,其他厂商可经外部插件扩展
backupStorageProviderCloudProviderConfig必填指定实际存储备份文件的云厂商
backupStorageProvider/nameString必填同上,原生支持aws/gcp/azure
backupStorageProvider/bucketString必填备份上传的目标存储桶
backupSyncPeriodmetav1.Duration60m0sArk 查询对象存储、为已有备份文件补建 Backup 资源的频率
gcSyncPeriodmetav1.Duration60m0s清理已超过 TTL 的备份文件的频率
scheduleSyncPeriodmetav1.Duration1m0s检查 Schedule 资源、判断是否需要发起备份的频率
restoreOnlyModeboolfalse开启后仅允许从已有备份文件恢复,备份、调度与过期删除功能全部关闭

AWS(及其他 S3 兼容存储)专属配置

Key类型默认值含义
backupStorageProvider/config/regionstring例如us-east-1。若不提供,由 AWS S3 API 自动查询
backupStorageProvider/config/s3ForcePathStyleboolfalse使用本地 S3 兼容服务(如 Minio)时设为true
backupStorageProvider/config/s3Urlstring非 AWS 托管存储必填例如http://minio:9000。对 AWS S3 可省略(Ark 能根据regionbucket自动生成),主要用于 Minio 等本地存储
backupStorageProvider/config/kmsKeyIdstring例如502b409c-4da1-419f-a16e-eif453b3i49falias/<KMS-Key-Alias-Name>。指定 AWS KMS 密钥以对 S3 中的备份加密,仅适用于 AWS S3,且可能需要显式授予密钥使用权限
persistentVolumeProvider/config/regionstring必填例如us-east-1,指定持久卷快照所在区域

关于服务端对 Config 变化的处理:Ark 服务端以 Deployment 形式运行,一旦发现defaultConfig 被修改,会优雅退出,等待 kubelet 重启 Ark pod 后加载新配置生效。因此修改配置后无需手动滚动重启。

底层实现印证:备份文件之所以能写入任意对象存储,是因为仓库通过统一的ObjectStore接口抽象了 PutObject / GetObject / ListObjects / DeleteObject 等操作,接口定义见 pkg/persistence/object_store.go;而backupStorageProvider对应的云厂商实现则以插件形式接入,插件框架见 pkg/plugin/framework/object_store.go。这解释了为什么name: aws既承担存储、又承担卷快照两种职责,且 AWS 之外的其他 S3 兼容服务(如 Minio)可通过s3Url+s3ForcePathStyle直接复用同一套存储通道。

五、启动 Ark 服务端

在 Ark 仓库根目录依次应用两份 AWS 示例文件:

kubectl apply -f examples/aws/00-ark-config.yaml kubectl apply -f examples/aws/10-deployment.yaml
  • 00-ark-config.yaml创建上述defaultConfig(含 S3 桶与区域、云厂商名);
  • 10-deployment.yaml创建 Ark 服务端 Deployment,挂载cloud-credentialsSecret。

启动完成后,Ark 服务端即会在对象存储中初始化备份目录,并开始按scheduleSyncPeriod等周期执行调度。之后即可通过ark backup create .../ark restore create ...执行备份与恢复(完整演练可参考 平台安装总览 中的 nginx 示例流程)。

六、备选方案:基于 kube2iam 的 IAM 授权

默认方案需要把 Access Key 以 Secret 形式注入集群。如果集群已运行 kube2iam——一个通过 Pod 注解管理 AWS IAM 角色的 Kubernetes 应用——则可以完全不使用 API Key,改为"角色 + 注解"的方式授权。该路径的前提是 kube2iam 已在集群中正常运行,否则请先安装它。

整体思路:先创建一个具备所需权限的 IAM 角色(Trust Policy 允许 EC2 与 kube2iam 角色代为 AssumeRole),再给 Ark Deployment 加上iam.amazonaws.com/role注解,指定服务端内部应使用的角色。

1. 编写 Trust Policy

cat > heptio-ark-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_CREATED_WHEN_INITIALIZING_KUBE2IAM>" }, "Action": "sts:AssumeRole" } ] } EOF

其中<AWS_ACCOUNT_ID>为你的 AWS 账号 ID,<ROLE_CREATED_WHEN_INITIALIZING_KUBE2IAM>为初始化 kube2iam 时创建的角色名。

2. 创建 IAM 角色

aws iam create-role --role-name heptio-ark --assume-role-policy-document file://./heptio-ark-trust-policy.json

3. 给角色附加与用户方案相同的策略

策略内容与第三节完全一致(EC2 快照 + S3 对象读写 + 桶列举),区别仅在于用put-role-policy附加到角色而非用户:

BUCKET=<YOUR_BUCKET> cat > heptio-ark-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "ec2:DescribeSnapshots", "ec2:CreateTags", "ec2:CreateVolume", "ec2:CreateSnapshot", "ec2:DeleteSnapshot" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::${BUCKET}/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${BUCKET}" ] } ] } EOF aws iam put-role-policy \ --role-name heptio-ark \ --policy-name heptio-ark-policy \ --policy-document file://./heptio-ark-policy.json

4. 修改 kube2iam 专用 Deployment 文件

examples/aws/10-deployment-kube2iam.yaml中,将<AWS_ACCOUNT_ID>替换为实际账号 ID:

--- apiVersion: apps/v1beta1 kind: Deployment metadata: namespace: heptio-ark name: ark spec: replicas: 1 template: metadata: labels: component: ark annotations: iam.amazonaws.com/role: arn:aws:iam::<AWS_ACCOUNT_ID>:role/heptio-ark ...

iam.amazonaws.com/role注解会被 kube2iam 拦截,在为 Pod 注入凭证时自动换取heptio-ark角色的临时凭证。

5. 用 kube2iam 版清单启动服务端

kubectl apply -f examples/aws/10-deployment-kube2iam.yaml

该方案省去了 Access Key 的创建、下发与轮换,凭证以临时 STS 凭证形式提供,安全性更好,是生产环境常用的做法。

七、验证与本地替代实践

启动完成后可通过以下方式快速验证配置是否生效:

  • 查看 Ark 服务端日志,确认已成功连接 S3 桶(日志中不应出现鉴权失败或AccessDenied);
  • 执行一次带卷快照的备份(如ark backup create nginx-backup --include-namespaces nginx-example),随后在 AWS 控制台确认桶内出现备份对象、EC2 控制台出现对应快照;
  • 若使用本地 S3 兼容存储(如 Minio)验证,可将backupStorageProvider/config设置为s3ForcePathStyle: trues3Url: http://minio:9000,对应示例见 examples/minio/00-minio-deployment.yaml,存储桶则使用 Minio 自带的管理接口创建。

最后需要特别说明:本文对应的是 v0.9.0 时代的 Heptio Ark 文档(使用ark命令与ark.heptio.com/v1Config)。项目随后更名为 Velero,当前仓库根目录的 examples 目录也以 Minio 与 nginx 应用示例为主,更完整的现行配置说明请以仓库 site/content/docs 下对应版本目录为准。理解 v0.9.0 的 S3 + IAM + 凭证链路,仍是掌握 Velero 在 AWS 上运行原理(对象存储抽象、卷快照与存储双通道、免密钥授权)最直接的入口。

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

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

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

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

立即咨询