S3 Files vs S3 File Gateway vs Mountpoint CSI 实测:三种 S3 挂载方案全面对比¶
Lab 信息
- 难度: ⭐⭐ 中级
- 预估时间: 60 分钟
- 预估费用: $3-5(S3 Files 测试 < $1 + File Gateway m5.xlarge ~$0.19/h × 1h + 150GB gp3)
- Region: us-east-1
- 最后验证: 2026-04-08
背景¶
将 S3 桶挂载为文件系统一直是许多应用的刚需——传统应用无法直接调用对象存储 API,但又想利用 S3 的无限扩展性和低成本。
AWS 目前提供了三种主要的 S3 挂载方案:
- S3 Files(2026 年 4 月 GA)——S3 原生文件系统能力,基于 EFS 构建,NFS 协议,零额外基础设施
- S3 File Gateway(2018 年)——Storage Gateway 系列,需要独立 EC2 网关设备,NFS/SMB 协议
- Mountpoint for Amazon S3 CSI Driver——基于 FUSE 的用户态文件系统,主要面向 EKS/Kubernetes 场景
三种方案的架构理念完全不同,适用场景也各有侧重。本文通过实测数据和文档分析,给出完整的三方对比和选型建议。
前置条件¶
- AWS 账号(需要 S3、EC2、Storage Gateway、IAM 权限)
- AWS CLI v2.34.26+(S3 Files 需要
aws s3files子命令) - 同一 VPC、同一 AZ 的测试环境(消除网络变量)
核心概念¶
三方架构对比¶
| 维度 | S3 Files | S3 File Gateway | Mountpoint CSI |
|---|---|---|---|
| 底层技术 | Amazon EFS(内核级 NFS) | Storage Gateway AMI(虚拟设备) | FUSE(用户态文件系统) |
| 架构 | S3 原生 → Mount Target → NFS | EC2 Gateway → NFS/SMB → S3 | Pod → FUSE mount → S3 API |
| 缓存层 | 高性能存储层(托管) | EC2 本地 EBS(自管理) | 无持久缓存 |
| 协议 | NFS v4.1/4.2 | NFS v3/v4.1 + SMB v2/v3 | FUSE(非标准网络协议) |
| 写入模型 | 完整读写,~60s 批量写回 S3 | 完整读写,~1s 写回 S3 | 仅新建文件顺序写(不可修改已有文件) |
| 删除支持 | ✅ 原生支持 | ✅ 原生支持 | 默认禁止,需 --allow-delete 启动参数 |
| 重命名 | ✅ 支持 | ✅ 支持 | ❌ 通用桶不支持(仅 Express One Zone) |
| 同步方向 | 双向自动 | 写→S3 自动,S3→NFS 需手动 | 无同步概念(直接 S3 API) |
| 额外基础设施 | 无 | m5.xlarge EC2 + 150GB+ EBS | CSI Driver DaemonSet |
| 部署步骤 | 3 步 | 13 步 | kubectl apply(EKS Add-on) |
| POSIX 权限 | ✅ 完整(chmod/chown → S3 元数据) | ✅ 完整(chmod/chown → S3 元数据) | ❌ 不模拟 |
| 文件锁 | ✅ NFS 锁 | ✅ NFS 锁 | ❌ 不支持 |
| 多客户端共享写 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 适用计算服务 | EC2, Lambda, EKS, ECS | EC2(仅限) | EKS, 自管理 K8s |
| 发布时间 | 2026 年 4 月(GA) | 2018 年(成熟服务) | 2023 年(GA) |
读路由差异¶
S3 Files 有智能读路由:
- 小文件(< 128KB)从高性能存储层读
- 大文件(≥ 1MB)直接从 S3 流式读
- 刚修改未同步的数据从文件系统读
File Gateway 的读路由更简单:
- 所有读操作优先走本地 EBS 缓存
- 缓存未命中时从 S3 拉取到缓存再返回
- 缓存空间有限(150GB-64TiB),满了会淘汰
Mountpoint CSI 直接走 S3 API:
- 每次读都是 S3 GET 请求(无本地缓存层)
- 顺序读时自动多并发预取,优化大文件吞吐
- 随机读也支持,但每次都是网络往返
Mountpoint CSI 写入限制详解¶
Mountpoint CSI 的写入模型与传统文件系统差异很大,理解这些限制对选型至关重要:
| 操作 | S3 Files / File Gateway | Mountpoint CSI |
|---|---|---|
| 创建新文件 | ✅ | ✅ |
| 修改已有文件 | ✅ | ❌(需 O_TRUNC 重写整个文件) |
| 追加写入 | ✅ | ❌(仅 Express One Zone 支持 --incremental-upload) |
| 删除文件 | ✅ | 需 --allow-delete 启动参数 |
| 重命名文件 | ✅ | ❌(仅 Express One Zone) |
fsync 后继续写 |
✅ | ❌(fsync 后文件关闭写入) |
Mountpoint CSI 的核心定位
Mountpoint 官方明确声明:不追求完整 POSIX 语义。它的设计哲学是"无法在 S3 API 上高效实现的文件操作,一律不支持"。如果你的应用需要随机写入、文件锁、或完整 POSIX 权限,Mountpoint 不是正确的选择。
动手实践¶
Step 1: 准备 File Gateway 环境¶
S3 Files 的部署已在 S3 Files 实测文章 中详细记录,这里聚焦 File Gateway 的部署过程。
创建 S3 桶(两个方案各用独立桶,消除干扰):
# File Gateway 测试桶
aws s3api create-bucket \
--bucket fgw-test-20260408-36429 \
--region us-east-1
aws s3api put-bucket-versioning \
--bucket fgw-test-20260408-36429 \
--versioning-configuration Status=Enabled \
--region us-east-1
创建 File Gateway IAM 角色:
# Trust policy: storagegateway.amazonaws.com
aws iam create-role \
--role-name FGWFileShareRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "storagegateway.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
踩坑:版本化桶需要额外 IAM 权限
如果 S3 桶启用了版本控制(File Gateway 推荐),IAM 角色必须包含 s3:GetObjectVersion、s3:DeleteObjectVersion、s3:ListBucketVersions 权限。否则通过 S3 API 上传的文件在 NFS 端读取会返回 Input/output error。
{
"Effect": "Allow",
"Action": [
"s3:GetObject", "s3:GetObjectVersion",
"s3:PutObject", "s3:DeleteObject", "s3:DeleteObjectVersion",
"s3:ListBucket", "s3:ListBucketVersions",
"s3:GetBucketLocation", "s3:GetBucketVersioning",
"s3:AbortMultipartUpload", "s3:ListMultipartUploadParts"
],
"Resource": ["arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/*"]
}
Step 2: 部署 File Gateway EC2¶
# 查找最新 File Gateway AMI
aws ec2 describe-images --owners amazon \
--filters "Name=name,Values=*-FILE_S3*" \
--query "Images | sort_by(@, &CreationDate) | [-1].{Name:Name,Id:ImageId}" \
--region us-east-1
# 结果: ami-0e65bd9d85c75e631 (aws-storage-gateway-FILE_S3-2.1.4)
# 启动 File Gateway EC2 (m5.xlarge + 150GB 缓存 EBS)
aws ec2 run-instances \
--image-id ami-0e65bd9d85c75e631 \
--instance-type m5.xlarge \
--subnet-id subnet-0ff81ae4d8f7aa00b \
--security-group-ids sg-07a78a8029e6fdb59 \
--block-device-mappings '[{
"DeviceName": "/dev/xvdf",
"Ebs": {"VolumeSize": 150, "VolumeType": "gp3", "DeleteOnTermination": true}
}]' \
--region us-east-1
安全组配置
File Gateway EC2 安全组需要:
- 入站 TCP 80(HTTP)← 客户端 SG(仅用于激活,激活后可删除)
- 入站 TCP 2049(NFS)← 客户端 SG
- 绝不开放 0.0.0.0/0 入站
Step 3: 激活 Gateway 并创建 NFS 共享¶
# 从客户端 EC2 获取激活密钥(需等 Gateway 启动 2-3 分钟)
curl "http://172.31.13.45/?gatewayType=FILE_S3&activationRegion=us-east-1&no_redirect"
# 返回: GGR7O-OJOHO-REP4R-9UIF9-5T6DR
# 激活 Gateway
aws storagegateway activate-gateway \
--activation-key "GGR7O-OJOHO-REP4R-9UIF9-5T6DR" \
--gateway-name "fgw-gateway" \
--gateway-timezone "GMT" \
--gateway-region us-east-1 \
--gateway-type "FILE_S3" \
--region us-east-1
# 返回: gateway/sgw-EA485B83
# 等待 ~60s 后添加缓存磁盘
aws storagegateway list-local-disks \
--gateway-arn arn:aws:storagegateway:us-east-1:595842667825:gateway/sgw-EA485B83 \
--region us-east-1
aws storagegateway add-cache \
--gateway-arn arn:aws:storagegateway:us-east-1:595842667825:gateway/sgw-EA485B83 \
--disk-ids "/dev/nvme0n1" \
--region us-east-1
# 创建 NFS 文件共享
aws storagegateway create-nfs-file-share \
--client-token "fgw-share" \
--gateway-arn arn:aws:storagegateway:us-east-1:595842667825:gateway/sgw-EA485B83 \
--location-arn arn:aws:s3:::fgw-test-20260408-36429 \
--role arn:aws:iam::595842667825:role/FGWFileShareRole-36429 \
--default-storage-class S3_STANDARD \
--client-list '["172.31.0.0/16"]' \
--squash RootSquash \
--region us-east-1
踩坑:Gateway 激活后需等待连接
activate-gateway 成功后,Gateway 需要约 60 秒才能真正连接到 AWS 服务端。在此期间调用 list-local-disks 会返回 GatewayNotConnected 错误。
Step 4: 挂载并执行对比测试¶
# File Gateway 挂载
sudo mount -t nfs -o nolock,hard 172.31.13.45:/fgw-test-20260408-36429 /mnt/fgw
# S3 Files 挂载(在同一台 EC2 上对比)
sudo mount -t s3files fs-0d3cc3a5aa52b21fd:/ /mnt/s3files
写延迟测试:
# File Gateway: 写 1KB 文件
sudo dd if=/dev/urandom of=/mnt/fgw/small-1kb.bin bs=1024 count=1
# S3 Files: 写 1KB 文件
sudo dd if=/dev/urandom of=/mnt/s3files/small-1kb.bin bs=1024 count=1
读延迟测试:
# 清除 OS 页缓存
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
# File Gateway 小文件读
time cat /mnt/fgw/small-1kb.bin > /dev/null # 6ms (首次) / 2ms (缓存)
# S3 Files 小文件读
time cat /mnt/s3files/small-1kb.bin > /dev/null # 8-11ms (首次)
Step 5: 写回同步延迟对比¶
这是两个方案最显著的差异之一。
File Gateway:
# NFS 写文件
echo 'sync-test' | sudo tee /mnt/fgw/sync-test.txt
# 写入时间: 04:47:30
# 检查 S3
aws s3api head-object --bucket fgw-test-20260408-36429 --key sync-test.txt
# S3 出现时间: 04:47:31 → 延迟 ~1 秒
S3 Files:
# NFS 写文件
echo 'sync-test' | sudo tee /mnt/s3files/sync-test.txt
# 写入时间: 02:08:17
# 检查 S3
aws s3api head-object --bucket s3files-test-20260408-16287 --key sync-test.txt
# S3 出现时间: 02:09:19 → 延迟 62 秒
结论:File Gateway 写回 S3 延迟仅 ~1 秒,比 S3 Files 的 ~60 秒快了 60 倍。
Step 6: 反向同步对比¶
从 S3 API 上传文件,检查 NFS 端何时可见。
S3 Files:
# S3 API 上传
echo 'reverse' | aws s3 cp - s3://s3files-test-20260408-16287/reverse.txt
# NFS 端 ls → 数秒内自动可见(EventBridge 触发)
File Gateway:
# S3 API 上传
echo 'reverse' | aws s3 cp - s3://fgw-test-20260408-36429/reverse.txt
# NFS 端 ls → 不可见!
# 必须手动调用 RefreshCache
aws storagegateway refresh-cache \
--file-share-arn arn:aws:storagegateway:...:share/share-300D6F5B
# 等待 ~60-90 秒后 NFS 端才可见
Mountpoint CSI:
结论:S3 Files 反向同步自动且快速(数秒),File Gateway 需要手动 RefreshCache 且等待时间更长。Mountpoint 因无缓存层理论上最快,但受限于 S3 最终一致性。
测试结果¶
核心三方对比表¶
| # | 测试维度 | S3 Files | File Gateway | Mountpoint CSI |
|---|---|---|---|---|
| 1 | 部署复杂度 | 3 步 | 13 步 | kubectl apply(EKS Add-on) |
| 2 | 额外基础设施 | 无 | m5.xlarge + 150GB EBS | DaemonSet Pod |
| 3 | 小文件读延迟 (1KB) | 8-11ms | 6ms / 2ms 缓存 | ~10-20ms(每次 S3 GET)* |
| 4 | 大文件读延迟 (10MB) | 319ms 首次 / 6ms 缓存 | 58ms / 4-5ms 缓存 | 取决于 S3 吞吐* |
| 5 | 大文件顺序读吞吐 | 高(S3 直读) | 高(EBS 缓存 + S3) | 极高(多并发 S3 GET)* |
| 6 | 写回 S3 延迟 | ~62 秒 | ~1 秒 | 即时(close 后)* |
| 7 | 写入能力 | 完整读写 | 完整读写 | 仅新建文件顺序写 |
| 8 | 反向同步 | 数秒(自动) | 需 RefreshCache + ~90s | 即时(直接 S3 API) |
| 9 | POSIX 权限 | ✅ 完整 | ✅ 完整 | ❌ 不支持 |
| 10 | 文件锁 | ✅ | ✅ | ❌ |
| 11 | 文件重命名 | ✅ | ✅ | ❌(通用桶) |
| 12 | 协议 | NFS v4.1/4.2 | NFS + SMB | FUSE |
| 13 | 额外月成本 | $0 | ~$162(EC2+EBS) | ~$0(仅 DaemonSet 资源) |
| 14 | 适用计算服务 | EC2/Lambda/EKS/ECS | EC2 only | EKS / 自管理 K8s |
| 15 | Fargate 支持 | 需确认 | ❌ | ❌ |
* Mountpoint CSI 数据基于文档分析和架构推断(FUSE + 直接 S3 API),非同环境实测。S3 Files 和 File Gateway 数据为同一 VPC 实测。
S3 Files vs File Gateway 延迟实测对比¶
| 操作 | S3 Files | File Gateway | 倍数差异 |
|---|---|---|---|
| 小文件首次读 (1KB) | 8ms | 6ms | FGW 快 1.3x |
| 小文件缓存读 (1KB) | N/A | 2ms | — |
| 大文件首次读 (10MB) | 319ms | 58ms | FGW 快 5.5x |
| 大文件缓存读 (10MB) | 6ms | 4ms | FGW 快 1.5x |
| 写回 S3 同步 | 62,000ms | ~1,000ms | FGW 快 62x |
| S3→NFS 反向同步 | ~3,000ms | ~90,000ms* | S3F 快 30x |
* File Gateway 需手动调用 RefreshCache API
踩坑记录¶
踩坑 1: File Gateway 版本化桶需要额外 IAM 权限
当 S3 桶启用版本控制时,File Gateway 的 IAM 角色除了基本的 s3:GetObject 等权限外,还必须包含 s3:GetObjectVersion、s3:ListBucketVersions 等版本相关权限。否则通过 S3 API 直接上传到桶的文件,在 NFS 端 cat 会返回 Input/output error,但 ls 能看到文件元数据。
这个错误信息没有任何提示是权限问题,排查时容易误判为网络或 Gateway 故障。
踩坑 2: File Gateway 反向同步不是自动的
与 S3 Files 不同,File Gateway 不会自动感知 S3 API 直接写入的变更。如果有外部程序直接向 S3 桶写入文件,NFS 客户端看不到这些文件,除非:
- 调用
RefreshCacheAPI - 或配置 S3 Event Notification + Lambda 自动触发 RefreshCache
这对于需要双向数据流的场景是一个重大限制。
踩坑 3: File Gateway 激活需要先等待启动
Storage Gateway AMI 启动后需要约 2-3 分钟才能响应 HTTP 激活请求。过早 curl 会超时。激活成功后还需等约 60 秒 Gateway 才真正连接到 AWS,否则 list-local-disks 等 API 会报 GatewayNotConnected。
踩坑 4: POSIX 权限元数据格式不同
两种方案都将 POSIX 权限存为 S3 对象用户元数据,但格式不同:
- S3 Files:
file-permissions: 0100755(含文件类型前缀) - File Gateway:
file-permissions: 0644(纯权限位) - Mountpoint CSI: 不存储 POSIX 权限
如果你计划在方案间迁移,权限映射需要注意这个差异。
踩坑 5: Mountpoint CSI 不支持修改已有文件
这是 Mountpoint 最容易踩的坑。如果你的应用尝试 open() 一个已有文件并写入(不带 O_TRUNC),操作会静默失败或报 IO error。Mountpoint 的写入模型只支持:
- 创建新文件 → 顺序写入 →
close() - 覆盖已有文件 → 必须
O_TRUNC重写整个文件(需--allow-overwrite启动参数)
这意味着大量传统应用(日志轮转、数据库、配置更新)无法直接使用 Mountpoint。
费用明细¶
S3 Files 计费模型详解¶
S3 Files 的费用由三部分组成:高性能存储费、数据访问费、底层 S3 费用。
高性能存储费¶
| 计费项 | 价格(us-east-1) | 说明 |
|---|---|---|
| 高性能存储 | $0.30/GB/月 | 只对文件系统上的活跃数据收费,按小时 prorated |
存储费的关键机制
- 只对"热数据"收费 — 不是按 S3 桶总量,而是按高性能存储上的活跃数据量
- 大文件不占存储 — ≥ 128KB(可配置阈值)的文件直接从 S3 流式读,不存入高性能存储
- 自动过期 — 超过配置窗口(默认 30 天)未读的数据自动移除,过期操作不收费
- 最小计费 6 KiB — 每个文件/元数据最小按 6 KiB 计费
- $0.30/GB 不便宜 — 相比 S3 Standard $0.023/GB 贵了 13 倍,但只对小文件活跃集收取
数据访问费¶
| 操作类型 | 价格 | 说明 |
|---|---|---|
| 文件系统写入 | $0.06/GB | 写入高性能存储,最小计费 32 KB/次 |
| 文件系统读取(小文件) | $0.03/GB | 从高性能存储读取,最小计费 32 KB/次 |
| 同步导出(写回 S3) | $0.03/GB | 按 read 计费 |
| 同步导入(S3 → 文件系统) | $0.06/GB | 按 write 计费 |
| 大文件读取(≥ 128KB) | $0 | 直接从 S3 流式读,只付标准 S3 GET 费 |
| 元数据操作(ls/stat/chmod) | 4 KB 按 read 计费 | 每次操作 4 KB |
| commit(fsync/close after write) | 4 KB 按 write 计费 | 每次操作 4 KB |
| 数据过期清理 | $0 | 免费 |
写操作有双重计费
写入一个文件实际产生两笔费用:写入高性能存储 $0.06/GB + 同步回 S3 $0.03/GB = 合计 $0.09/GB。大量小于 32KB 的小文件操作会因最小计费单位产生放大效应。
底层 S3 费用(不变)¶
S3 Files 不替代 S3 存储费用,以下费用照常收取:
- S3 桶存储费(S3 Standard $0.023/GB/月)
- S3 Files 代你发起的 S3 PUT/GET 请求按标准费率
- EventBridge 通知费(反向同步检测变更用)
定价示例(来自 AWS 官方)¶
场景:100GB S3 桶,文件应用读 10GB(94% 大文件 + 6% 小文件),写 1GB(0.25GB 最终同步回 S3)
| 计费项 | 计算 | 费用 |
|---|---|---|
| 高性能存储 | 0.6GB 小文件 + 0.25GB 写入 = 0.85GB × $0.30 | $0.255 |
| 写入访问 | 1GB × $0.06 | $0.060 |
| 写回 S3 同步 | 0.25GB × $0.03 | $0.008 |
| 小文件读取 | 0.6GB × $0.03 | $0.018 |
| 小文件导入同步 | 0.6GB × $0.06 | $0.036 |
| 大文件直读 S3 | 9.4GB × $0 | $0 |
| S3 Files 月度合计 | $0.38 | |
| + S3 桶存储 | 100GB × $0.023 | +$2.30 |
File Gateway 方案费用¶
| 资源 | 单价 | 用量 | 费用 |
|---|---|---|---|
| m5.xlarge EC2 (Gateway) | $0.192/h | 2h | $0.38 |
| t3.small EC2 (Client) | $0.0208/h | 2h | $0.04 |
| 150GB gp3 EBS | $0.08/GB/月 | 2h | $0.02 |
| S3 存储 | 标准 | < 1GB | < $0.01 |
| 合计 | ~$0.45 |
Mountpoint CSI 方案费用¶
| 资源 | 单价 | 用量 | 费用 |
|---|---|---|---|
| EKS 集群 | $0.10/h | 已有集群则 $0 | $0 |
| S3 请求费 | 标准 S3 GET/PUT | 按量 | 标准 S3 费用 |
| 合计 | 仅 S3 标准费用 |
三方持续运行月成本对比¶
以「100GB S3 桶 + 10GB 活跃小文件 + 每月读 100GB + 写 10GB」为例:
| 方案 | 基础设施月成本 | 数据访问月成本 | S3 存储月成本 | 合计 |
|---|---|---|---|---|
| S3 Files | $0 | ~$3-5(高性能存储 + 访问费) | $2.30 | ~$5-7 |
| File Gateway | ~$162(EC2 + EBS) | $0(缓存本地) | $2.30 | ~$164 |
| Mountpoint CSI | $0 | ~$0.04(S3 GET 请求) | $2.30 | ~$2.34 |
成本选型关键点
- 小数据量 + 偶尔访问:三方差异不大,选最简单的(S3 Files 或 Mountpoint)
- 大数据量 + 频繁小文件读写:S3 Files 的 $0.30/GB 存储费 + $0.06/GB 写入费会累积
- 持续运行:File Gateway 有 ~$162/月固定成本,数据量小时最不划算
- 纯大文件读取:Mountpoint CSI 最便宜(仅 S3 GET 费用)
清理资源¶
File Gateway 清理¶
# 1. 删除 NFS 文件共享
aws storagegateway delete-file-share \
--file-share-arn arn:aws:storagegateway:us-east-1:595842667825:share/share-300D6F5B \
--region us-east-1
# 2. 删除 Gateway
aws storagegateway delete-gateway \
--gateway-arn arn:aws:storagegateway:us-east-1:595842667825:gateway/sgw-EA485B83 \
--region us-east-1
# 3. 终止 EC2 实例
aws ec2 terminate-instances --instance-ids i-0cfb689dec8ed42eb i-0801c968b82491e88 --region us-east-1
# 4. 等待实例终止后删除安全组
aws ec2 wait instance-terminated --instance-ids i-0cfb689dec8ed42eb i-0801c968b82491e88 --region us-east-1
aws ec2 delete-security-group --group-id sg-07a78a8029e6fdb59 --region us-east-1
aws ec2 delete-security-group --group-id sg-09546650aea2b189c --region us-east-1
# 5. 删除 IAM 角色
aws iam delete-role-policy --role-name FGWFileShareRole-36429 --policy-name S3Access
aws iam delete-role --role-name FGWFileShareRole-36429
aws iam remove-role-from-instance-profile --instance-profile-name FGWClientRole-36429-profile --role-name FGWClientRole-36429
aws iam delete-instance-profile --instance-profile-name FGWClientRole-36429-profile
aws iam detach-role-policy --role-name FGWClientRole-36429 --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
aws iam detach-role-policy --role-name FGWClientRole-36429 --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
aws iam delete-role --role-name FGWClientRole-36429
# 6. 清空并删除 S3 桶
aws s3 rm s3://fgw-test-20260408-36429 --recursive --region us-east-1
aws s3api delete-bucket --bucket fgw-test-20260408-36429 --region us-east-1
务必清理
File Gateway 的 m5.xlarge EC2 实例每小时 $0.192,一天不清理就是 $4.6。Lab 完成后请立即执行清理步骤。
结论与建议¶
一句话总结¶
- S3 Files — "更简单更便宜",零额外基础设施,完整文件系统语义
- File Gateway — "更快更灵活",本地缓存加速,支持 SMB + 混合云
- Mountpoint CSI — "最轻量最高吞吐",但只适合只读或追加写的 K8s 工作负载
场景化选型建议¶
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| EC2 新应用上云 | ✅ S3 Files | 零额外基础设施,3 步部署 |
| EKS ML 训练数据读取 | ✅ Mountpoint CSI | 大文件顺序读极高吞吐,零额外成本 |
| EKS 应用需读写共享状态 | ✅ S3 Files | 完整文件系统语义 + EKS 原生支持 |
| 需要极低写延迟 | ✅ File Gateway | 写回 S3 ~1s vs S3 Files ~60s |
| 双向数据流(S3 API + NFS) | ✅ S3 Files | 自动双向同步,无需额外配置 |
| 需要 SMB 协议 | ✅ File Gateway | S3 Files/Mountpoint 均不支持 SMB |
| Windows 客户端 | ✅ File Gateway | SMB 协议原生支持 |
| Lambda 挂载 S3 | ✅ S3 Files | Lambda 原生支持,其他两个不行 |
| 成本敏感 | ✅ S3 Files / Mountpoint | 无额外 EC2/EBS 成本 |
| 读延迟极致优化 | ✅ File Gateway | 本地 EBS 缓存 2-6ms |
| 大文件批量处理(只读) | ✅ Mountpoint CSI | 多并发 S3 GET 最高吞吐 |
| 混合云(on-premises) | ✅ File Gateway | 支持 VMware/Hyper-V/KVM |
| AI Agent 文件共享 | ✅ S3 Files | 多客户端读写 + 自动同步 + 低运维 |
| 数据湖 Spark/Presto 读取 | ✅ Mountpoint CSI | 只读高吞吐,原生 K8s 集成 |
关键决策树¶
你的工作负载在哪里运行?
├── EC2 / Lambda / ECS
│ └── 需要 SMB 协议或混合云?
│ ├── 是 → File Gateway
│ └── 否 → 写延迟 < 5s 是硬性需求?
│ ├── 是 → File Gateway
│ └── 否 → S3 Files ✅
├── EKS / Kubernetes
│ └── 需要修改已有文件 / 文件锁 / POSIX 权限?
│ ├── 是 → S3 Files(通过 NFS PV 挂载)
│ └── 否 → 主要是大文件只读/追加写?
│ ├── 是 → Mountpoint CSI ✅
│ └── 否 → S3 Files ✅
└── On-premises
└── File Gateway ✅(唯一选择)
迁移建议¶
从 File Gateway 迁移到 S3 Files:
- ✅ 可以迁移:NFS-only 工作负载、写延迟不敏感、需要降低运维复杂度
- ⚠️ 评估后迁移:依赖 File Gateway 本地缓存加速的读密集型工作负载
- ❌ 暂不迁移:需要 SMB 协议、需要混合云部署、写延迟 < 5s 是 SLA 要求
从 Mountpoint CSI 迁移到 S3 Files:
- ✅ 建议迁移:需要写入已有文件、文件锁、POSIX 权限的 K8s 应用
- ❌ 不建议迁移:只读大文件吞吐场景(Mountpoint 吞吐更高、成本更低)