全部產品
Search
文件中心

Container Service for Kubernetes:在安全沙箱容器中掛載NAS

更新時間:Jun 10, 2025

傳統儲存方案訪問路徑層級多、延遲高,會造成一定的I/O效能損耗。安全沙箱NAS直接掛載可以通過最佳化儲存路徑實現在容器內直接讀寫NAS,從而有效提升效能。本文介紹安全沙箱NAS直接掛載的實現原理,以及如何將NAS直接掛載到安全沙箱容器中。

背景資訊

virtio-fs是一個共用的檔案系統,可以將Volume、Secret、ConfigMap等共用到虛擬機器GuestOS內,從而以原生的方式通過Volume掛載NAS。但這種方式下,NAS是掛載到主機上的,在容器內要經過virtio-fs讀寫主機上的NAS,由此會帶來一些效能損耗。

安全容器提供了安全沙箱NAS直接掛載的功能。該功能會先卸載主機上的NAS掛載點,然後在GuestOS內掛載NAS,最後把NAS Bind Mount到容器內,從而能夠在容器內直接讀寫NAS,達到接近原生的效能。

實現原理

實現安全沙箱的NAS直接掛載功能的流程如下:

  1. kubelet請求CSI-Plugin掛載NAS卷。

  2. CSI-Plugin在主機掛載NAS。

  3. kubelet請求Kangaroo-Runtime建立容器。

  4. Kangaroo-Runtime解析NAS掛載資訊並傳入GuestOS,同時卸載主機上的NAS。

  5. Kangaroo-Runtime請求Agent建立容器。

  6. Agent把NAS掛載到GuestOS內。

  7. Agent把GuestOS上的NAS Bind Mount到容器內。

前提條件

操作步驟

  1. 建立靜態PV。

    1. 將以下樣本YAML內容儲存為nas-pv-csi.yaml檔案。

      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}  #填寫為您實際擷取的NAS掛載點地址。
            vers: "3"
          volumeHandle: nas-pv-csi
        persistentVolumeReclaimPolicy: Retain
    2. 執行以下命令建立靜態PV。

      kubectl create -f nas-pv-csi.yaml
  2. 建立NAS儲存聲明PVC,使用selector.matchLabels篩選PV標籤,精確配置PVC和PV的綁定關係。

    1. 將以下樣本YAML內容儲存為nas-pvc-csi.yaml檔案。

      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
    2. 執行以下命令建立靜態PVC。

      kubectl create -f nas-pvc-csi.yaml
  3. 建立樣本應用,並掛載PVC。

    1. 將以下樣本YAML內容儲存為deploy-nas-csi.yaml檔案。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deploy-nas-csi
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: busybox
        template:
          metadata:
            labels:
              app: busybox
            annotations:
              storage.alibabacloud.com/enable_nas_passthrough: "true"
          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    #需要和上一步建立的PVC名稱一致,用於綁定PVC。

      預設Pod不啟用NAS直接掛載功能,您需要在模板中添加Annotation開啟NAS直通功能。

      annotations:
        storage.alibabacloud.com/enable_nas_passthrough: "true"
    2. 執行以下命令建立應用。

      kubectl create -f deploy-nas-csi.yaml
  4. 驗證NAS掛載結果。

    1. 執行以下命令,查看Pod資訊。

      kubectl get pods

      預期輸出:

      NAME                              READY   STATUS    RESTARTS   AGE
      deploy-nas-csi-847f8b****-qmv2m   1/1     Running   0          47s
      deploy-nas-csi-847f8b****-wj8k5   1/1     Running   0          47s
    2. 執行以下命令,進入指定的Pod。

      kubectl exec -it deploy-nas-csi-847f8b****-qmv2m -- sh
    3. 執行以下命令,查看掛載資訊。

      mount 

      如果執行命令後有內容,表明NAS已經掛載成功。預期輸出如下:

      預期輸出

      kataShared on / type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
      tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
      devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
      mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
      sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
      tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime)
      cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
      cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpu,cpuacct)
      cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
      cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls,net_prio)
      cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
      cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
      cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
      cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
      cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
      cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
      cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
      kataShared on /data type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      kataShared on /etc/hosts type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)   
      kataShared on /dev/termination-log type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      kataShared on /etc/hostname type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      kataShared on /etc/resolv.conf type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=64000k)
      kataShared on /var/run/secrets/kubernetes.io/serviceaccount type virtio_fs (ro,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax=inode)
      tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
      tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
      tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
      tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,size=65536k,mode=755)
      proc on /proc/bus type proc (ro,relatime)
      proc on /proc/fs type proc (ro,relatime)
      proc on /proc/irq type proc (ro,relatime)
      proc on /proc/sys type proc (ro,relatime)
      proc on /proc/sysrq-trigger type proc (ro,relatime)