开启CNFS NAS计算端分布式缓存

CNFS文件存储计算端分布式缓存可提供多链接访问、元数据缓存、分布式数据缓存等加速能力,并提供端侧性能监控、QoS能力。本文介绍如何在ACK集群中开启CNFS NAS计算端分布式缓存,并通过分布式缓存功能加速读取数据。

索引

前提条件

  • 分布式缓存支持的操作系统为Alibaba Cloud Linux 2,内核版本为v4.19.91-23至v4.19.91-26版本。

  • 已创建Kubernetes集群,Kubernetes版本为v1.20及以上,且存储插件选择为CSI。具体操作,请参见创建Kubernetes托管版集群

  • CSI-Plugin和CSI-Provisioner组件版本不低于v1.22.11-abbb810e-aliyun。关于升级CSI-Plugin和CSI-Provisioner组件的操作,请参见安装与升级CSI组件

  • storage-operator组件版本不低于v1.22.86-041b094-aliyun。关于升级storage-operator组件的操作,请参见管理组件

  • 已通过kubectl工具连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

分布式缓存关键性能指标

指标

测试场景

未开启分布式缓存

开启分布式缓存

元数据性能

100万文件目录遍历耗时

18min

小于60s

创建写入4 KB文件耗时

3000μs

小于200μs

重复读取4 KB文件耗时

400μs

小于100μs

吞吐性能

单节点读写吞吐性能

200~500 MB/s

大于800 MB/s

综合场景性能

5000张150 KB图片解压缩耗时

52s

约15s

构建Redis项目耗时

27s

约21s

重要

本文以上表格提供的数据仅为理论值(参考值),实际数据以您的操作环境为准。

  • 注解①:测试数据的ECS机型为ecs.hfg6.4xlarge,测试环境的差异可能导致性能数据有一定偏差。

  • 注解②:ECS网络带宽和NAS文件系统规格会影响单节点读写吞吐性能。

步骤一:使用分布式缓存挂载NAS文件系统

  1. 执行以下命令,在集群中创建并部署csi-plugin的ConfigMap,安装加速插件。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: csi-plugin
      namespace: kube-system
    data:
      cnfs-client-properties: |
        nas-efc=true
      nas-efc-cache: |
        enable=true
        container-number=3
        volume-type=memory
        volume-size=15Gi
      node-selector: |
        cache=true
    EOF

    参数

    说明

    cnfs-client-properties

    分布式缓存的缓存开关。当配置cnfs-cache-properties. enable=true时,表示开启分布式缓存。

    nfs-efc-cache.

    container-number

    当开启分布式缓存时需要配置。

    缓存的DaemonSet的容器数量,当缓存有性能瓶颈时,可以增加容器数量。

    nfs-efc-cache.

    volume-type

    当开启分布式缓存时需要配置。

    缓存容器EmptyDir使用的介质。

    • Disk:磁盘。

    • Memory:内存。

    nfs-efc-cache.

    volume-size

    当开启分布式缓存时需要配置。表示缓存数据卷Volume的总大小,单位:GiB。

    cnfs-client-properties

    安装分布式缓存的相关依赖,则需要配置cnfs-client-properties. enable=true

    node-selector

    缓存的DaemonSet通过Label进行调度,如果不配置,则所有节点都会部署缓存。

    重要
    • 使用磁盘和内存时,会使用节点的数据盘和内存资源,请确保不影响业务运行。

    • 本示例部署了分布式缓存的DaemonSet,缓存中有3个Container,在缓存Pod容器内每个Container挂载5 GiB的tmpfs卷,并且只调度到带有cache=true标签的节点上。

    ConfigMap配置完成后,会根据已配置的ConfigMap自动部署缓存的DaemonSet以及Service。

  2. 执行以下命令,重启CSI-Plugin组件,安装相关依赖。

    kubectl get pod -nkube-system -owide | grep csi-plugin | awk '{print $1}' | xargs kubectl -nkube-system delete pod
  3. 执行以下命令,为CNFS的文件存储开启分布式缓存。

    创建一个CNFS托管NAS文件系统,StatefulSet通过使用动态存储卷的方式挂载分布式缓存,使用busybox镜像,Pod启动时会通过dd命令将1 G大小的文件写入/data下面,1 G文件后续用于测试缓存是否生效。

    展开查看开启分布式缓存使用的YAML文件

    cat << EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-nas-filesystem
    spec:
      description: "cnfs"
      type: nas
      reclaimPolicy: Retain
      parameters:
        filesystemType: standard
        storageType: Capacity
        protocolType: NFS
        encryptType: None
        enableTrashCan: "true"
        trashCanReservedDays: "5"
        useClient: "EFCClient" # 通过EFC客户端使用分布式缓存进行挂载。
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-cnfs-nas-sc
    mountOptions:
      - g_tier_EnableClusterCache=true              # 挂载时,分布式缓存使用缓存配置。
      - g_tier_EnableClusterCachePrefetch=true      # 挂载时,分布式缓存开启预读功能。
    parameters:
      volumeAs: subpath
      containerNetworkFileSystem: cnfs-nas-filesystem
      path: "/"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-nas-sts
      labels:
        app: busybox
    spec:
      serviceName: "busybox"
      replicas: 1
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox
            command: ["/bin/sh"]
            args: ["-c", "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;sleep 3600;"]
            volumeMounts:
            - mountPath: "/data"
              name: www
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alibabacloud-cnfs-nas-sc"
          resources:
            requests:
              storage: 50Gi
    EOF
  4. 执行以下命令,确认分布式缓存是否挂载成功。

    kubectl exec cnfs-nas-sts-0   -- mount | grep /data

    预期输出:

    xxx.cn-xxx.nas.aliyuncs.com:/nas-6b9d1397-6542-4410-816b-4dfd0633****:2fMaQdxU on /data type alifuse.aliyun-alinas-eac (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

    输出显示有挂载点,说明分布式缓存已挂载成功。

  5. 执行以下命令,确认分布式缓存的DaemonSet是否启动。

    kubectl get ds/cnfs-cache-ds -n kube-system -owide

    预期输出:

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS              IMAGES                                                         SELECTOR
    cnfs-cache-ds   3         3         3       3            3           <none>          19d   alinas-dadi-container   registry-vpc.cn-shenzhen.aliyuncs.com/acs/nas-cache:20220420   app=cnfs-cache-ds

    本示例的集群有3个节点,DaemonSet的3个Pod均处于可用状态,说明分布式缓存的DaemonSet已经启动完成。

  6. 执行以下命令,确认分布式缓存的Service是否实现服务发现。

    kubectl get ep cnfs-cache-ds-service  -n kube-system -owide

    预期输出:

    NAME                     ENDPOINTS                                          AGE
    cnfs-cache-ds-service   10.19.1.130:6500,10.19.1.40:6500,10.19.1.66:6500   19d

    Service已经发现后端缓存Pod对应的EndPoints为10.19.1.130、10.19.1.40、10.19.1.66,端口为6500。

步骤二:测试缓存是否生效

  1. 执行以下命令,将写入到/data中的1 G的tmpfile文件复制到/下,查看耗时时间。

    kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /

    预期输出:

    real    0m 5.66s
    user    0m 0.00s
    sys     0m 0.75s

    可以看到:未开启分布式缓存时,拷贝时间不变,保持约5s左右。

  2. 重复执行以下命令,查看耗时。

    kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /

    预期输出:

    real    0m 0.79s
    user    0m 0.00s
    sys     0m 0.58s

    可以看到:对多次访问的文件,拷贝读加速提升了6~7倍。