3FS是深度求索(DeepSeek)公司自主研发的高性能分布式存储系统,专为AI大模型训练、大数据分析及高性能计算(HPC)场景优化设计。在3FS中,融合现代SSD存储与RDMA网络技术,突破传统网络的性能瓶颈。本文介绍如何基于阿里云自研的云上弹性RDMA网络,使用阿里云托管的Kubernetes ACK服务,实现快速部署。
部署方案
基于阿里云高性能弹性RDMA网络eRDMA与弹性临时盘构建3FS集群,使用阿里云的ACK托管集群实现快速部署,轻松搭建跨多个节点的集群服务。
阿里云不对3FS提供技术支持,也不承诺性能。如遇问题,欢迎在GitHub上或加入钉群35532895与我们交流。
弹性RDMA(Elastic Remote Direct Memory Access,简称eRDMA)是阿里云自研的云上弹性RDMA网络,底层链路复用VPC网络,采用全栈自研的拥塞控制CC(Congestion Control)算法,享有传统RDMA网络高吞吐、低延迟特性的同时,可支持秒级的大规模RDMA组网。可兼容传统HPC应用、AI应用以及传统TCP/IP应用。
详细信息,请参见弹性RDMA(eRDMA)。
弹性临时盘(Elastic Ephemeral Disk)是一款可灵活随实例创建或单独创建的、由用户自定义选择容量大小的块存储设备,作为临时数据存储使用,为ECS实例提供临时数据存储,具备高性能、高性价比等特点。详细信息,请参见弹性临时盘。
容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)是全球首批通过Kubernetes一致性认证的容器服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,让您轻松高效地在云端运行Kubernetes容器化应用。
详细信息,请参见容器服务Kubernetes版(ACK托管集群)。
3FS关键节点介绍
3FS关键组件及作用如下:
元数据服务Metadata Service(Meta):无状态服务,处理文件系统的元数据请求。底层通过foundation DB实现原子性操作。
数据存储Storage Service(Storage):在存储节点上运行,数据分块存储于高性能NVMe SSD,采用CRAQ(Chain Replication with Apportioned Queries)链式复制协议管理副本,提供write-all-read-any语义。
集群管理Cluster manager(Mgmtd):管理集群的配置信息,存储节点状态,负责选举主节点并对其他组件进行同步更新。
客户端Client:3FS提供了两种形态的客户端,通过FUSE实现标准化访问和USRBIO实现高性能传输,兼顾兼容性与效率,成为AI、大数据等场景的理想存储接口。
FUSE客户端:通过用户态文件系统接口挂载存储集群为本地目录。提供 POSIX 兼容的文件操作接口(
read/write/mkdir),无需修改应用代码。USRBIO高性能客户端:通过用户态I/O栈和RDMA,实现微秒级延迟与超高吞吐,满足AI/HPC需求。
各个组件通过RDMA网络通信,绕过内核协议栈,显著减少 CPU 负载与网络延迟。
准备工作
准备一台开通公网的客户端ECS实例,用于创建和管理ACK集群。如果您已有安装并配置了阿里云CLI的实例,可以跳过此准备工作,直接开始搭建ACK集群。
本文所有操作步骤在此客户端实例上进行。
准备客户端ECS实例
为客户端实例安装并配置阿里云CLI
使用阿里云CLI搭建ACK集群
通过CLI创建基于阿里云托管Kubernetes服务构建的ACK集群,该集群采用Terway ENI网络模式实现容器直连弹性网卡,配备支持eRDMA的加速实例和ESSD云盘优化存储性能,通过containerd运行时与预置镜像加速配置保障容器效率,并启用企业级安全组规则强化网络隔离。
本文中使用自动创建VPC方式搭建ACK集群,会同步创建ACK集群相关的ECS实例、VPC、交换机、安全组、CLB、公网NAT网关、EIP等资源,可能会产生相关费用。详细信息,请参见ACK托管和专有集群计费说明。
本文仅为示例操作,在生产环境中,建议您提前规划集群的规模、网络功能需求、专有网络VPC相关配置(VPC自身、交换机等)和集群网络相关配置(容器网络插件CNI、容器网段、服务网段等),确保网络资源的高效利用,为后续业务扩展预留充足空间。详细信息,请参见ACK托管集群网络规划。
命令中参数描述了ACK集群的配置信息,更多参数信息,请参见创建集群。
如果您希望使用已有VPC创建ACK集群,注意设置VPC下的交换机、安全组等资源。
集群初始化可能需要一段时间,请您耐心等待。
远程连接客户端实例,执行以下命令,创建集群。
集群配置说明如下所示:
从返回信息,可以看到集群ID信息:
{ "cluster_id": "cb12xxxd0c", "instanceId": "cb1xxxd0c", "request_id": "6B0xxx815C7A", "task_id": "T-680d" }集群创建成功后,执行以下命令,查看集群实例。
aliyun cs GET /clusters/cluster_id替换cluster_id为上一步输出的集群ID,通过返回信息,可以看到集群详细配置信息。
[root@iZ xxx xZ ~]# aliyun cs GET /clusters/cb1xxx d0c { "cluster_id": "cb12d4cxxx d0c", "cluster_spec": "ack.pro.small", "cluster_type": "ManagedKubernetes", "created": "2xxx-xxx-xxx-xxx00", "current_version": "1.32.1-aliyun.1", "deletion_protection": false, "disable_encryption": true, "external_loadbalancer_id": "lb-2zxxx xxx x5", "init_version": "1.32.1-aliyun.1", "ip_stack": "ipv4", "maintenance_info": { "cluster_upgrade_info": { "nodepools": null }, "is_active": false }, "maintenance_window": { "enable": false, "weekly_period": "" }, "master_url": "{\"api_server_endpoint\":\"\"xxx\"intranet_api_server_endpoint\":\"https://10.59.196.223:6443\"}"您也可以登录容器服务ACK控制台在集群列表中查看创建的集群:
集群列表中显示已创建的集群 3FS-example,集群类型为 ACK 托管集群,集群规格为 Pro 版,状态为运行中,节点数为 4,Kubernetes 版本为
1.32.1-aliyun.1。安装kubectl来管理集群并应用,具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
重要本示例中通过内网连接ACK集群,请确保安装kubectl的客户端实例和ACK集群在同一VPC中,内网互通。
如果客户端实例和ACK集群不在同一VPC内,您可以更换客户端实例的VPC为ACK集群的VPC,详细信息,请参见更换ECS实例的VPC。
配置成功后,执行以下命令,可以列出Kubernetes集群中所有的命名空间。
kubectl get namespace[root@iz xxx ~]# kubectl get namespace NAME STATUS AGE ack-csi-fuse Active 46m ack-erdma-controller Active 44m default Active 47m kube-node-lease Active 47m kube-public Active 47m kube-system Active 47m安装Helm V3。
Helm是一个用于在Kubernetes集群中进行应用管理的开源工具,它提供了统一的应用打包方式,同时支持版本控制,降低了应用分发和部署的复杂性。本文中,我们通过Helm部署3FS集群。关于Helm的更多信息,请参见使用Helm简化应用部署。
wget https://get.helm.sh/helm-v3.3.0-linux-amd64.tar.gz tar -xzvf helm-v3.3.0-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin/helm helm version预期输出如下所示,表示安装成功。
[root@xxx ~]# helm version version.BuildInfo{Version:"v3.3.0"
在ACK集群上部署3FS
阿里云基于开源3FS文件系统进行了轻量级技术适配,将其封装为标准化容器镜像并提供开箱即用的Helm Chart,实现Kubernetes环境下的自动化部署。相关定制化代码、部署清单及持续集成配置已全面开源并托管于GitHub仓库,支持开发者通过单一命令完成部署。
本示例通过Helm在ACK集群中成功部署了一个包含2个meta节点、2个mgmtd节点、1个fuse客户端以及3个storage节点的3FS集群。
远程连接客户端实例,执行以下命令,获取代码仓库并切换到部署目录。
git clone https://github.com/AliyunContainerService/alibabacloud-3FS.git cd alibabacloud-3FS/deploy/container执行以下命令,部署FoundationDB Operator。
3FS基于FoundationDB构建存储引擎,部署前需先行搭建FDB集群,我们使用Kubernetes Operator进行部署。
kubectl create ns fdb kubectl apply -n fdb -f ./fdb-operator[root@ixxxx container]# kubectl apply -n fdb -f ./fdb-operator customresourcedefinition.apiextensions.k8s.io/foundationdbbackups.apps.foundationdb.org created customresourcedefinition.apiextensions.k8s.io/foundationdbclusters.apps.foundationdb.org created customresourcedefinition.apiextensions.k8s.io/foundationdbrestores.apps.foundationdb.org created serviceaccount/fdb-kubernetes-operator-controller-manager created clusterrole.rbac.authorization.k8s.io/fdb-kubernetes-manager-clusterrole created clusterrole.rbac.authorization.k8s.io/fdb-kubernetes-operator-manager-role created rolebinding.rbac.authorization.k8s.io/fdb-kubernetes-operator-manager-rolebinding created clusterrolebinding.rbac.authorization.k8s.io/fdb-kubernetes-operator-manager-clusterrolebinding created deployment.apps/fdb-kubernetes-operator-controller-manager created执行以下命令,使用代码仓库中提供的helm chart一键部署3FS及其所需的FDB集群。
helm install 3fs ./chart -n 3fs --create-namespace --timeout 10m说明部署过程中,系统将基于Helm Pod YAML配置自动为Storage节点所在的ECS实例创建弹性临时盘并完成挂载操作。
部署可能需要几分钟时间,初始化阶段某些容器可能出现多次崩溃,属于正常现象,请您耐心等待。
部署完成后,输出如下所示:
[root@i-xxx container]# helm install 3fs ./chart -n 3fs --create-namespace --timeout 10m NAME: 3fs LAST DEPLOYED: Thu Apr 24 19:22:02 2025 NAMESPACE: 3fs STATUS: deployed REVISION: 1 TEST SUITE: None部署完成后,我们就得到了一个,通过ACK部署的、基于3FS使用eRDMA进行节点间通信的高性能分布式文件系统。
执行以下命令,查看3fs命名空间中所有Pod。
kubectl get pods -o wide -n 3fs[root@i ~]# kubectl get pods -o wide -n 3fs NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES admin-cli-3fs 1/1 Running 4 (11m ago) 23h 10.7.185.73 cn-beijing.10.7.185.56 <none> <none> fdb-meta-3fs-cluster-controller-39839 2/2 Running 0 23h 10.7.185.78 cn-beijing.10.7.185.57 <none> <none> fdb-meta-3fs-log-56992 2/2 Running 0 23h 10.7.185.87 cn-beijing.10.7.185.56 <none> <none> fdb-meta-3fs-log-71409 2/2 Running 0 23h 10.7.185.80 cn-beijing.10.7.185.57 <none> <none> fdb-meta-3fs-log-74648 2/2 Running 0 23h 10.7.185.89 cn-beijing.10.7.185.57 <none> <none> fdb-meta-3fs-log-79318 2/2 Running 0 23h 10.7.185.84 cn-beijing.10.7.185.55 <none> <none> fdb-meta-3fs-storage-13747 2/2 Running 0 23h 10.7.185.83 cn-beijing.10.7.185.56 <none> <none> fdb-meta-3fs-storage-24732 2/2 Running 0 23h 10.7.185.88 cn-beijing.10.7.185.58 <none> <none> fdb-meta-3fs-storage-35553 2/2 Running 0 23h 10.7.185.77 cn-beijing.10.7.185.55 <none> <none> fuse-3fs 1/1 Running 4 (23h ago) 23h 10.7.185.74 cn-beijing.10.7.185.58 <none> <none> meta-3fs-100 1/1 Running 4 (23h ago) 23h 10.7.185.72 cn-beijing.10.7.185.57 <none> <none> meta-3fs-101 1/1 Running 4 (23h ago) 23h 10.7.185.82 cn-beijing.10.7.185.58 <none> <none> mgmtd-3fs-1 1/1 Running 4 (23h ago) 23h 10.7.185.75 cn-beijing.10.7.185.56 <none> <none> mgmtd-3fs-2 1/1 Running 4 (23h ago) 23h 10.7.185.79 cn-beijing.10.7.185.57 <none> <none> storage-3fs-10000 1/1 Running 3 (23h ago) 23h 10.7.185.85 cn-beijing.10.7.185.55 <none> <none> storage-3fs-10001 1/1 Running 4 (23h ago) 23h 10.7.185.81 cn-beijing.10.7.185.58 <none> <none> storage-3fs-10002 1/1 Running 4 (23h ago) 23h 10.7.185.86 cn-beijing.10.7.185.57 <none> <none>执行以下命令,访问3FS集群管理控制台。
kubectl attach -n 3fs admin-cli-3fs -it按Ctrl+D显示提示符后输入
list-nodes,可以看到3FS集群的各个节点信息(按Ctrl+D退出)。[root@iz xxx container]# kubectl attach -n 3fs admin-cli-3fs -it If you don't see a command prompt, try pressing enter. / > list-nodes bash: line 1: /usr/sbin/ibdev2netdev: No such file or directory [2025-04-24T11:26:23.323018337+00:00 admin_cli: 1 IBDevice.cc:165 ERROR] Failed to run ibdev2netdev, ret code 127 [2025-04-24T11:26:23.323066545+00:00 admin_cli: 1 IBDevice.cc:215 WARNING] Failed to load ibdev2netdev, maybe running in container. [2025-04-24T11:26:23.324204434+00:00 admin_cli: 1 IBDevice.cc:380 WARNING] IBDevice erdma_0:1's netdev is unknown, maybe running in container. [2025-04-24T11:26:23.324213256+00:00 admin_cli: 1 IBDevice.cc:441 CRITICAL] IBDevice erdma_0:1 can't set zone by IP, fallback to UNKNOWN Id Type Status Hostname Pid Tags LastHeartbeatTime ConfigVersion ReleaseVersion 1 MGMTD PRIMARY_MGMTD mgmtd-3fs-1 1 [] N/A 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 2 MGMTD HEARTBEAT_CONNECTED mgmtd-3fs-2 1 [] 2025-04-24 11:26:16 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 100 META HEARTBEAT_CONNECTED meta-3fs-100 1 [] 2025-04-24 11:26:20 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 101 META HEARTBEAT_CONNECTED meta-3fs-101 1 [] 2025-04-24 11:26:13 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 10000 STORAGE HEARTBEAT_CONNECTED storage-3fs-10000 1 [] 2025-04-24 11:26:21 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 10001 STORAGE HEARTBEAT_CONNECTED storage-3fs-10001 1 [] 2025-04-24 11:26:22 0(UPTODATE) 250228-dev-1-999999-f5fd8c05 10002 STORAGE HEARTBEAT_CONNECTED storage-3fs-10002 1 [] 2025-04-24 11:26:22 0(UPTODATE) 250228-dev-1-999999-f5fd8c05执行以下命令,查看FUSE客户端。
kubectl exec -n 3fs fuse-3fs -it -- ls /mnt/3fs[root@xxx container]# kubectl exec -n 3fs fuse-3fs -it -- ls /mnt/3fs 3fs-virt可看到
3fs-virt输出,这是3FS fuse客户端的特殊文件夹。同时会将/mnt/3fs目录挂载到ECS实例,可在实例上运行fio等工具测试性能。