全部產品
Search
文件中心

Container Service for Kubernetes:NAS儲存卷FAQ

更新時間:Dec 12, 2025

本文介紹使用NAS儲存卷的常見問題和解決方案。

問題導航

類型

問題

掛載

使用

卸載

卸載NAS儲存卷逾時,Pod一直處於Terminating狀態

掛載

掛載NAS儲存卷時,提示chown: Operation not permitted

問題現象

掛載NAS儲存卷時,提示chown: Operation not permitted

問題原因

您啟動容器時使用的宿主機角色,沒有修改NAS儲存卷的許可權。

解決方案

  1. 啟動容器進程的使用者無root許可權,請使用root使用者執行chown、chgrp操作。當PV的accessModesReadWriteOnce時,您還可以使用securityContext.fsGroup為Pod配置卷存取權限和屬主變更策略。具體操作,請參見為Pod配置卷存取權限和屬主變更策略

  2. 如果使用root使用者操作依然報錯,請檢查確保NAS掛載點的許可權組允許使用root使用者訪問檔案系統,即使用者權限配置為使用者不匿名(no_squash)。具體操作,請參見系統管理權限組

掛載NAS動態儲存裝置卷時,Controller的任務隊列已滿且無法建立新的PV

問題現象

使用NAS動態儲存裝置卷時,若建立子目錄寫入速度快於Controller刪除子目錄速度,將可能導致Controller的任務隊列阻塞且無法建立新的PV。

問題原因

當叢集使用動態NAS儲存卷時,配置的StorageClass回收策略reclaimPolicyDeletearchiveOnDeletefalse

解決方案

archiveOnDelete配置為true時,刪除PV只是修改NAS檔案系統中子目錄的名稱,而不是真正刪除檔案。具體的檔案刪除操作需要您自行處理,例如:在某個節點過載根目錄啟動定時刪除機制,或啟動多個Pod並發刪除某種格式的子目錄。

NAS儲存卷掛載時間延長

問題現象

NAS儲存卷掛載時間延長。

問題原因

同時滿足以下配置時,掛載的PV及PVC將執行chmodchown,導致掛載時間延長。

  • 在PV及PVC模板中配置的參數AccessModes值為ReadWriteOnce

  • 在應用模板中配置了securityContext.fsGroup參數。

解決方案

  • 若應用模板中配置了securityContext.fsGroup參數,請刪除securityContext下的fsGroup參數。

  • 若需要將掛載目錄內檔案變成期望的UID和mode,可以手動將目標目錄掛載到一台ECS。再通過命令列執行chownchmod,完成後通過CSI使用NAS儲存卷。關於如何通過CSI使用NAS儲存卷,請參見使用NAS靜態儲存卷使用NAS動態儲存裝置卷

  • 對於1.20及以上版本的Kubernetes叢集,除了上述兩種解決方案外,也可將fsGroupChangePolicy配置為OnRootMismatch,這樣只有在初次開機時才會執行chmodchown操作,後續掛載NAS儲存卷時掛載時間將恢複正常。關於fsGroupChangePolicy參數的更多資訊,請參見為Pod或容器配置資訊安全內容

掛載NAS儲存卷時,提示unknown filesystem type "xxx"

問題現象

掛載NAS儲存卷時,提示unknown filesystem type "xxx"

問題原因

當前Pod調度的節點未安裝對應儲存的依賴資源。

解決方案

檢查儲存卷相關配置是否正確。

Pod使用兩個PVC掛載NAS儲存卷時,一直處於ContainerCreating狀態

問題現象

當Pod使用兩個PVC掛載NAS儲存卷時,Pod無法正常啟動,一直處於ContainerCreating狀態。但使用其中任意一個PVC掛載時,可成功掛載。

問題原因

兩個PVC關聯的PV聲明了同樣的spec.csi.volumeHandle,導致Kubelet在處理PV掛載邏輯時,始終將兩個PV當成同一個對待。

解決方案

您需要修改spec.csi.volumeHandle欄位的值,使其和對應的PV Name保持一致。

如何通過CSI使用TLS掛載NAS檔案系統

NAS支援通過TLS協議保護用戶端與NAS服務之間網路傳輸鏈路上的資料安全,確保資料在傳輸過程中不被竊取或篡改。CSI支援通過配置掛載協議為alinas來使用阿里雲NAS用戶端掛載儲存卷,開啟TLS掛載選項。

重要

NAS用戶端工具使用Stunnel監聽進程進行TLS加密代理。對於吞吐密集型應用,Stunnel監聽進程會消耗大量CPU執行加解密操作。在極端情況下,每個掛載會佔用一整個核。更多資訊,請參見NFS協議檔案系統傳輸加密

  1. 安裝cnfs-nas-daemon組件。具體操作,請參見管理cnfs-nas-daemon組件

  2. 組件管理頁面,定位並配置csi-plugin組件,開啟AlinasMountProxy=true FeatureGate。

  3. 參考以下樣本,進行NAS動態磁碟區和NAS靜態卷的掛載。

    使用NAS動態磁碟區樣本

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-nas-tls
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    - tls   # 增加tls mount option。
    parameters:
      volumeAs: subpath
      server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/"
      mountProtocol: alinas  # 聲明使用alinas用戶端進行掛載。
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-tls
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-tls
      resources:
        requests:
          storage: 20Gi

    參數

    說明

    parameters.mountProtocol

    設定為alinas,表示使用阿里雲NAS用戶端掛載;預設為空白,表示使用NFS協議掛載。

    mountOptions

    增加參數tls表示開啟TLS,此參數必須在mountProtocolalinas時使用,預設不開啟。

    使用NAS靜態卷樣本

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nas-tls
      labels:
        alicloud-pvname: pv-nas-tls
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      csi:
        driver: nasplugin.csi.alibabacloud.com
        volumeHandle: pv-nas   # 必須與PV Name保持一致。
        volumeAttributes:
          server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com"
          path: "/csi"
          mountProtocol: alinas # 聲明使用alinas用戶端進行掛載。
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      - tls # 增加 tls mount option
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas-tls
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas-tls

    參數

    說明

    spec.csi.volumeAttributes.mountProtocol

    設定為alinas,表示使用阿里雲NAS用戶端掛載;預設為空白,表示使用NFS協議掛載。

    spec.mountOptions

    增加參數tls表示開啟TLS,此參數必須在mountProtocolalinas時使用,預設不開啟。

如何?NAS的使用者或使用者組隔離

為確保不同使用者和使用者組之間資料的安全性,您可以參考以下操作對NAS的使用者或使用者組進行隔離。

  1. 使用以下YAML內容,在容器組內使用nobody使用者啟動進程,建立的目錄UID和GID為65534。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nas-sts
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          securityContext:
            fsGroup: 65534    #建立目錄/檔案時,UID/GID為65534(nobody使用者)。
            fsGroupChangePolicy: "OnRootMismatch"    #只有根目錄的屬主與存取權限與卷所期望的許可權不一致時, 才改變其中內容的屬主和存取權限。
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            securityContext:
              runAsUser: 65534    #所有容器內的進程都使用使用者ID為65534(nobody使用者)來運行。
              runAsGroup: 65534   #所有容器中的進程都以主組ID為65534(nobody使用者)來運行。
              allowPrivilegeEscalation: false
            volumeMounts:
            - name: nas-pvc
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: nas-pvc
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alicloud-nas-subpath"
          resources:
            requests:
              storage: 100Gi
  2. 在容器中啟動top命令,查看USER是否為nobody。

    kubectl exec nas-sts-0 -- "top"

    預期輸出:

    Mem: 11538180K used, 52037796K free, 5052K shrd, 253696K buff, 8865272K cached
    CPU:  0.1% usr  0.1% sys  0.0% nic 99.7% idle  0.0% io  0.0% irq  0.0% sirq
    Load average: 0.76 0.60 0.58 1/1458 54
      PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
       49     0 nobody   R     1328  0.0   9  0.0 top
        1     0 nobody   S     1316  0.0  10  0.0 sleep 3600

    預期輸出表明,是nobody使用者執行的top命令。

  3. 驗證在NAS掛載目錄下建立的目錄和檔案是否為nobody

    kubectl exec nas-sts-0 -- sh -c "touch /data/test; mkdir /data/test-dir; ls -arlth /data/"

    預期輸出:

    total 5K
    drwxr-xr-x    1 root     root        4.0K Aug 30 10:14 ..
    drwxr-sr-x    2 nobody   nobody      4.0K Aug 30 10:14 test-dir
    -rw-r--r--    1 nobody   nobody         0 Aug 30 10:14 test
    drwxrwsrwx    3 root     nobody      4.0K Aug 30 10:14 .

    預期輸出表明,在/data下建立的test檔案和test-dir目錄中,UID和GID對應的使用者均為nobody使用者。

多個容器應用是否可以使用同一個NAS儲存卷

NAS為共用儲存,可以同時為多個Pod提供共用儲存服務,即一個PVC可以同時被多個應用使用。

在ACS掛載NAS失敗,提示failed to do setup volume

使用NAS作為 ACS 的儲存卷時,有時會出現掛載失敗,逾時後提示failed to do setup volume。這可能是由於NAS配置錯誤,請參見容器計算服務(ACS)掛載NAS瞭解正確的使用流程。

下文介紹最為常見的VPC配置錯誤的排查步驟: StorageClass中配置的掛載點地址( server)需與叢集所在 VPC 相匹配。

  1. 擷取叢集的 VPC ID。

    1. 登入容器計算服務控制台,在左側導覽列選擇集群列表

    2. 集群列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇配置管理 > 配置项

    3. 切換命名空間至kube-system,定位並單擊acs-profile,按照頁面提示尋找並記錄vpcId(如vpc-gw87c9kdqs25al2z****)。

  2. 在 NAS 控制台尋找對應的掛載點地址。

    1. 登入NAS控制台,在左側導覽列,選擇檔案系統 > 檔案系統列表,單擊目標NAS名稱。

    2. 單擊掛載使用,在掛載點地區,根據VPC ID定位當前的掛載點地址。

  3. 檢查叢集VPC ID與掛載點地址是否匹配。

    如不匹配,請參見容器計算服務(ACS)掛載NAS重新設定。

使用NAS儲存卷時,無法建立或修改目錄

問題現象

使用NAS儲存卷時,無法建立或修改目錄。

問題原因

非root使用者無權寫入PV,不允許建立或修改目錄。

解決方案

您可以通過以下兩種方式,使用chmodchown命令修改掛載目錄許可權,然後再對目錄進行操作。

  • 使用root許可權啟動Init Container掛載PV,使用chmodchown命令修改掛載目錄許可權。

  • fsGroupChangePolicy配置為OnRootMismatch,則在初次開機時會自動執行chmodchown命令來修改掛載目錄許可權。

讀寫檔案時,提示NFS Stale File Handle

問題現象

用戶端讀寫檔案時,提示NFS Stale File Handle

問題原因

容器掛載使用NAS儲存卷時,NAS不會保證資料一致性。兩個用戶端掛載同一個NAS,用戶端1開啟檔案擷取檔案的fd,此時若用戶端2刪除了當前檔案,則用戶端1在讀寫檔案時,會提示NFS Stale File Handle。

解決方案

NAS不會保證資料一致性,您需要根據業務情境自行解決資料一致性問題。

卸載

卸載NAS儲存卷逾時,Pod一直處於Terminating狀態

問題現象

刪除掛載了NAS儲存卷的Pod時,無法卸載NAS儲存卷,Pod一直處於Terminating狀態。

問題原因

由於csi-plugin直接掛載了/var/run導致。可通過以下命令確認,若輸出不為空白,則存在直接掛載/var/run

kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'

解決方案

請通過以下命令手動修複csi-plugin的YAML檔案,修複之後問題即可解決。

kubectl patch -n kube-system daemonset csi-plugin -p '
spec:
  template:
    spec:
      containers:
        - name: csi-plugin
          volumeMounts:
            - mountPath: /host/var/run/efc
              name: efc-metrics-dir
            - mountPath: /host/var/run/ossfs
              name: ossfs-metrics-dir
            - mountPath: /host/var/run/
              $patch: delete
      volumes:
        - name: ossfs-metrics-dir
          hostPath:
            path: /var/run/ossfs
            type: DirectoryOrCreate
        - name: efc-metrics-dir
          hostPath:
            path: /var/run/efc
            type: DirectoryOrCreate
        - name: fuse-metrics-dir
          $patch: delete'