本文為您介紹NAS存儲卷常見問題的處理方法。
使用NAS存儲卷時,提示chown: Operation not permitted
問題現象
使用NAS時,提示chown: Operation not permitted。
問題原因
您啟動容器時使用的宿主機角色,沒有修改NAS的權限。
解決方案
啟動容器進程的用戶無root權限,請使用root用戶執行chown、chgrp操作。當PV的
accessModes
為ReadWriteOnce
時,還支持使用securityContext.fsGroup
為Pod配置卷訪問權限和屬主變更策略。具體操作,請參見為Pod配置卷訪問權限和屬主變更策略。如果使用root用戶操作依然報錯,請檢查確保NAS掛載點的權限組已使用所有用戶不匿名(no_squash)。具體操作,請參見管理權限組。
使用NAS動態存儲卷時,Controller的任務隊列已滿且無法創建新的PV
問題現象
使用NAS動態存儲卷時,若創建子目錄寫入速度快于Controller刪除子目錄速度,將可能導致Controller的任務隊列阻塞且無法創建新的PV。
問題原因
當集群使用動態NAS存儲卷時,配置的StorageClass回收策略reclaimPolicy為Delete且archiveOnDelete為false。
解決方案
將archiveOnDelete配置為true,當刪除PV時只是修改NAS文件系統中子目錄的名稱,而不是真正刪除文件。
具體的文件刪除操作需要您自行處理,例如:在某個節點過載根目錄啟動定時刪除機制,或啟動多個Pod并發刪除某種格式的子目錄。
NAS存儲卷掛載時間延長
問題現象
NAS存儲卷掛載時間延長。
問題原因
同時滿足以下配置時,掛載的PV及PVC將執行chmod或chown,導致掛載時間延長。
在PV及PVC模板中配置的參數AccessModes值為ReadWriteOnce。
在應用模板中配置了securityContext.fsgroup參數。
解決方案
若應用模板中配置了securityContext.fsgroup參數,請刪除securityContext下的fsgroup參數。
若需要將掛載目錄內文件變成期望的UID和mode,可以手動將目標目錄掛載到一臺ECS。關于ECS實例掛載文件系統,請參見通過控制臺實現ECS實例一鍵掛載文件系統。再通過命令行執行
chown
和chmod
,完成后通過CSI使用NAS存儲卷。關于如何通過CSI使用NAS存儲卷,請參見使用NAS靜態存儲卷或使用NAS動態存儲卷。對于1.20及之后版本的Kubernetes集群,除了上述兩種解決方法外,也可通過將fsGroupChangePolicy配置為OnRootMismatch,這時只有在首次啟動時才會執行
chmod
或chown
操作,導致存在掛載時間延長的問題,后續掛載OSS存儲卷時掛載時間將恢復正常。關于fsGroupChangePolicy參數的更多信息,請參見為Pod或容器配置安全性上下文。
使用NAS存儲卷時,無法創建或修改目錄
問題現象
使用NAS存儲卷時,無法創建或修改目錄。
問題原因
非root用戶無權寫入PV,不允許創建或修改目錄。
解決方案
您可以通過以下兩種方式,使用命令chmod
或chown
修改掛載目錄權限,然后再對目錄進行操作。
使用root權限啟動Init Container掛載PV,使用命令
chmod
或chown
修改掛載目錄權限。通過將fsGroupChangePolicy配置為OnRootMismatch,在首次啟動時會執行
chmod
或chown
命令來修改掛載目錄權限。
當工作負載掛載NAS存儲卷時,提示unknown filesystem type "xxx"
問題現象
當工作負載掛載NAS存儲卷時,提示unknown filesystem type "xxx"。
問題原因
當前工作負載調度的節點未安裝對應存儲的依賴資源。
解決方案
檢查存儲卷相關配置是否正確。
關于NAS存儲卷配置,請參見使用CNFS管理NAS共享存儲卷(推薦)。
關于CPFS相關配置,請參見CPFS2.0靜態卷。
關于OSS相關配置,請參見使用OSS靜態存儲卷。
讀寫文件時,提示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協議文件系統傳輸加密。
使用方法
開啟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
參考以下示例,進行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,此參數必須在mountProtocol為alinas時使用,默認不開啟。
使用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,此參數必須在mountProtocol為alinas時使用,默認不開啟。