すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:サンドボックス化されたコンテナーに NAS ファイルシステムをマウントする

最終更新日:Nov 19, 2025

従来のストレージソリューションにおける複雑なアクセスパスと高いレイテンシーは、しばしば I/O パフォーマンスを低下させます。サンドボックス化されたコンテナーに Network Attached Storage (NAS) ファイルシステムを直接マウントすると、ストレージパスが最適化され、コンテナーが NAS ファイルシステムに直接読み書きできるようになり、パフォーマンスが大幅に向上します。このトピックでは、このダイレクトマウントの仕組みと実装方法について説明します。

背景情報

Virtio-fs は、ボリューム、シークレット、ConfigMap などのリソースを仮想マシンのゲストオペレーティングシステムと共有できる共有ファイルシステムです。この設定により、NAS ファイルシステムをボリューム経由でネイティブにマウントできます。

しかし、この設定では、NAS はホストノードにマウントされます。コンテナーが NAS にアクセスする場合、その I/O は virtio-fs を経由してホストにマウントされたファイルシステムに到達する必要があり、これによりパフォーマンスのオーバーヘッドが発生します。

サンドボックス化されたコンテナーは、NAS ファイルシステムのダイレクトマウントをサポートしています。これを実現するために、システムはホストから NAS マウントポイントをアンマウントし、ゲストオペレーティングシステム内に NAS ファイルシステムをマウントし、それをコンテナーにバインドマウントします。このプロセスにより、コンテナーは NAS ファイルシステムに直接読み書きできるようになり、ネイティブに近いパフォーマンスを提供します。

仕組み

サンドボックス化されたコンテナーにおける NAS ファイルシステムのダイレクトマウントプロセスは次のとおりです。

  1. Kubelet は CSI-Plugin に NAS ボリュームのマウントをリクエストします。

  2. CSI-Plugin はホストに NAS ファイルシステムをマウントします。

  3. Kubelet は Kangaroo-Runtime にコンテナーの作成をリクエストします。

  4. Kangaroo-Runtime は NAS マウント情報を解析し、それをゲストオペレーティングシステムに渡し、同時にホストから NAS ファイルシステムをアンマウントします。

  5. Kangaroo-Runtime は Agent にコンテナーの作成をリクエストします。

  6. Agent はゲストオペレーティングシステム内に NAS ファイルシステムをマウントします。

  7. Agent はゲストオペレーティングシステムからコンテナーに NAS ファイルシステムをバインドマウントします。

前提条件

手順

  1. 静的にプロビジョニングされた PersistentVolume (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 マウントポイントアドレスに置き換えます。
                                     # フォーマット: file-system-id.region.nas.aliyuncs.com
                                     # 取得方法: 1) NAS コンソール > ファイルシステムに移動します。
                                     # 2) ファイルシステムを選択し、「マウントポイント」タブに移動します。
                                     # 3) 「マウントターゲットドメイン名」をコピーします。
            vers: "3"
          volumeHandle: nas-pv-csi
        persistentVolumeReclaimPolicy: Retain
    2. 次のコマンドを実行して、静的にプロビジョニングされた PV を作成します。

      kubectl create -f nas-pv-csi.yaml
  2. NAS ストレージ用の PersistentVolumeClaim (PVC) を作成します。selector.matchLabels を使用して、そのラベルによって 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 ダイレクトマウントは無効になっています。NAS パススルー機能を有効にするには、Pod テンプレートに次のアノテーションを追加します。

      annotations:
        storage.alibabacloud.com/enable_nas_passthrough: "true"
    2. 次のコマンドを実行してアプリケーションを作成します。

      kubectl create -f deploy-nas-csi.yaml
  4. マウントを検証します。

    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 

      出力に /data マウントポイントのエントリが含まれている場合、マウントは成功です。マウントが成功すると、次のような出力が生成されます。

      期待される出力

      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/enormoustlb type cgroup (ro,nosuid,nodev,noexec,relatime,enormoustlb)
      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)