全部產品
Search
文件中心

Container Service for Kubernetes:NAS儲存卷FAQ

更新時間:Jul 25, 2024

本文為您介紹NAS儲存卷常見問題的處理方法。

使用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掛載點的許可權組已使用所有使用者不匿名(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操作,導致存在掛載時間延長的問題,後續掛載OSS儲存卷時掛載時間將恢複正常。關於fsGroupChangePolicy參數的更多資訊,請參見為Pod或容器配置資訊安全內容

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

問題現象

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

問題原因

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

解決方案

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

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

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

當工作負載掛載NAS儲存卷時,提示unknown filesystem type "xxx"

問題現象

當工作負載掛載NAS儲存卷時,提示unknown filesystem type "xxx"

問題原因

當前工作負載調度的節點未安裝對應儲存的依賴資源。

解決方案

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

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

問題現象

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

問題原因

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

解決方案

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

當Pod使用兩個PVC掛載NAS儲存卷時,Pod一直處於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. 開啟NAS用戶端安裝。

    修改csi-plugin ConfigMap後重啟csi-plugin。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: csi-plugin
      namespace: kube-system
    data:
      cnfs-client-properties: |
        alinas-utils=true
    EOF
    
    kubectl rollout restart ds -n kube-system csi-plugin
  2. 參考以下樣本,進行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時使用,預設不開啟。