本文為您介紹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。再通過命令列執行
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共用儲存卷(推薦)。
關於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時使用,預設不開啟。