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-cache-properties: |
        enable=true
        container-number=3
        volume-type=memory
        volume-size=15Gi
      cnfs-client-properties: |
        enable=true
      node-selector: |
        cache=true
    EOF
    参数说明
    cnfs-cache-properties分布式缓存的缓存开关。当配置cnfs-cache-properties. enable=true时,表示开启分布式缓存。
    cnfs-cache-properties. container-number当开启分布式缓存时需要配置。

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

    cnfs-cache-properties. volume-type当开启分布式缓存时需要配置。

    缓存容器EmptyDir使用的介质。

    • Disk:磁盘
    • Memory:内存
    cnfs-cache-properties. 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文件后续用于测试缓存是否生效。
    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"
        useElasticAccelerationClient: "true" # 使用分布式缓存进行挂载。
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-cnfs-nas-sc
    mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      - 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倍。