NAS提供了共享存儲和持久化存儲的服務,滿足您需要多個Pod共享數據的應用場景。本文介紹如何使用NAS實現共享存儲和持久化存儲。
前提條件
已在文件存儲控制臺創建一個文件系統,請參見Linux系統掛載NFS文件系統。創建的文件系統需要與您的Kubernetes集群在同一可用區。
已在創建好的文件系統中添加容器服務Kubernetes集群的掛載點,請參見管理掛載點。文件系統掛載時的VPC網絡要與您Kubernetes集群所在的VPC網絡保持一致。
背景信息
NAS支持同時被多個Pod掛載,此時多個Pod可能同時修改相同數據,需要應用自行實現數據的同步。
有狀態服務-NAS的使用場景:
對磁盤I/O要求較高的應用。
讀寫性能相對于對象存儲OSS高。
可實現跨主機文件共享,例如可作為文件服務器。
有狀態服務-NAS的使用方式:
手動創建文件系統,并添加掛載點。
手動創建PV及PVC。
本文介紹如何利用阿里云提供的flexvolume插件,通過PV或PVC的方式使用阿里云NAS。
創建PV
創建pv-nas.yaml文件。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "***-**.cn-hangzhou.nas.aliyuncs.com" # 請替換為您實際的掛載點。 path: "/k8s1" vers: "4.0"
參數
描述
alicloud-pvname
PV的名稱。
server
NAS的掛載點。可在文件存儲控制臺,單擊左側導航欄的文件系統列表,選擇目標文件系統,單擊操作列管理,在管理頁面單擊左側掛載使用,在掛載點區域,掛載地址即為NAS數據盤的掛載點。
path
NAS的掛載目錄,支持掛載NAS的子目錄,當子目錄不存在時,會在NAS上自動創建子目錄并掛載。
vers
(可選)NFS掛載協議的版本號,支持3和4.0,默認情況是3。
mode
(可選)掛載目錄的訪問權限,默認情況是不配置。
說明掛載NAS的根目錄無法配置訪問權限。
當NAS中數據量很大時,配置
mode
會導致掛載非常慢,甚至掛載失敗,不建議配置。
執行以下命令,創建PV。
kubectl create -f pv-nas.yaml
預期結果:
登錄容器服務管理控制臺。
在控制臺左側導航欄中,單擊集群。
在集群列表頁面中,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄中,選擇
,可以看到剛剛創建的PV。
創建PVC
創建NAS存儲聲明PVC,使用selector
篩選PV,精確配置PVC和PV的綁定關系。
創建pvc-nas.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas
執行以下命令,創建PVC。
kubectl create -f pvc-nas.yaml
預期結果:
登錄容器服務管理控制臺。
在控制臺左側導航欄中,單擊集群。
在集群列表頁面中,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄中,選擇
,可以看到剛剛創建的PVC。
創建應用
創建nas.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: name: nas-static labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas
執行以下命令,創建Deployment。
kubectl create -f nas.yaml
預期結果:
登錄容器服務管理控制臺。
在控制臺左側導航欄中,單擊集群。
在集群列表頁面中,單擊目標集群名稱或者目標集群右側操作列下的應用管理。
在目標集群頁面下,選擇左側導航欄的
,可以看到剛剛創建的Deployment。
NAS的共享存儲
執行以下命令,查看部署的Deployment所在Pod的名稱。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-r**** 1/1 Running 0 9m nas-static-f96b6b5d7-w**** 1/1 Running 0 9m
執行以下命令,查看/data路徑下的文件。
kubectl exec nas-static-f96b6b5d7-r**** -- ls /data
預期輸出:
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
說明/data路徑下為空,沒有文件。
執行以下命令,在任意一個Pod的/data路徑下創建文件nas。
kubectl exec nas-static-f96b6b5d7-r**** -- touch /data/nas
查看Pod下的文件。
執行以下命令,查看Pod的/data路徑下的文件。
kubectl exec nas-static-f96b6b5d7-r**** -- ls /data
預期輸出:
nas
執行以下命令,查看另一個Pod的/data路徑下的文件。
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
預期輸出:
nas
說明在任意一個Pod的/data下創建的文件,兩個Pod下的/data路徑下均存在此文件,說明兩個Pod共享一個NAS。
NAS的持久化存儲
執行以下命令,刪除該應用的所有Pod。
kubectl delete pod nas-static-f96b6b5d7-r**** nas-static-f96b6b5d7-wthmb
預期輸出:
pod "nas-static-f96b6b5d7-r****" deleted pod "nas-static-f96b6b5d7-w****" deleted
執行以下命令,查看Pod刪除及Kubernetes重建Pod的過程。
kubectl get pod -w -l app=nginx
預期輸出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-r**** 1/1 Running 0 27m nas-static-f96b6b5d7-w**** 1/1 Running 0 27m nas-static-f96b6b5d7-r**** 1/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Pending 0 0s nas-static-f96b6b5d7-w**** 0/1 Pending 0 0s nas-static-f96b6b5d7-w**** 0/1 ContainerCreating 0 0s nas-static-f96b6b5d7-w**** 1/1 Terminating 0 28m nas-static-f96b6b5d7-n**** 0/1 Pending 0 0s nas-static-f96b6b5d7-n**** 0/1 Pending 0 0s nas-static-f96b6b5d7-n**** 0/1 ContainerCreating 0 0s nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 1/1 Running 0 10s nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-n**** 1/1 Running 0 17s
執行以下命令,查看Kubernetes重建的Pod名稱。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-n**** 1/1 Running 0 21s nas-static-f96b6b5d7-w**** 1/1 Running 0 21s
查看Pod下的文件。
執行以下命令,查看Pod的/data路徑下的文件。
kubectl exec nas-static-f96b6b5d7-n**** -- ls /data
預期輸出:
nas
執行以下命令,查看另一個Pod的/data路徑下的文件。
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
預期輸出:
nas
說明剛剛創建的文件nas并沒有被刪除,說明NAS的數據可持久保存。