您可以通过使用基于CSI-Plugin的NAS直挂沙箱功能,有效地解决IO性能问题。本文介绍安全沙箱基于CSI Plugin的NAS直挂沙箱的实现原理,并通过示例说明如何通过NAS直挂沙箱,以及对比CSI-Plugin NAS直挂沙箱、Host和9PFS三种挂载方式的IO性能。

背景信息

安全沙箱使用轻量虚拟机技术使容器跑在不同的虚拟机上,比起runC容器提供了更好的隔离性和安全性。安全沙箱容器支持以Volume形式挂载NAS。社区方案中,NAS先被挂载到宿主机本地目录,再用9PFS文件系统把本地目录共享到容器内,但是9PFS文件系统会导致容器内IO性能急剧下降。为了解决IO性能问题,容器服务Kubernetes版(ACK)安全沙箱提供了基于CSI-Plugin的NAS直挂沙箱功能。该功能对NAS挂载位置和挂载时间做了调整:挂载位置由宿主机上挂载改为容器内挂载;挂载时间由容器启动前挂载延迟到容器启动后挂载。由于容器内不再经过9PFS文件系统访问NAS,所以基于CSI-Plugin的NAS直挂沙箱有效地解决IO性能问题。

从安全沙箱v1.1.0版本开始,ACK默认会为所有安全沙箱容器启用基于CSI-Plugin的NAS直挂沙箱功能。
图 1. 社区和ACK安全沙箱的云盘/NAS挂载方案对比图
挂载方案图

实现原理

挂载原理
实现基于CSI Plugin的NAS直挂沙箱功能的流程说明如下。
步骤序号 说明
Kubelet请求CSI-Plugin挂载NAS卷。
CSI-Plugin调用QueryServer服务(该服务是一个本地数据库,库里保存了挂载卷的信息)查看是否有挂载卷信息。
CSI-Plugin发现没有该挂载卷信息,就把信息写入到本地库,并记录挂载点、挂载目录等信息。
Pod的准备工作就绪后,Kubelet开始创建容器,该请求最终会转发到Kata-Runtime。
Kata-Runtime调用QueryServer服务查看该挂载卷,获取到挂载点、挂载目录等信息。
Kata-Runtime请求Kata-Agent。
Kata-Agent启动容器并挂载该卷。

示例

以下通过创建NAS实例及使用YAML模板创建资源对象举例说明如何在安全沙箱容器中挂载NAS卷。

  1. 创建一个NAS实例。具体操作步骤请参见步骤一:创建文件系统
    注意 NAS实例的VPC需要和集群的VPC一致。
    获取到NAS实例挂载点地址,如下图挂载命令中的file-system-id.region.nas.aliyuncs.com即为挂载点地址。NAS
    说明 file-system-id.region.nas.aliyuncs.com:表示挂载点地址。您可以在NAS控制台中,单击模板文件系统名称,在挂载使用页面获取挂载点地址。
  2. 执行以下命令使用模板创建资源对象。
    注意 您需要把模板中的${nas-server-address} 替换成上述的NAS实例挂载点地址。
    cat <<EOF | kubectl create -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nas-pvc-csi
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: nas-pv-csi
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        alicloud-pvname: nas-pv-csi
      name: nas-pv-csi
    spec:
      accessModes:
        - ReadWriteMany
      capacity:
        storage: 5Gi
      csi:
        driver: nasplugin.csi.alibabacloud.com
        volumeAttributes:
          options: noresvport,nolock
          path: /csi
          server: ${nas-server-address}
          vers: "3"
        volumeHandle: nas-pv-csi
      persistentVolumeReclaimPolicy: Retain
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deploy-nas-csi
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          runtimeClassName: runv
          containers:
            - name: busybox
              image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
              command: 
              - tail
              - -f
              - /dev/null
              volumeMounts:
                - name: nas-pvc
                  mountPath: "/data"
          restartPolicy: Always
          volumes:
            - name: nas-pvc
              persistentVolumeClaim:
                claimName: nas-pvc-csi
    EOF
  3. 执行以下命令进入Pod内验证挂载点类型。
    kubectl get pods
    kubectl exec -it ${podid} sh
    mount | grep /data | grep nfs
    如果执行命令后有内容的话,表明NAS直挂沙箱功能成功了。

Host、CSI-Plugin NAS直挂沙箱、9PFS的IO性能对比

  • 随机读IOPS

    NAS挂载方式 结果
    Host read: IOPS=24.3k, BW=94.8MiB/s (99.4MB/s)(5687MiB/60004msec)
    CSI-Plugin NAS直挂沙箱 read: IOPS=26.0k, BW=102MiB/s (107MB/s)(6101MiB/60005msec)
    9PFS read: IOPS=780, BW=3120KiB/s (3195kB/s)(183MiB/60001msec)
  • 随机写IOPS

    NAS挂载方式 结果
    Host write: IOPS=14.3k, BW=55.9MiB/s (58.6MB/s)(3354MiB/60006msec)
    CSI-Plugin NAS直挂沙箱 write: IOPS=13.8k, BW=53.8MiB/s (56.4MB/s)(3226MiB/60008msec)
    9PFS write: IOPS=356, BW=1428KiB/s (1462kB/s)(83.7MiB/60001msec)
  • 随机读吞吐

    NAS挂载方式 结果
    Host read: IOPS=331, BW=331MiB/s (347MB/s)(29.9GiB/92439msec)
    CSI-Plugin NAS直挂沙箱 read: IOPS=251, BW=252MiB/s (264MB/s)(29.9GiB/121561msec)
    9PFS read: IOPS=130, BW=130MiB/s (136MB/s)(7861MiB/60422msec)
  • 随机写吞吐

    NAS挂载方式 结果
    Host write: IOPS=507, BW=507MiB/s (532MB/s)(29.9GiB/60372msec)
    CSI-Plugin NAS直挂沙箱 write: IOPS=508, BW=508MiB/s (533MB/s)(29.9GiB/60255msec)
    9PFS write: IOPS=1, BW=1500KiB/s (1536kB/s)(88.0MiB/60061msec)

从以上数据看出,不论是IO吞吐还是IOPS,CSI-Plugin NAS直挂沙箱和Host模式(在Host上直接挂载NAS)几乎持平,而CSI-Plugin NAS直挂沙箱的IO性能明显好于9PFS。