在 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-ark2. 附加权限策略
将下面 JSON 写入heptio-ark-policy.json,然后通过put-user-policy附加到该用户。策略分为三个部分,职责非常清晰:
| 权限块 | 涉及 Action | 用途 |
|---|---|---|
| EC2 快照 | ec2:DescribeVolumes、ec2:DescribeSnapshots、ec2:CreateTags、ec2:CreateVolume、ec2:CreateSnapshot、ec2:DeleteSnapshot | 支撑persistentVolumeProvider,对 EBS 卷做原生快照(备份)与从快照恢复(还原) |
| S3 对象读写 | s3:GetObject、s3:DeleteObject、s3:PutObject、s3:AbortMultipartUpload、s3: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.json3. 创建访问密钥
aws iam create-access-key --user-name heptio-ark命令返回结果大致如下(请妥善保存AccessKeyId与SecretAccessKey,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_id与aws_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 | 类型 | 默认值 | 含义 |
|---|---|---|---|
persistentVolumeProvider | CloudProviderConfig | 可选(默认无) | 指定集群持久卷所属的云厂商(用于快照)。不配置时,请求 PV 快照/恢复的备份与恢复将被视为无效 |
persistentVolumeProvider/name | String | 可选 | 云厂商名,Ark 原生支持aws、gcp、azure,其他厂商可经外部插件扩展 |
backupStorageProvider | CloudProviderConfig | 必填 | 指定实际存储备份文件的云厂商 |
backupStorageProvider/name | String | 必填 | 同上,原生支持aws/gcp/azure |
backupStorageProvider/bucket | String | 必填 | 备份上传的目标存储桶 |
backupSyncPeriod | metav1.Duration | 60m0s | Ark 查询对象存储、为已有备份文件补建 Backup 资源的频率 |
gcSyncPeriod | metav1.Duration | 60m0s | 清理已超过 TTL 的备份文件的频率 |
scheduleSyncPeriod | metav1.Duration | 1m0s | 检查 Schedule 资源、判断是否需要发起备份的频率 |
restoreOnlyMode | bool | false | 开启后仅允许从已有备份文件恢复,备份、调度与过期删除功能全部关闭 |
AWS(及其他 S3 兼容存储)专属配置:
| Key | 类型 | 默认值 | 含义 |
|---|---|---|---|
backupStorageProvider/config/region | string | 空 | 例如us-east-1。若不提供,由 AWS S3 API 自动查询 |
backupStorageProvider/config/s3ForcePathStyle | bool | false | 使用本地 S3 兼容服务(如 Minio)时设为true |
backupStorageProvider/config/s3Url | string | 非 AWS 托管存储必填 | 例如http://minio:9000。对 AWS S3 可省略(Ark 能根据region与bucket自动生成),主要用于 Minio 等本地存储 |
backupStorageProvider/config/kmsKeyId | string | 空 | 例如502b409c-4da1-419f-a16e-eif453b3i49f或alias/<KMS-Key-Alias-Name>。指定 AWS KMS 密钥以对 S3 中的备份加密,仅适用于 AWS S3,且可能需要显式授予密钥使用权限 |
persistentVolumeProvider/config/region | string | 必填 | 例如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.yaml00-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.json3. 给角色附加与用户方案相同的策略
策略内容与第三节完全一致(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.json4. 修改 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: true与s3Url: 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),仅供参考