本文介紹使用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掛載點的許可權組允許使用root使用者訪問檔案系統,即使用者權限配置為使用者不匿名(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操作,後續掛載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協議檔案系統傳輸加密。
安裝cnfs-nas-daemon組件。具體操作,請參見管理cnfs-nas-daemon組件。
在組件管理頁面,定位並配置csi-plugin組件,開啟
AlinasMountProxy=trueFeatureGate。參考以下樣本,進行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時使用,預設不開啟。
如何?NAS的使用者或使用者組隔離
為確保不同使用者和使用者組之間資料的安全性,您可以參考以下操作對NAS的使用者或使用者組進行隔離。
使用以下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在容器中啟動
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命令。驗證在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可以同時被多個應用使用。
關於NAS並發寫入的一些限制條件,請參見如何避免多進程或多用戶端並發寫同一記錄檔可能出現的異常?和如何解決向NFS檔案系統中寫入資料延遲問題?
關於如何掛載NAS儲存卷,請參見建立CNFS管理NAS檔案系統(推薦)、使用NAS靜態儲存卷、使用NAS動態儲存裝置卷。
在ACS掛載NAS失敗,提示failed to do setup volume
使用NAS作為 ACS 的儲存卷時,有時會出現掛載失敗,逾時後提示failed to do setup volume。這可能是由於NAS配置錯誤,請參見容器計算服務(ACS)掛載NAS瞭解正確的使用流程。
下文介紹最為常見的VPC配置錯誤的排查步驟: StorageClass中配置的掛載點地址( server)需與叢集所在 VPC 相匹配。
擷取叢集的 VPC ID。
登入容器計算服務控制台,在左側導覽列選擇集群列表。
在集群列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇配置管理 > 配置项。
切換命名空間至kube-system,定位並單擊acs-profile,按照頁面提示尋找並記錄
vpcId(如vpc-gw87c9kdqs25al2z****)。
在 NAS 控制台尋找對應的掛載點地址。
登入NAS控制台,在左側導覽列,選擇檔案系統 > 檔案系統列表,單擊目標NAS名稱。
單擊掛載使用,在掛載點地區,根據VPC ID定位當前的掛載點地址。
檢查叢集VPC ID與掛載點地址是否匹配。
如不匹配,請參見容器計算服務(ACS)掛載NAS重新設定。
使用NAS儲存卷時,無法建立或修改目錄
問題現象
使用NAS儲存卷時,無法建立或修改目錄。
問題原因
非root使用者無權寫入PV,不允許建立或修改目錄。
解決方案
您可以通過以下兩種方式,使用chmod或chown命令修改掛載目錄許可權,然後再對目錄進行操作。
使用root許可權啟動Init Container掛載PV,使用
chmod或chown命令修改掛載目錄許可權。將
fsGroupChangePolicy配置為OnRootMismatch,則在初次開機時會自動執行chmod或chown命令來修改掛載目錄許可權。
讀寫檔案時,提示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'