Loading... # Fluid 与 S3FS 对接 S3 存储及性能测试 # 一、概述 ## 1. 简介 ### A. 是什么 Fluid 是一个 Kubernetes 原生的数据集编排和加速工具,通过 S3FS 将 S3 兼容存储挂载为 Pod 可用的 PVC,实现云存储的透明访问。 ### B. 为什么学 - 解决 Kubernetes Pod 访问 S3 存储的复杂性问题 - 实现存储资源的统一管理和调度 - 支持多种 S3 兼容存储(华为云 OBS、阿里云 OSS、AWS S3 等) ### C. 学完能做什么 - 自定义 Fluid 镜像以支持 S3FS 挂载 - 配置 Dataset 和 ThinRuntime 实现 S3 存储挂载 - 使用 JuiceFS Bench 进行性能测试 ## 2. 前置知识 ### A. 必备技能 - Kubernetes 基础操作(kubectl 命令) - Docker 镜像构建基础 - S3 存储概念(Bucket、Access Key、Secret Key) ### B. 推荐知识 - Fluid 架构和基本概念 - FUSE 文件系统原理 # 二、制作镜像 ## 1. 系统架构 Fluid 通过 ThinRuntime 机制支持自定义文件系统。S3FS 是一个基于 FUSE 的 S3 文件系统客户端,可以将 S3 存储挂载到本地文件系统。 ```mermaid graph TB subgraph Kubernetes Pod[Pod 应用容器] PVC[PersistentVolumeClaim] Runtime[ThinRuntime Fuse 容器] end Pod --> PVC PVC --> Runtime Runtime --> S3FS[S3FS FUSE 挂载] S3FS --> S3[(S3 兼容存储)] ```  ## 2. 组件说明 ### A. fluid_config_init.py Fluid 配置初始化脚本,负责: - 从 Fluid 配置文件读取挂载参数 - 生成 S3FS 认证文件 - 生成挂载脚本 ### B. entrypoint.sh 容器入口脚本,执行初始化并启动 S3FS 挂载。 ### C. Dockerfile 构建自定义 Fuse 镜像的模板。 ## 3. 配置文件详解 ### A. fluid_config_init.py ```python #!/usr/bin/env python import json import os rawStr = "" with open("/etc/fluid/config.json", "r") as f: rawStr = f.readlines() rawStr = rawStr[0] script = """ #!/bin/sh set -ex MNT_TO=$targetPath trap "umount ${MNT_TO}" SIGTERM mkdir -p ${MNT_TO} || true s3fs $bucket:$bucketPath $MNT_TO -o url=$url -o allow_other -f -d -o f2 echo "mounted and exit code: $?" sleep inf """ obj = json.loads(rawStr) with open("/root/.passwd-s3fs", "w") as f: f.write("%s:%s\n" % (obj["mounts"][0]["options"]["s3-access-key"], obj["mounts"][0]["options"]["s3-access-secret"])) os.chmod("/root/.passwd-s3fs", 0o600) bucketPath = obj["mounts"][0]["mountPoint"].lstrip("s3://").rstrip("/") bucket = bucketPath.split("/")[0] bucketPath = bucketPath[len(bucket):] with open("/mount-s3.sh", "w") as f: f.write('targetPath="%s"\n' % obj["targetPath"]) f.write('bucket="%s"\n' % bucket) f.write('bucketPath="%s"\n' % bucketPath) f.write('url="%s"\n' % obj["mounts"][0]["options"]["url"]) f.write(script) ``` **关键逻辑说明**: - 读取 Fluid 注入的配置文件 /etc/fluid/config.json - 提取 S3 认证信息并写入 /root/.passwd-s3fs(权限设为 600) - 解析 S3 路径,分离 bucket 和 bucketPath - 生成动态挂载脚本,包含 s3fs 挂载命令 ### B. entrypoint.sh ```bash #!/usr/bin/env bash set +x python /fluid_config_init.py chmod u+x /mount-s3.sh bash /mount-s3.sh ``` **执行流程**: 1. 关闭命令回显(set +x)避免泄露敏感信息 2. 调用 Python 脚本生成挂载配置 3. 为挂载脚本添加执行权限 4. 执行 S3FS 挂载 ### C. Dockerfile ```dockerfile FROM shaowenchen/runtime-ubuntu:20.04 RUN apt-get update && apt-get install -y python s3fs COPY ./fluid_config_init.py / COPY ./entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT [] ``` **构建步骤**: 1. 基于 Ubuntu 20.04 运行时镜像 2. 安装 Python 和 s3fs 3. 复制配置脚本和入口脚本 4. 设置入口脚本执行权限 ## 4. 构建镜像 ```bash docker build . --network=host -f Dockerfile -t shaowenchen/demo:fluid-s3fs docker push shaowenchen/demo:fluid-s3fs ``` **注意事项**: - 使用 --network=host 避免网络隔离问题 - 镜像名称需要与后续 ThinRuntimeProfile 配置一致 # 三、挂载 S3 存储 ## 1. 配置环境变量 ```bash export ENDPOINT=obs.ap-southeast-3.myhuaweicloud.com export BUCKET= export AK= export SK= ``` **参数说明**: - ENDPOINT:S3 兼容存储的服务地址 - BUCKET:存储桶名称 - AK:访问密钥 ID - SK:访问密钥 Secret ## 2. 创建 Dataset Dataset 定义了数据集的挂载点和认证信息。 ```bash kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: mys3fs spec: mounts: - mountPoint: s3://${BUCKET}/test1 options: s3-access-key: ${AK} s3-access-secret: ${SK} url: https://${ENDPOINT} EOF ``` **配置解析**: - mountPoint:S3 存储路径,格式为 s3://bucket/path - options.s3-access-key:访问密钥 ID - options.s3-access-secret:访问密钥 Secret - options.url:完整的 S3 服务端点 URL ## 3. 创建 ThinRuntimeProfile ThinRuntimeProfile 定义了 Fuse 文件系统的运行时配置。 ```bash kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntimeProfile metadata: name: s3fs-profile spec: fileSystemType: s3fs fuse: image: shaowenchen/demo:fluid-s3fs imageTag: latest imagePullPolicy: Always command: - "/usr/local/bin/entrypoint.sh" EOF ``` **配置解析**: - fileSystemType:指定为 s3fs - fuse.image:自定义 Fuse 镜像地址 - fuse.command:容器入口命令 ## 4. 创建 ThinRuntime ThinRuntime 引用 Profile 并关联 Dataset。 ```bash kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntime metadata: name: mys3fs-37 spec: profileName: s3fs-profile EOF ``` **命名规则**: - ThinRuntime 名称需要与 Dataset 名称保持一致或使用约定的后缀 - Fluid 会自动创建对应的 PVC ## 5. 创建 Pod 负载 ```bash kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: mys3fs spec: containers: - name: mys3fs image: shaowenchen/demo:ubuntu volumeMounts: - mountPath: /data name: mys3fs volumes: - name: mys3fs persistentVolumeClaim: claimName: mys3fs EOF ``` **挂载验证**: - 进入 Pod 后,/data 目录即为 S3 存储的挂载点 - 可以通过 ls、cat 等命令验证文件访问 # 四、性能测试 ## 1. 测试工具 使用 JuiceFS Bench 进行性能基准测试,该工具可以测试: - 大文件读写性能 - 小文件读写性能 - 文件元数据操作性能 ## 2. 测试步骤 ### A. 进入 Pod ```bash kubectl exec -it mys3fs -- bash ``` ### B. 安装 JuiceFS 客户端 ```bash curl -sSL https://d.juicefs.com/install | sh - ``` ### C. 执行性能测试 ```bash juicefs bench --block-size 4 --big-file-size 1024 /data ``` **参数说明**: - --block-size 4:块大小 4 MiB - --big-file-size 1024:大文件大小 1 GiB ## 3. 测试结果 ``` Benchmark finished! BlockSize: 4.0 MiB, BigFileSize: 1.0 GiB, SmallFileSize: 128 KiB, SmallFileCount: 100, NumThreads: 1 +------------------+-----------------+----------------+ | ITEM | VALUE | COST | +------------------+-----------------+----------------+ | Write big file | 194.80 MiB/s | 5.26 s/file | | Read big file | 100.50 MiB/s | 10.19 s/file | | Write small file| 3.6 files/s | 277.70 ms/file | | Read small file | 51.1 files/s | 19.59 ms/file | | Stat file | 26301.5 files/s | 0.04 ms/file | +------------------+-----------------+----------------+ ``` **结果分析**: - 大文件写入性能:194.80 MiB/s,适合顺序写入场景 - 大文件读取性能:100.50 MiB/s,读写不对称,可能受网络因素影响 - 小文件性能:写入较慢(3.6 files/s),读取较快(51.1 files/s) - 元数据操作:Stat 性能极佳(26301.5 files/s),说明缓存机制有效 **性能优化建议**: - 小文件写入场景建议启用本地缓存 - 大文件读写可考虑增加并发线程数 - 网络带宽可能是性能瓶颈,建议使用内网端点 # 五、清理资源 ## 1. 删除 Pod ```bash kubectl delete pod mys3fs ``` ## 2. 删除 ThinRuntime ```bash kubectl delete thinruntime mys3fs ``` ## 3. 删除 Dataset ```bash kubectl delete dataset mys3fs ``` **清理顺序**: 1. 先删除使用 PVC 的 Pod 2. 再删除 ThinRuntime 释放 Fuse 容器 3. 最后删除 Dataset 清除 PVC # 六、常见问题 ## 1. 版本兼容性 Fluid 1.0 与高版本的配置文件路径不同,需要根据实际版本调整 fluid_config_init.py 中的路径。 ## 2. 认证失败 检查 /root/.passwd-s3fs 文件格式和权限,确保格式为 accessKey:secretKey,权限为 600。 ## 3. 挂载超时 - 检查网络连接到 S3 端点的可达性 - 验证 Bucket 名称和路径是否正确 - 查看 S3FS 日志(通过 -f -d 参数启用前台调试模式) ## 4. 性能不达标 - 使用内网端点而非公网端点 - 调整 s3fs 挂载参数(如多线程、缓存大小) - 考虑使用 JuiceFS 替代 S3FS 获得更好性能 # 七、参考资料 1. [使用 Fluid 和 S3FS 对接 S3 存储及性能测试](https://www.chenshaowen.com/blog/using-fluid-and-s3fs-to-access-s3-storage-and-performance-testing.html) 最后修改:2026 年 01 月 18 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏