基于ACK集群部署3FS

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实例

购买一台ECS实例作为部署和管理ACK集群的客户端,具体操作,请参见自定义购买实例

本文示例配置:

  • 地域和可用区:北京I

  • 规格:ecs.g8i.large

  • 镜像:Alibaba Cloud Linux 3.2104 LTS 64

  • 网络:开通公网

为客户端实例安装并配置阿里云CLI

阿里云CLI(Alibaba Cloud CLI)是基于OpenAPI构建的通用命令行工具,您可以借助阿里云CLI在命令行界面中对阿里云资源执行增删改查等日常运维任务。

本文中,我们通过阿里云CLI一键创建ACK托管集群,无需依赖用户界面。详细信息,请参见什么是阿里云CLI

  1. 远程连接管理节点,执行以下命令,验证阿里云CLI是否已经正常安装。

    说明

    阿里云CLIECS实例上默认已经安装,如果您需要重新手动安装,请参见步骤一:安装阿里云CLI

    aliyun version

    返回信息如下,表示成功安装。

    image

  2. 执行以下命令,使用交互式方式配置AK凭证。(需要开通公网)

    说明
    • 在使用阿里云CLI之前,您需要配置调用阿里云资源所需的凭证信息、地域(本示例中为北京)、语言等。阿里云CLI在初次运行时会自动生成并使用default配置。

    • 本示例仅以AK凭证类型为例说明,关于其他类型,请参见在阿里云CLI中配置身份凭证

    aliyun configure --profile AkProfile

    配置交互过程示例如下:

    image

关于阿里云CLI的更多信息,请参见什么是阿里云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下的交换机、安全组等资源。

  • 集群初始化可能需要一段时间,请您耐心等待。

image
  1. 远程连接客户端实例,执行以下命令,创建集群。

    点击查看通过CLI创建ACK集群命令

    aliyun cs POST /clusters --header "Content-Type=application/json" --body '{
        "name": "3FS-example",
        "cluster_type": "ManagedKubernetes",
        "kubernetes_version": "1.32.1-aliyun.1",
        "region_id": "cn-beijing",
        "snat_entry": true,
        "proxy_mode": "ipvs",
        "addons": [
            {
                "name": "terway-controlplane"
            },
            {
                "name": "terway-eniip"
            },
            {
                "name": "csi-plugin"
            },
            {
                "name": "managed-csiprovisioner"
            },
            {
                "name": "nginx-ingress-controller",
                "disabled": true
            },
            {
                "name": "ack-erdma-controller",
                "config": "{\"agent\":{\"preferDriver\":\"compat\",\"allocateAllDevices\":true}}"
            }
        ],
        "cluster_spec": "ack.pro.small",
        "charge_type": "PostPaid",
        "zone_ids": [
            "cn-beijing-i"
        ],
        "service_cidr": "192.168.0.0/16",
        "ip_stack": "ipv4",
        "is_enterprise_security_group": true,
        "nodepools": [
            {
                "nodepool_info": {
                    "name": "default-nodepool"
                },
                "scaling_group": {
                    "system_disk_category": "cloud_essd",
                    "system_disk_size": 60,
                    "system_disk_performance_level": "PL0",
                    "system_disk_encrypted": false,
                    "instance_types": [
                        "ecs.g8ise.xlarge",
                        "ecs.g8i.xlarge"
                    ],
                    "instance_charge_type": "PostPaid",
                    "platform": "AliyunLinux",
                    "image_type": "AliyunLinux3",
                    "desired_size": 4
                },
                "kubernetes_config": {
                    "pre_user_data": "bWtkaXIgLXAgL2V0Yy9jb250YWluZXJkL2NlcnQuZC9kb2NrZXIuaW8vCmNhdCA+IC9ldGMvY29udGFpbmVyZC9jZXJ0LmQvZG9ja2VyLmlvL2hvc3RzLnRvbWwgPDxFT0YKc2VydmVyID0gImh0dHBzOi8vcmVnaXN0cnktMS5kb2NrZXIuaW8iCltob3N0LiJodHRwczovL21pcnJvcnMtc3NsLmFsaXl1bmNzLmNvbS8iXQogIGNhcGFiaWxpdGllcyA9IFsicHVsbCIsICJyZXNvbHZlIl0KICBza2lwX3ZlcmlmeSA9IHRydWUKRU9G",
                    "runtime": "containerd",
                    "runtime_version": "1.6.37"
                }
            }
        ]
    }'

    集群配置说明如下所示:

    • 集群基础配置

      参数

      配置说明

      name

      3FS-example

      集群名称(需唯一)

      cluster_type

      ManagedKubernetes

      托管版K8s

      kubernetes_version

      1.32.1-aliyun.1

      阿里云定制K8s版本

      region_id

      cn-beijing

      选择支持弹性临时盘的地域,推荐华北2(北京)地域。

      charge_type

      PostPaid

      按量付费模式

    • 网络配置

      参数

      作用

      配置说明

      service_cidr

      设置服务网段

      服务网段(Service CIDR) 是集群中为Service分配IP地址的专用网络地址范围。此网段不能与VPCVPC内已有集群使用的网段重复,且服务地址段也不能和容器地址段重复。有关集群网络地址段规划的信息,请参见ACK托管集群网络规划

      ip_stack

      集群IP协议栈

      此处仅设置支持ipv4

      is_enterprise_security_group

      是否设置企业级安全组

      此处设置为true,会自动创建企业级安全组,提供更加严格的访问规则,详细信息,请参见普通安全组与企业级安全组

      snat_entry

      集群VPC是否具备公网访问能力

      设置为true,将创建NAT网关并自动配置SNAT规则,集群VPC将具备公网访问能力。

    • 节点池配置(nodepools)

      • 伸缩组配置(scaling_group

        参数

        配置说明

        system_disk_category

        系统盘类型 cloud_essd

        阿里云ESSD云盘结合25 GE网络和RDMA技术,为您提供单盘高达100万的随机读写能力和单路低时延性能。详细信息,请参见ESSD云盘

        system_disk_size

        系统盘大小 60 GB

        最小建议40GB

        system_disk_performance_level

        ESSD性能级别 PL0

        基础性能级,并发极限I/O性能中等,读写时延较为稳定。

        instance_types

        实例规格列表

        选择支持eRDMA支持弹性临时盘的规格,推荐使用

        存储增强通用型实例规格族g8ise

        platform

        操作系统 AliyunLinux

        image_type

        镜像类型 AliyunLinux3

      • Kubernetes运行时配置:配置containerd镜像加速器,指向阿里云容器镜像服务。

        查看pre_user_data配置的BASE64编码脚本:

        7e1dd279b53928d4efb4ea6349e4ba3a

    • 插件配置(addons)

      插件名称

      功能

      配置说明

      terway-controlplane

      网络插件控制平面

      容器服务Kubernetes版支持TerwayFlannel两种容器网络插件。这里选择阿里云自研的网络插件Terway,且配置Trunk ENI支持。

      详细信息,请参见容器网络插件

      terway-eniip

      Trunk ENI支持,支持Pod级别vSwitch、安全组配置,支持固定IP

      csi-plugin

      存储插件

      通过csi-plugincsi-provisioner组件可以帮您实现存储卷的动态创建、挂载、卸载等功能。详细信息,请参见管理csi-plugincsi-provisioner组件

      managed-csiprovisioner

      CSI驱动控制器

      nginx-ingress-controller

      入口控制器

      详细信息,请参见Nginx Ingress Controller

      ack-erdma-controller

      为阿里云弹性RDMAKubernetes控制器,提供eRDMA网卡管理、调度、Pod网络能力

      • preferDriver: 驱动类型选择compat兼容RoCE驱动模式。

      • allocateAllDevices:为Pod分配节点上所有的eRDMA设备。

      详细信息,请参见使用eRDMA加速容器网络

    从返回信息,可以看到集群ID信息:

    image

  2. 集群创建成功后,执行以下命令,查看集群实例。

    aliyun cs GET /clusters/cluster_id

    替换cluster_id为上一步输出的集群ID,通过返回信息,可以看到集群详细配置信息。

    image

    您也可以登录容器服务ACK控制台在集群列表中查看创建的集群:

    image

  3. 安装kubectl来管理集群并应用,具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

    重要
    • 本示例中通过内网连接ACK集群,请确保安装kubectl的客户端实例和ACK集群在同一VPC中,内网互通。

    • 如果客户端实例和ACK集群不在同一VPC内,您可以更换客户端实例的VPCACK集群的VPC,详细信息,请参见更换ECS实例的VPC

    配置成功后,执行以下命令,可以列出Kubernetes集群中所有的命名空间。

    kubectl get namespace

    image

  4. 安装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

    预期输出如下所示,表示安装成功。

    image

ACK集群上部署3FS

阿里云基于开源3FS文件系统进行了轻量级技术适配,将其封装为标准化容器镜像并提供开箱即用的Helm Chart,实现Kubernetes环境下的自动化部署。相关定制化代码、部署清单及持续集成配置已全面开源并托管于GitHub仓库,支持开发者通过单一命令完成部署。

本示例通过HelmACK集群中成功部署了一个包含2meta节点、2mgmtd节点、1fuse客户端以及3storage节点的3FS集群。

image
  1. 远程连接客户端实例,执行以下命令,获取代码仓库并切换到部署目录。

    git clone https://github.com/AliyunContainerService/alibabacloud-3FS.git
    cd alibabacloud-3FS/deploy/container
  2. 执行以下命令,部署FoundationDB Operator

    3FS基于FoundationDB构建存储引擎,部署前需先行搭建FDB集群,我们使用Kubernetes Operator进行部署。

    kubectl create ns fdb
    kubectl apply -n fdb -f ./fdb-operator

    image

  3. 执行以下命令,使用代码仓库中提供的helm chart一键部署3FS及其所需的FDB集群。

    helm install 3fs ./chart -n 3fs --create-namespace --timeout 10m
    说明
    • 部署过程中,系统将基于Helm Pod YAML配置自动为Storage节点所在的ECS实例创建弹性临时盘并完成挂载操作。

    • 部署可能需要几分钟时间,初始化阶段某些容器可能出现多次崩溃,属于正常现象,请您耐心等待。

    部署完成后,输出如下所示:

    image

    部署完成后,我们就得到了一个,通过ACK部署的、基于3FS使用eRDMA进行节点间通信的高性能分布式文件系统。

  4. 执行以下命令,查看3fs命名空间中所有Pod。

    kubectl get pods -o wide -n 3fs

    image

  5. 执行以下命令,访问3FS集群管理控制台。

    kubectl attach -n 3fs admin-cli-3fs -it

    Ctrl+D显示提示符后输入list-nodes,可以看到3FS集群的各个节点信息(按Ctrl+D退出)。

    image

  6. 执行以下命令,查看FUSE客户端。

    kubectl exec -n 3fs fuse-3fs -it -- ls /mnt/3fs

    image

    • 可看到3fs-virt输出,这是3FS fuse客户端的特殊文件夹。

    • 同时会将/mnt/3fs目录挂载到ECS实例,可在实例上运行fio等工具测试性能。