對于共享數據,磁盤I/O要求較高的應用場景,可以使用NAS作為持久化存儲卷。本文介紹如何為應用動態掛載NAS存儲卷,并驗證NAS的共享存儲和持久化存儲。
背景信息
NAS是一種可共享訪問、彈性擴展、高可靠以及高性能的分布式文件系統,適用于共享數據,以及I/O要求較高的應用場景。更多信息,請參見存儲概述。
ACS支持靜態和動態掛載NAS存儲卷。本文介紹動態掛載方式,靜態掛載方式請參見靜態掛載NAS存儲卷。
前提條件
ACS集群中已安裝最新版本的managed-csiprovisioner組件。
您可以在ACS集群管理頁的左側導航欄選擇
,在存儲頁簽下查看managed-csiprovisioner組件的安裝情況。使用限制
不支持掛載SMB協議的NAS文件系統。
NAS文件系統只能掛載到相同VPC的Pod上,不支持跨VPC掛載。
僅支持通過NFSv3協議掛載NAS文件系統。
注意事項
NAS為共享存儲,一個NAS存儲卷可以掛載到多個Pod上。此時多個Pod可能同時修改相同數據,需要應用自行實現數據的同步。
掛載NAS時,請勿在應用的YAML中配置
securityContext.fsgroup
,這可能會造成掛載失敗。說明NAS文件系統的
/
目錄不支持修改權限、屬主和屬組。掛載NAS后,請勿刪除掛載點,否則會造成操作系統無響應。
動態掛載NAS存儲卷
步驟一:創建StorageClass
連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群或在CloudShell上通過kubectl管理Kubernetes集群。
參考參數說明表修改以下YAML內容,并保存為nas-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-fs mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: filesystem fileSystemType: standard storageType: Performance regionId: cn-shanghai zoneId: cn-shanghai-e vpcId: "vpc-2ze2fxn6popm8c2mzm****" vSwitchId: "vsw-2zwdg25a2b4y5juy****" accessGroupName: DEFAULT_VPC_GROUP_NAME deleteVolume: "false" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
相關參數說明如下:
重要不同類型和存儲規格的NAS文件系統支持的地域、可用區不同。請根據業務的存儲需求、ACS集群所屬地域和ACS集群中Pod使用的VPC和交換機信息等確定您要在哪個地域、可用區,以及哪個VPC、交換機下創建什么類型的NAS文件系統和掛載點。相關參考如下:
參數
說明
volumeAs
目前僅支持
filesystem
,表示會自動創建一個NAS文件系統,即一個NAS存儲卷對應一個NAS文件系統。fileSystemType
NAS文件系統的類型。
storageType
NAS文件系統的存儲規格。
對于通用型NAS,可選值如下:
Performance
(默認):性能型Capacity
:容量型
對于極速型NAS,可選值如下:
standard
(默認):標準型advanced
:高級型
regionId
NAS文件系統所屬地域。需與ACS集群所屬地域保持一致。
zoneId
NAS文件系統所屬可用區。請根據ACS集群中Pod所使用的交換機,選擇對應的可用區。
vpcId
、vSwitchId
NAS文件系統掛載點所屬的VPC ID和交換機ID。需配置為ACS集群中Pod使用的VPC ID和交換機ID。
accessGroupName
NAS文件系統掛載點的權限組。默認為
DEFAULT_VPC_GROUP_NAME
。provisioner
驅動類型。必須配置為
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。reclaimPolicy
PV的回收策略。目前僅支持
Retain
,表示刪除PV時,會保留對應的NAS文件系統和掛載點。創建StorageClass。
kubectl create -f nas-sc.yaml
查看StorageClass。
kubectl get sc
預期返回:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-nas-fs nasplugin.csi.alibabacloud.com Retain Immediate false 13m ......
步驟二:創建PVC
將以下YAML內容保存為nas-pvc-fs.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-pvc-fs spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-fs resources: requests: storage: 20Gi
相關參數說明如下:
參數
說明
accessModes
訪問模式。
storage
分配給Pod的存儲容量,即要創建的NAS存儲卷容量。
說明由于極速型NAS有100 GiB的最小容量限制,如果StorageClass中定義的NAS文件系統類型為極速型NAS,此處
storage
的值必須≥100 GiB,否則無法創建對應的PV。storageClassName
要綁定的StorageClass名稱。
創建PVC。
kubectl create -f nas-pvc-fs.yaml
查看PVC。
kubectl get pvc
返回示例如下,PV已關聯自動創建的PV。您可以前往NAS文件系統控制臺查看對應的NAS文件系統。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE nas-pvc-fs Bound nas-04a730ba-010d-4fb1-9043-476d8c38**** 20Gi RWX alicloud-nas-fs <unset> 14s
步驟三:創建應用并掛載NAS
使用以下YAML內容,創建nas-test-fs.yaml文件。
以下YAML示例可以創建包含2個Pod的Deployment,2個Pod均通過名為
nas-pvc-fs
的PVC申請存儲資源,掛載路徑均為/data
。apiVersion: apps/v1 kind: Deployment metadata: name: nas-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: /data volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-fs
創建Deployment并掛載NAS。
kubectl create -f nas-test-fs.yaml
查看Deployment中Pod的部署情況。
kubectl get pod | grep nas-test
返回示例如下,已創建2個Pod。
nas-test-****-***a 1/1 Running 0 40s nas-test-****-***b 1/1 Running 0 40s
查看掛載路徑。
命令示例如下,預期會返回NAS文件系統掛載目錄下的數據。默認為空。
kubectl exec nas-test-****-***a -- ls /data
驗證NAS的共享存儲和持久化存儲
按照上文示例創建的Deployment中含有2個Pod,2個Pod掛載了同一NAS文件系統。您可以通過以下方式進行驗證:
在一個Pod中創建文件,然后另一個Pod中查看文件,以此來驗證共享存儲。
重建Deployment,然后在新創建的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
。test.txt
驗證持久化存儲。
重建Deployment。
kubectl rollout restart deploy nas-test
查看Pod,等待新Pod創建成功。
kubectl get pod | grep nas-test
返回示例如下:
nas-test-****-***c 1/1 Running 0 67s nas-test-****-***d 1/1 Running 0 49s
在新Pod中查看文件系統中的數據是否存在。
以名為
nas-test-c***
的Pod作為示例:kubectl exec nas-test-****-***c -- ls /data
預期返回如下,可以看到NAS文件系統中的數據依然存在,在新Pod的掛載目錄下可以重新獲取。
test.txt