NAS儲存卷適用於巨量資料分析、共用資料、Web應用以及儲存日誌等情境。除使用靜態儲存卷外,您也可以建立PVC並配置StorageClass來實現儲存資源的動態分配,讓系統為您自動預留持久化儲存卷,無需預先手動建立和配置儲存資源。您可以通過subpath方式、sharepath方式以及filesystem方式掛載NAS動態儲存裝置卷。
前提條件
叢集已安裝CSI組件(預設安裝)。
如需升級,請參見升級CSI組件。
已開通Apsara File Storage NAS服務。
首次登入Apsara File Storage NAS產品詳情頁時,按照頁面引導開通服務。
使用限制
不支援掛載SMB協議的NAS檔案系統。
NAS檔案系統只能掛載到相同VPC的Pod上,不支援跨VPC掛載。
說明同一VPC下,NAS可以跨可用性區域掛載。
通用型NAS與極速型NAS在掛載連通性、檔案系統數量及協議類型等方面存在相應約束條件。更多資訊,請參見使用限制。
注意事項
禁止刪除掛載點:儲存卷使用期間,請勿在NAS控制台刪除其對應的掛載點,以免導致節點I/O異常。
並發寫入:NAS為共用儲存。當多個Pod同時掛載一個儲存卷時,應用自身需要處理並發寫入可能帶來的資料一致性問題。
關於NAS並發寫入的一些限制條件,請參見如何避免多進程或多用戶端並發寫同一記錄檔可能出現的異常?和讀寫訪問檔案類問題。
掛載效能:若在應用中配置了
securityContext.fsgroup,kubelet會在掛載後遞迴執行chmod或chown操作,可能導致Pod啟動時間顯著延長。如需最佳化,請參見NAS儲存卷FAQ。
掛載說明
StorageClass中的volumeAs參數可以定義PV和NAS檔案系統(及其子目錄)的對應關係,請根據您的業務情境選擇合適的掛載方式。
掛載方式 | 說明 | 使用情境 |
建立子目錄類型的PV,一個PV對應一個NAS檔案系統的子目錄。 |
| |
建立PV時不會建立實際的目錄,每個PV實際上會對應同一個NAS目錄。 | 多個跨Namespace的Pod掛載同一個NAS子目錄。 | |
使用filesystem方式掛載(不推薦) | 自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。 | 單獨使用一個NAS檔案系統。需要動態建立和刪除NAS檔案系統和掛載點。 |
使用subpath方式掛載
使用subpath方式掛載時,請確保CSI組件的版本為1.31.4及以上。如需升級,請參見升級CSI組件。
步驟一:擷取NAS檔案系統和掛載點資訊
步驟二:建立儲存類(StorageClass)
kubectl
修改以下YAML內容,並儲存為alicloud-nas-subpath.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-subpath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s" archiveOnDelete: "true" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain allowVolumeExpansion: true參數
描述
mountOptionsNAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議。
parametersvolumeAs掛載方式。本樣本設定為
subpath,表示建立子目錄類型的PV。一個PV對應一個NAS檔案系統的子目錄。server要掛載的NAS檔案系統的掛載點地址及子目錄。格式為
<NAS掛載點地址>:<掛載目錄>。如未設定子目錄,則預設掛載根目錄/。archiveOnDelete表示在
reclaimPolicy為Delete時,是否刪除後端隱藏檔資料。由於NAS為共用儲存,添加此選項進行雙重確認。true(預設):不會真正刪除目錄或檔案,而是將其重新命名,格式為archived-{pvName}.{timestamp}。false:會真正刪除後端對應的儲存資源。
說明業務流量非常大時,不建議配置為false。更多資訊,請參見使用NAS動態儲存裝置卷時Controller的任務隊列已滿且無法建立新的PV。
如需完全刪除後端儲存的檔案資料,僅支援通過kubectl方式設定
parameters.archiveOnDelete為false進行刪除。
provisioner驅動類型。固定為
nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI外掛程式。reclaimPolicyPV的回收策略,預設為
Delete,支援Retain。Delete:需配合archiveOnDelete一起使用。當
archiveOnDelete為true時,刪除PVC時,NAS中的檔案只會被重新命名,不會被刪除。當
archiveOnDelete為false時,刪除PVC時,NAS中的檔案會被真正刪除。重要此處真正刪除的是NAS的subpath目錄以及其中的檔案,NAS檔案系統本身不會被刪除,如需繼續刪除NAS檔案系統,請參見刪除檔案系統。
Retain:刪除PVC的時候,PV和NAS中檔案不會被刪除,需要您手動刪除。
如果資料安全性要求高,推薦使用
Retain方式以免誤刪資料。allowVolumeExpansion僅通用型NAS檔案系統支援設定此參數。開啟時,該StorageClass動態建立的PV將會被配置NAS目錄配額以限制可使用的容量,並支援通過更新PVC進行卷容量擴容。更多資訊,請參見為NAS動態儲存裝置卷設定目錄配額。
說明NAS配額的生效是非同步,即動態建立出PV後,目錄配額不能保證立即生效,且快速連續寫入大量資料可能會超出設定的容量上限。關於NAS目錄配額的更多資訊,請參見目錄配額。
建立StorageClass。
kubectl create -f alicloud-nas-subpath.yaml
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在儲存類頁面,單擊建立。
在建立對話方塊中,StorageClass的相關配置完成後,單擊建立。
主要配置項如下所示。
配置項
說明
樣本值
名稱
StorageClass的名稱。格式要求請參考介面提示。
alicloud-nas-subpath
儲存卷類型
選擇NAS。
NAS
選擇掛載點
NAS檔案系統的掛載點地址。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com
儲存卷模式
儲存卷訪問模式。本樣本選擇子目錄,即使用subpath方式掛載,會在掛載路徑下自動建立子目錄。資料將儲存於
<NAS掛載點>:<掛載路徑>/<pv-name>/下。說明子目錄模式僅在CSI組件為1.31.4及以上版本時生效,否則均為共用目錄模式。
子目錄
掛載路徑
要掛載的NAS子目錄。
如果未設定,則預設掛載到根目錄。
如果NAS中沒有該目錄,會自動建立後再進行掛載。
說明通用型NAS的根目錄為
/,極速型NAS的根目錄為/share。掛載極速型NAS的子目錄時,path必須以/share開頭,如/share/data。/k8s
回收策略
PV的回收策略。推薦使用Retain模式,以免誤刪資料。
Delete:需配合
archiveOnDelete一起使用。由於控制台介面暫不支援配置archiveOnDelete,僅在此處選擇Delete不會生效,即刪除PVC時不會真正刪除PV和NAS檔案。如需配置archiveOnDelete請通過YAML建立PV,具體YAML樣本,請參考kubectl操作。Retain:刪除PVC時,PV和NAS檔案不會被刪除,需要您手動刪除。
Retain
掛載選項
NAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議。
保持預設
建立成功後,可在儲存類列表查看建立的StorageClass。
步驟三:建立儲存聲明(PVC)
kubectl
修改YAML內容,並儲存為nas-pvc.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-subpath resources: requests: storage: 20Gi參數
說明
accessModes配置訪問模式。預設為
ReadWriteMany,支援ReadWriteOnce或ReadOnlyMany。storageClassName要綁定的StorageClass的名稱。
storage聲明所需使用的儲存卷的容量。
建立PVC。
kubectl create -f nas-pvc.yaml查看PV。
kubectl get pvc預期返回如下,可以看到CSI已基於StorageClass自動建立了PV,並綁定到PVC。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-a7540d97-0f53-4e05-b7d9-557309****** 20Gi RWX Retain Bound default/nas-csi-pvc alicloud-nas-subpath <unset> 5m
控制台
在叢集管理頁左側導覽列,選擇。
在儲存聲明頁面,單擊建立。
在彈出的建立儲存聲明頁面中,配置完成後,單擊建立。
配置項
說明
樣本值
儲存宣告類型
選擇NAS。
NAS
名稱
建立的儲存聲明名稱在命名空間內必須唯一。
pvc-nas
分配模式
本樣本選擇使用儲存類動態建立。
使用儲存類動態建立
已有儲存類
單擊選擇儲存類,在彈出的對話中選擇上一步建立的儲存類。
alicloud-nas-subpath
總量
建立儲存卷的容量,此處設定的大小不會限制應用可使用的最大容量。
20Gi
訪問模式
預設為ReadWriteMany,也可選擇ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
步驟四:建立應用並掛載NAS
kubectl
建立2個Deployment並掛載同一PVC,使其共用同一個NAS檔案系統的同一個子目錄。
如果要為多個Pod掛載同一NAS檔案系統的不同子目錄,請按照子目錄建立不同的StorageClass和對應的PVC,再分別掛載PVC。
修改以下YAML內容,分別儲存為nginx-1.yaml和nginx-2.yaml。
YAML樣本如下,除
metadata.name外,nginx-1.yaml和nginx-2.yaml的其他配置均一致,2個應用綁定同一PVC。nginx-1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test-1 labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" # NAS在容器中的掛載路徑 volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc # 用於綁定PVCnginx-2.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test-2 labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" # NAS在容器中的掛載路徑 volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc # 用於綁定PVC建立2個Deployment。
kubectl create -f nginx-1.yaml -f nginx-2.yaml查看Pod資訊。
kubectl get pod -l app=nginx預期返回如下,已為不同的應用掛載同一個NAS檔案系統的同一個子目錄。
NAME READY STATUS RESTARTS AGE nas-test-1-b75d5b6bc-vqwq9 1/1 Running 0 51s nas-test-2-b75d5b6bc-8k9vx 1/1 Running 0 44s
控制台
重複以下操作,分別建立2個Deployment並掛載同一PVC,使其共用同一個NAS檔案系統的同一個子目錄。
在叢集管理頁左側導覽列,選擇。
在無狀態頁面,單擊使用鏡像建立。
配置建立應用的參數資訊。
主要參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載Deployment。
配置項
參數
說明
樣本
應用基本資料
應用程式名稱
Deployment名稱,自訂輸入。格式要求請參考介面提示。
deployment-nas-1
副本數量
Deployment的副本數量。
1
容器配置
鏡像名稱
用於部署應用的鏡像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需資源
所需的vCPU和記憶體資源。
0.25 vCPU,512 MiB
資料卷
單擊增加雲端儲存聲明,然後完成參數配置。
掛載源:選擇之前建立的PVC。
容器路徑:輸入NAS檔案系統要掛載到的容器路徑。
掛載源:pvc-nas
容器路徑:/data

查看應用部署狀態。
在無狀態頁面,單擊應用程式名稱。
在容器組頁簽下,確認Pod已正常運行(狀態為Running)。
使用sharepath方式掛載
步驟一:擷取NAS檔案系統和掛載點資訊
步驟二:建立儲存類(StorageClass)
kubectl
儲存以下內容至alicloud-nas-sharepath.yaml檔案,並根據需求修改相關參數。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-sharepath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: sharepath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/sharepath" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain參數
描述
mountOptionsNAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議。
parametersvolumeAs掛載方式。本樣本設定為
sharepath,表示建立PV時不會建立實際的目錄,將會直接使用StorageClass裡設定的路徑,即每個PV實際上會對應同一個NAS目錄。server要掛載的NAS檔案系統的掛載點地址及子目錄。格式為
<NAS掛載點地址>:<掛載目錄>。如未設定子目錄,則預設掛載根目錄
/。如果NAS中沒有該目錄,會自動建立後再進行掛載。
通用型NAS的根目錄為
/,極速型NAS的根目錄為/share。掛載極速型NAS的子目錄時,path必須以/share開頭,如/share/data。provisioner驅動類型。固定為
nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI外掛程式。reclaimPolicyPV的回收策略。使用sharepath方式掛載時必須要設定為
Retain。建立StorageClass。
kubectl create -f alicloud-nas-sharepath.yaml
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在儲存類頁面,單擊建立。
在建立對話方塊中,StorageClass的相關配置完成後,單擊建立。
主要配置項如下所示。
配置項
說明
樣本值
名稱
StorageClass的名稱。格式要求請參考介面提示。
alicloud-nas-sharepath
儲存卷類型
選擇NAS。
NAS
選擇掛載點
NAS檔案系統的掛載點地址。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com
儲存卷模式
儲存卷訪問模式。本樣本選擇共用目錄,即使用sharepath方式掛載,表示建立PV時不會建立實際的目錄,將會直接使用StorageClass裡設定的路徑,這意味著每個PV實際上會對應同一個NAS目錄,便於跨Namespace共用目錄使用情境。
共用目錄
掛載路徑
要掛載的NAS子目錄。
如果未設定,則預設掛載到根目錄。
如果NAS中沒有該目錄,會自動建立後再進行掛載。
說明通用型NAS的根目錄為
/,極速型NAS的根目錄為/share。掛載極速型NAS的子目錄時,path必須以/share開頭,如/share/data。/sharepath
回收策略
使用sharepath方式掛載時必須要設定為
Retain。Retain
掛載選項
NAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議。
保持預設
建立成功後,可在儲存類列表查看建立的StorageClass。
步驟三:建立儲存聲明(PVC)
以下樣本將在2個不同Namespace下建立PVC,
kubectl
為實現跨Namespace下Pod的掛載NAS,您需要先建立2個不同的Namespace。
建立命名空間ns1和ns2。
kubectl create ns ns1 kubectl create ns ns2修改以下YAML內容,並儲存為pvc.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns1 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns2 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi參數
說明
accessModes配置訪問模式。預設為
ReadWriteMany,支援ReadWriteOnce或ReadOnlyMany。storageClassName要綁定的StorageClass的名稱。
storage聲明所需使用的儲存卷的容量。
建立PVC。
kubectl create -f pvc.yaml查看PV。
kubectl get pv預期返回如下,可以看到CSI已基於StorageClass自動建立了2個PV,並綁定到不同命名空間下的2個PVC。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-0b448885-6226-4d22-8a5b-d0768c****** 20Gi RWX Retain Bound ns1/nas-csi-pvc alicloud-nas-sharepath <unset> 74s nas-bcd21c93-8219-4a11-986b-fd934a****** 20Gi RWX Retain Bound ns2/nas-csi-pvc alicloud-nas-sharepath <unset> 74s
控制台
建立命名空間ns1和ns2,請參見建立命名空間。
在叢集管理頁左側導覽列,選擇。
在命名空間ns下,建立一個儲存聲明。
在儲存聲明頁面,選擇命名空間為ns1,單擊建立。
在彈出的建立儲存聲明頁面中,配置完成後,單擊建立。
配置項
說明
樣本值
儲存宣告類型
選擇NAS。
NAS
名稱
建立的儲存聲明名稱在命名空間內必須唯一。
pvc-nas
分配模式
本文中選擇使用儲存類動態建立。
使用儲存類動態建立
已有儲存類
單擊選擇儲存類,在彈出的對話方塊中選擇已建立的儲存類。
alicloud-nas-sharepath
總量
建立的儲存卷的容量。
20Gi
訪問模式
預設為ReadWriteMany,也可選擇ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
參考上一步,在命名空間ns2下,再建立一個儲存聲明。
返回儲存聲明頁面,在命名空間ns1和ns2下,確認2個PVC均已綁定自動建立的PV。
步驟四:建立應用並掛載NAS
在2個不同Namespace下分別建立應用,並掛載相應Namespace下的PVC,它們將共用StorageClass中定義的NAS目錄。
kubectl
修改以下YAML內容,分別儲存為nginx-ns1.yaml和nginx-ns2.yaml。
YAML樣本如下,除
metadata.namespace外,nginx-ns1.yaml和nginx-ns2.yaml的其他配置均一致,2個應用分別綁定相應Namespace下的PVC。nginx-ns1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test namespace: ns1 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvcnginx-ns2.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test namespace: ns2 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc建立2個Deployment。
kubectl create -f nginx-ns1.yaml -f nginx-ns2.yaml查看Pod資訊。
kubectl get pod -A -l app=nginx預期返回如下,已為不同Namespace下的Pod掛載同一個NAS檔案系統的子目錄。
NAMESPACE NAME READY STATUS RESTARTS AGE ns1 nas-test-b75d5b6bc-ljvfd 1/1 Running 0 2m19s ns2 nas-test-b75d5b6bc-666hn 1/1 Running 0 2m11s
控制台
在叢集管理頁左側導覽列,選擇。
在命名空間ns1下,建立一個Deployment,並掛載相應的PVC。
選擇命名空間為ns1,單擊使用鏡像建立。
配置建立應用的參數資訊。
主要參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載Deployment。
配置項
參數
說明
樣本
應用基本資料
應用程式名稱
Deployment名稱,自訂輸入。格式要求請參考介面提示。
nginx
副本數量
Deployment的副本數量。
2
容器配置
鏡像名稱
用於部署應用的鏡像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需資源
所需的vCPU和記憶體資源。
0.25 vCPU,512 MiB
資料卷
單擊增加雲端儲存聲明,然後完成參數配置。
掛載源:選擇之前建立的PVC。
容器路徑:輸入NAS檔案系統要掛載到的容器路徑。
掛載源:pvc-nas
容器路徑:/data

參考上一步,在命名空間ns2下,再建立一個Deployment,並掛載相應的PVC。
返回無狀態頁面,在命名空間ns1和ns2下,分別查看2個Deployment的部署情況,確認Pod已正常Running,且掛載了對應的PVC。
使用filesystem方式掛載
當應用需要動態建立和刪除NAS檔案系統和掛載點時,您可以使用filesystem方式掛載NAS,使用filesystem類型NAS儲存卷的Pod只能建立一個檔案系統和一個掛載點。
filesystem類型的NAS動態磁碟區在刪除時預設保留檔案系統和掛載點,如需在釋放PV資源的同時釋放NAS檔案系統和掛載點,則需要同時設定StorageClass中的reclaimPolicy為Delete且deleteVolume的值為true。
步驟一:RAM Policy設定和授予(僅ACK專有叢集需執行)
步驟二:建立儲存類(StorageClass)
步驟三:建立儲存聲明(PVC)
步驟四:建立應用並掛載NAS
驗證NAS的共用儲存和持久化儲存
按照上文樣本建立的多個Pod掛載了同一NAS檔案系統。您可以通過以下方式進行驗證:
在一個Pod中建立檔案,然後另一個Pod中查看檔案,以此來驗證共用儲存。
重建Deployment,然後在新建立的Pod中查看檔案系統中的資料是否存在,以此來驗證持久化儲存。
查看Pod資訊,擷取Pod名稱。
kubectl get pod | grep nas-test預期輸出:
nas-test-*****a 1/1 Running 0 40s nas-test-*****b 1/1 Running 0 40s在一個Pod中建立檔案。
以名為
nas-test-*****a的Pod作為樣本:kubectl exec nas-test-*****a -- touch /data/test.txt在另一個Pod中查看檔案是否存在。
以名為
nas-test-*****b的Pod為例。kubectl exec nas-test-*****b -- ls /data預期輸出:
test.txt可以查看到此前建立的檔案,表明資料可在多Pod間共用。
常見問題
在掛載和使用NAS儲存卷的過程中,如果遇到問題,可參考以下文檔進行排查。
相關文檔
通過CNFS可以實現對NAS檔案系統的獨立管理,提升NAS檔案系統的效能和QoS控制。具體操作,請參見通過CNFS管理NAS檔案系統(推薦)。
通過subpath方式掛載的通用型NAS支援目錄配額功能,可以為子目錄PV設定容量限制,提高資源使用率。具體操作,請參見為NAS動態儲存裝置卷設定目錄配額。
