在 AWS 上部署配置 Heptio Ark(Velero):S3 存储桶、IAM 权限与 kube2iam 完整指南
在 AWS 上部署配置 Heptio ArkVeleroS3 存储桶、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 ArkVelero 前身准备对象存储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 LocationConstraintYOUR_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列举桶内备份文件BUCKETYOUR_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与SecretAccessKeySecret 只在创建时完整返回一次{ 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-arkINI 格式节名固定为default[default] aws_access_key_idAWS_ACCESS_KEY_ID aws_secret_access_keyAWS_SECRET_ACCESS_KEY其中aws_access_key_id与aws_secret_access_key即上一步create-access-key的返回值。这个文件稍后会被封装为 Kubernetes Secret 挂载给 Ark 服务端使用。四、配置 Ark 服务端与云凭证 Secret1. 初始化命名空间、RBAC 与 CRD在 Ark 仓库根目录下先应用预置文件完成命名空间、CRDbackups、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 cloudcredentials-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.mdKey类型默认值含义persistentVolumeProviderCloudProviderConfig可选默认无指定集群持久卷所属的云厂商用于快照。不配置时请求 PV 快照/恢复的备份与恢复将被视为无效persistentVolumeProvider/nameString可选云厂商名Ark 原生支持aws、gcp、azure其他厂商可经外部插件扩展backupStorageProviderCloudProviderConfig必填指定实际存储备份文件的云厂商backupStorageProvider/nameString必填同上原生支持aws/gcp/azurebackupStorageProvider/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时设为truebackupStorageProvider/config/s3Urlstring非 AWS 托管存储必填例如http://minio:9000。对 AWS S3 可省略Ark 能根据region与bucket自动生成主要用于 Minio 等本地存储backupStorageProvider/config/kmsKeyIdstring空例如502b409c-4da1-419f-a16e-eif453b3i49f或alias/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可通过s3Urls3ForcePathStyle直接复用同一套存储通道。五、启动 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 Policycat 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 账号 IDROLE_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附加到角色而非用户BUCKETYOUR_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),仅供参考