全部產品
Search
文件中心

Container Service for Kubernetes:使用NAS動態儲存裝置卷

更新時間:Jan 28, 2026

基於NAS動態儲存裝置卷,系統可以為工作負載按需自動建立和分配儲存空間,無需預先建立PV。這不僅能滿足資料持久化和共用(多Pod同時讀寫)的需求,還可以簡化Web應用、日誌儲存等情境下的儲存管理。

工作原理

使用動態儲存裝置卷時,應用在建立PVC時,系統會根據PVC指定的StorageClass,按需自動建立一個全新的儲存卷及與之對應的PV。此模式更為靈活,且支援儲存卷的自動擴容。

掛載模式

可通過StorageClass中的volumeAs參數指定掛載模式,定義PV和NAS檔案系統的對應關係。

掛載方式

說明

使用情境

subpath

子目錄模式。一個PV對應一個NAS檔案系統的獨立子目錄,便於資料隔離。

  • 多個Pod掛載同一NAS檔案系統的某個子目錄。

  • 多個Pod掛載同一NAS檔案系統的不同子目錄,實現隔離。

sharepath

共用目錄模式。所有PV均對應StorageClass中定義的同一個NAS目錄,所有使用此StorageClass的PVC都指向NAS上同一個共用目錄。

多個跨命名空間的Pod需要掛載同一個NAS子目錄。

filesystem(不推薦)

檔案系統模式。一個PV對應一個動態建立的、獨立的NAS檔案系統執行個體。

對效能、安全等有嚴格隔離要求,需要為應用動態建立和刪除獨立的NAS檔案系統和掛載點。成本較高。

通用流程

掛載NAS動態儲存裝置卷的主要流程如下。

image
  1. 建立StorageClass:定義儲存模板,聲明NAS掛載點,根據業務需求選擇掛載模式(subpath、sharepath等)。

  2. 建立PVC:應用通過PVC來“申請”使用儲存資源。系統會根據PVC指定的StorageClass自動建立PV並與之綁定。

  3. 在應用中掛載:將已綁定的PVC掛載到應用Pod中,作為容器內的一個持久化目錄。

準備工作

  • 已安裝csi-plugin組件和csi-provisioner組件。

    CSI組件預設安裝,請確保未手動卸載。可在組件管理頁面查看安裝情況。建議升級CSI組件至最新版本。
  • 使用subpath和sharepath時,需已建立NAS檔案系統,且滿足以下條件。否則請重新建立檔案系統

    NAS在掛載連通性、檔案系統數量、協議類型等方面存在使用限制
    • 協議類型:僅支援NFS。

    • Virtual Private Cloud:NAS檔案系統需與叢集VPC保持一致。NAS支援跨可用性區域掛載,不支援跨VPC掛載。

    • 掛載點:添加與叢集處於同一VPC內且狀態可用的掛載點,具體操作請參見管理掛載點。請記錄掛載點地址。

    • (可選)加密類型:如需加密儲存卷資料,請在建立NAS檔案系統時配置加密類型。

注意事項

  • 禁止刪除掛載點:儲存卷使用期間,請勿在NAS控制台刪除其對應的掛載點,以免導致節點I/O異常。

  • 並發寫入:NAS為共用儲存。當多個Pod同時掛載一個儲存卷時,應用自身需要處理並發寫入可能帶來的資料一致性問題。

    關於NAS並發寫入的一些限制條件,請參見如何避免多進程或多用戶端並發寫同一記錄檔可能出現的異常?讀寫訪問檔案類問題
  • 掛載效能:若在應用中配置了securityContext.fsgroup,kubelet會在掛載後遞迴執行chmodchown操作,可能導致Pod啟動時間顯著延長。

    如需最佳化,請參見NAS儲存卷FAQ

方式一:使用subpath方式掛載

此方式下,每個PVC會自動在NAS檔案系統下建立一個獨立的子目錄,作為其PV。

1. 建立StorageClass

StorageClass作為動態磁碟區的供應模板,定義了儲存資源的來源和行為。

kubectl

  1. 參見以下內容建立alicloud-nas-subpath.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      # StorageClass名稱,需在叢集內唯一
      name: alicloud-nas-subpath  
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    parameters:
      # 設定為 subpath
      volumeAs: subpath
      server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com"
      path: "k8s"
      archiveOnDelete: "true"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    參數

    描述

    mountOptions

    NAS的掛載參數,包括NFS協議版本等。預設使用v3協議掛載,可通過vers=4.0方式指定協議版本。關於不同NAS類型支援的NFS協議,請參見NFS協議

    parameters.volumeAs

    掛載模式,設定為subpath

    parameters.server

    NAS掛載點地址。

    關於如何查看掛載點地址,請參見管理掛載點

    parameters.path

    待掛載的NAS子目錄。如果未設定,則預設掛載到根目錄。

    如果NAS中沒有該目錄,系統會自動建立並進行掛載。
    • 通用型NAS:根目錄為/

    • 極速型NAS:根目錄為/share。掛載子目錄時,path需以/share開頭(如/share/data)。

    parameters.archiveOnDelete

    刪除PVC時,若reclaimPolicyDelete,後端儲存的檔案資料是否被真正刪除。

    NAS為共用儲存,提供此選項進行雙重確認。
    • true(預設):不會真正刪除目錄或檔案,而是將其歸檔並重新命名,格式為archived-{pvName}.{timestamp}

    • false:後端對應的目錄及資料會被真正刪除。

      此處刪除的是NAS的subpath目錄以及其中檔案,NAS檔案系統本身不會被刪除。

      如需刪除NAS檔案系統,請參見刪除檔案系統

    在高頻建立和刪除PV的情境下,設定為 false 可能導致CSI控制器任務隊列阻塞,新PV無法被建立,請參見使用NAS動態儲存裝置卷時Controller的任務隊列已滿且無法建立新的PV

    provisioner

    驅動類型。使用阿里雲NAS CSI組件時固定為nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。

    • Delete(預設):刪除PVC時,根據archiveOnDelete的配置處理後端儲存資料。

    • Retain:刪除PVC時,PV和NAS檔案不會被刪除,需手動刪除。適用於對資料安全性要求高的情境,以免誤刪資料。

    allowVolumeExpansion

    僅通用型NAS支援

    允許通過修改 PVC 容量來動態擴容由該 StorageClass 建立的 PV。

    該 StorageClass 將基於 NAS 的目錄配額功能來管理PV容量,從而精確地管理和限制其容量。支援通過編輯 PVC 的 spec.resources.requests.storage 欄位來實現線上擴容,請參見為NAS動態儲存裝置卷設定目錄配額

    NAS 目錄配額的生效是一個非同步過程。PV 剛剛建立或擴容完成後,如果立即進行高速、大批量的資料寫入,存在因配額尚未完全生效而超出規定容量的可能。請參見使用限制瞭解更多使用限制。
  2. 建立StorageClass。

    kubectl create -f alicloud-nas-subpath.yaml

控制台

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存類

  3. 單擊建立,配置StorageClass名稱(叢集內保持唯一)並選擇儲存卷類型為NAS,按照頁面提示完成StorageClass的建立。

    主要配置項如下。

    配置項

    說明

    選擇掛載點

    NAS檔案系統的掛載點地址。

    儲存卷模式

    儲存卷訪問模式。本樣本為子目錄,即subpath,將在掛載路徑下自動建立子目錄。資料將儲存於<NAS掛載點>:<掛載路徑>/<pv-name>/下。

    掛載路徑

    待掛載的NAS子目錄。如果未設定,則預設掛載到根目錄。

    如果NAS中沒有該目錄,系統會自動建立並進行掛載。
    • 通用型NAS:根目錄為/

    • 極速型NAS:根目錄為/share。掛載子目錄時,path需以/share開頭(如/share/data)。

    回收策略

    PV的回收策略。

    • Delete(預設):刪除PVC時,根據archiveOnDelete的配置處理後端儲存資料。

    • Retain:刪除PVC時,PV和NAS檔案不會被刪除,需手動刪除。適用於對資料安全性要求高的情境,以免誤刪資料。

    掛載選項

    NAS的掛載參數,包括NFS協議版本等。預設使用v3協議掛載,可通過vers=4.0方式指定協議版本。關於不同NAS類型支援的NFS協議,請參見NFS協議

    建立後,可在儲存類列表查看建立的StorageClass。

2. 建立PVC

PVC 作為應用的儲存請求,將觸發 StorageClass 的動態供應機制,自動建立並綁定一個匹配的 PV。

kubectl

  1. 參見以下內容建立nas-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata: 
      name: nas-csi-pvc
    spec:
      accessModes:
      - ReadWriteMany 
      # 指定待綁定的 StorageClass
      storageClassName: alicloud-nas-subpath  
      resources: 
        requests:
          # 聲明所需使用的儲存卷的容量
          storage: 20Gi  

    參數

    說明

    accessModes

    訪問模式。可取值:

    • ReadWriteMany(預設):多節點讀寫。

    • ReadWriteOnce:單節點讀寫。

    • ReadOnlyMany:多節點唯讀。

    storageClassName

    待綁定的StorageClass。

    storage

    聲明所需使用的儲存卷的容量。預設情況下,此聲明主要作為資源請求,並不限制Pod實際可用的儲存空間。

    NAS容量上限由規格決定,請參見通用型NAS極速型NAS確認。

    但當StorageClass的allowVolumeExpansiontrue時,此值將變為一個嚴格執行的硬性限制。CSI 將按照該配置設定NAS的目錄配額,限制PV的可用容量。

  2. 建立PVC。

    kubectl create -f nas-pvc.yaml
  3. 查看PV。

    kubectl get pv

    預期輸出如下,表明已基於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

控制台

  1. 在叢集管理頁左側導覽列,選擇儲存 > 儲存聲明

  2. 儲存聲明頁面,單擊建立,配置PVC後,單擊建立

    配置項

    說明

    儲存宣告類型

    選擇NAS。

    名稱

    PVC名稱,在命名空間內保持唯一。

    分配模式

    選擇使用儲存類動態建立

    已有儲存類

    單擊選擇儲存類,選擇此前建立的StorageClass。

    總量

    聲明所需使用的儲存卷的容量。預設情況下,此聲明主要作為資源請求,並不限制Pod實際可用的儲存空間。

    NAS容量上限由規格決定,請參見通用型NAS極速型NAS確認。

    但當StorageClass的allowVolumeExpansiontrue時,此值將變為一個嚴格執行的硬性限制。CSI 將按照該配置設定NAS的目錄配額,限制PV的可用容量。

    訪問模式

    訪問模式。可取值:

    • ReadWriteMany(預設):多節點讀寫。

    • ReadWriteOnce:單節點讀寫。

    • ReadOnlyMany:多節點唯讀。

3. 建立應用並掛載NAS

PVC建立後,可將其綁定的 PV 掛載到應用中。本小節將建立兩個Deployment,引用同一個PVC,實現多個 Pod 共用同一NAS子目錄。

kubectl

建立2個Deployment並掛載同一PVC,使其共用同一個NAS檔案系統的同一個子目錄。

如需為多個Pod掛載同一NAS檔案系統的不同子目錄,請按照子目錄建立不同的StorageClass和對應的PVC,再分別掛載PVC。
  1. 參見以下內容,分別建立nginx-1.yamlnginx-2.yaml

    兩個應用的配置基本一致,兩者引用同一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
                  # NAS在容器中的掛載路徑
                  mountPath: "/data"          
            volumes:
              - name: nas-pvc                 
                persistentVolumeClaim:
                  # 綁定此前建立的 PVC
                  claimName: nas-csi-pvc      
    • nginx-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
                  # NAS在容器中的掛載路徑
                  mountPath: "/data"           
            volumes:
              - name: nas-pvc                 
                persistentVolumeClaim:
                  # 綁定此前建立的 PVC
                  claimName: nas-csi-pvc       
  2. 建立2個Deployment。

    kubectl create -f nginx-1.yaml -f nginx-2.yaml
  3. 查看Pod狀態。

    kubectl get pod -l app=nginx

    預期輸出

    NAME                         READY   STATUS    RESTARTS   AGE
    nas-test-1-b75d5b6bc-*****   1/1     Running   0          51s
    nas-test-2-b75d5b6bc-*****   1/1     Running   0          44s
  4. 查看兩個 Pod 詳細配置,確認掛載的PVC。

    <podName>替換為兩個Pod的實際名稱。
    kubectl describe pod <podName> | grep "ClaimName:"

    預期輸出中,兩個Pod掛載的PVC一致,共用NAS檔案系統的同一子目錄。

控制台

重複以下操作,分別建立2個Deployment並掛載同一PVC,使其共用同一個NAS檔案系統的同一個子目錄。

  1. ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇工作负载 > 无状态

  2. 單擊使用鏡像建立,按照頁面提示完成應用的配置和建立。

    主要參數如下,其他參數保持預設即可。詳見建立無狀態工作負載Deployment

    配置項

    參數

    說明

    應用基本資料

    副本數量

    Deployment的副本數量。

    容器配置

    鏡像名稱

    用於部署應用的鏡像地址。

    所需資源

    所需的vCPU和記憶體資源。

    資料卷

    單擊增加雲端儲存聲明,然後完成參數配置。

    • 掛載源:選擇之前建立的PVC。

    • 容器路徑:輸入NAS檔案系統要掛載到的容器路徑。

    部署完成後,可在無狀態頁面單擊應用程式名稱,在容器組頁簽下確認Pod已正常運行(狀態為Running)。

後續結果驗證可參見驗證共用儲存和持久化儲存

方式二:使用sharepath方式掛載

此方式下,所有基於此StorageClass建立的PVC,建立PV時不會建立實際的目錄,而會直接使用StorageClass中設定的路徑,即每個PV實際上會對應同一個NAS目錄。

1. 建立StorageClass

StorageClass作為動態磁碟區的供應模板,定義了儲存資源的來源和行為。

kubectl

  1. 參見以下內容建立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"
      path: "k8s"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    參數

    描述

    mountOptions

    NAS的掛載參數,包括NFS協議版本等。預設使用v3協議掛載,可通過vers=4.0方式指定協議版本。關於不同NAS類型支援的NFS協議,請參見NFS協議

    parameters.volumeAs

    掛載方式,設定為sharepath

    parameters.server

    NAS掛載點地址。

    關於如何查看掛載點地址,請參見管理掛載點

    parameters.path

    待掛載的NAS子目錄。如果未設定,則預設掛載到根目錄。

    如果NAS中沒有該目錄,系統會自動建立並進行掛載。
    • 通用型NAS:根目錄為/

    • 極速型NAS:根目錄為/share。掛載子目錄時,path需以/share開頭(如/share/data)。

    provisioner

    驅動類型。使用阿里雲NAS CSI組件時固定為nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。使用sharepath時必須設定為 Retain

  2. 建立StorageClass。

    kubectl create -f alicloud-nas-sharepath.yaml

控制台

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存類

  2. 單擊建立,配置StorageClass名稱(叢集內保持唯一)並選擇儲存卷類型為NAS,按照頁面提示完成StorageClass的建立。

    配置項

    說明

    選擇掛載點

    NAS檔案系統的掛載點地址。

    儲存卷模式

    儲存卷訪問模式。本樣本為共用目錄,即sharepath。

    掛載路徑

    待掛載的NAS子目錄。如果未設定,則預設掛載到根目錄。

    如果NAS中沒有該目錄,系統會自動建立並進行掛載。
    • 通用型NAS:根目錄為/

    • 極速型NAS:根目錄為/share。掛載子目錄時,path需以/share開頭(如/share/data)。

    回收策略

    使用sharepath時必須設定為 Retain

    掛載選項

    NAS的掛載參數,包括NFS協議版本等。預設使用v3協議掛載,可通過vers=4.0方式指定協議版本。關於不同NAS類型支援的NFS協議,請參見NFS協議

2. 建立PVC

PVC 作為應用的儲存請求,將觸發 StorageClass 的動態供應機制,自動建立並綁定一個匹配的 PV。

為了實現跨命名空間的資料共用,本小節將在兩個命名空間下建立一個同名PVC。PVC 名稱相同,但位於不同命名空間,因此是獨立的資源。它們將通過同一StorageClass,在同一 NAS 檔案系統上分別獲得獨立 PV。

kubectl

  1. 建立命名空間ns1和ns2。

    kubectl create ns ns1
    kubectl create ns ns2
  2. 參見以下內容建立pvc.yaml,分別在 ns1 和 ns2 命名空間下建立同名 PVC。

    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

    聲明所需使用的儲存卷的容量。預設情況下,此聲明主要作為資源請求,並不限制Pod實際可用的儲存空間。

    NAS容量上限由規格決定,請參見通用型NAS極速型NAS確認。

    但當StorageClass的allowVolumeExpansiontrue時,此值將變為一個嚴格執行的硬性限制。CSI 將按照該配置設定NAS的目錄配額,限制PV的可用容量。

  3. 建立PVC。

    kubectl create -f pvc.yaml
  4. 查看PV狀態,確認已為 PVC 自動建立並綁定了對應的 PV。

    kubectl get pv

    預期輸出如下,兩個狀態 PV 均為 Bound , CLAIM 顯示每個 PV 分別綁定到兩個命名空間下的 PVC(ns1/nas-csi-pvc 和 ns2/nas-csi-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

控制台

  1. 建立命名空間。

    • 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇命名空間與配額

    • 單擊建立,安裝頁面提示建立命名空間ns1和ns2。

  2. 在叢集管理頁左側導覽列,選擇儲存 > 儲存聲明

  3. 在命名空間ns1下,建立一個儲存聲明。

    儲存聲明頁面,選擇命名空間為ns1,按照頁面提示完成PVC的建立。

    配置項

    說明

    儲存宣告類型

    選擇NAS。

    名稱

    PVC名稱,在命名空間內保持唯一。

    分配模式

    選擇使用儲存類動態建立

    已有儲存類

    單擊選擇儲存類,選擇此前建立的StorageClass。

    總量

    聲明所需使用的儲存卷的容量。預設情況下,此聲明主要作為資源請求,並不限制Pod實際可用的儲存空間。

    NAS容量上限由規格決定,請參見通用型NAS極速型NAS確認。

    但當StorageClass的allowVolumeExpansiontrue時,此值將變為一個嚴格執行的硬性限制。CSI 將按照該配置設定NAS的目錄配額,限制PV的可用容量。

    訪問模式

    訪問模式。可取值:

    • ReadWriteMany(預設):多節點讀寫。

    • ReadWriteOnce:單節點讀寫。

    • ReadOnlyMany:多節點唯讀。

  4. 參見上一步,在命名空間ns2下,再次建立一個PVC。

    建立後,返回儲存聲明頁面,在命名空間ns1和ns2下,確認2個PVC均已綁定自動建立的PV。

3. 建立應用並掛載NAS

PVC建立後,可將其綁定的 PV 掛載到應用中。本小節在2個Namespace下分別建立應用,並掛載相應的PVC,從而讓它們共用StorageClass中定義的NAS子目錄。

kubectl

  1. 參見以下內容,分別建立nginx-ns1.yamlnginx-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-pvc
    • nginx-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. 建立2個Deployment。

    kubectl create -f nginx-ns1.yaml -f nginx-ns2.yaml
  3. 查看Pod狀態。

    kubectl get pod -A -l app=nginx

    預期輸出:

    NAMESPACE   NAME                         READY   STATUS    RESTARTS   AGE
    ns1         nas-test-b75d5b6bc-*****     1/1     Running   0          2m19s
    ns2         nas-test-b75d5b6bc-*****     1/1     Running   0          2m11s
  4. 查看 Pod 詳細配置,確認PVC掛載。

    <namespace-name><pod-name>分別替換為實際NameSpace和Pod名稱。
    kubectl describe pod -n <namespace-name> <pod-name> | grep "ClaimName:"

    預期輸出中,兩個Pod分別掛載了 ns1/nas-csi-pvc和 ns2/nas-csi-pvc

控制台

  1. ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇工作负载 > 无状态

  2. 在命名空間ns1下,建立一個Deployment,並掛載相應的PVC。

    1. 選擇命名空間ns1,單擊使用鏡像建立

    2. 按照頁面提示完成應用的建立。

      主要參數如下,其他參數保持預設即可。詳見建立無狀態工作負載Deployment

      配置項

      參數

      說明

      應用基本資料

      副本數量

      Deployment的副本數量。

      容器配置

      鏡像名稱

      用於部署應用的鏡像地址。

      所需資源

      所需的vCPU和記憶體資源。

      資料卷

      單擊增加雲端儲存聲明,然後完成參數配置。

      • 掛載源:選擇之前建立的PVC。

      • 容器路徑:輸入NAS檔案系統要掛載到的容器路徑,如/data。

  3. 參見上一步,在命名空間ns2下,再次建立一個Deployment,並掛載相應的PVC。

    返回無狀態頁面,在命名空間ns1和ns2下,分別查看2個Deployment的部署情況,確認Pod已正常Running,且掛載了對應的PVC。

後續結果驗證可參見驗證共用儲存和持久化儲存

方式三:使用filesystem方式掛載

filesystem 模式適用於需要為應用動態建立和管理專屬 NAS 檔案系統及掛載點的情境。與sharepath不同,每個以filesystem建立的 PV 都對應一個獨立的 NAS 檔案系統執行個體。

一個 filesystem 類型的 PV 對應一個獨立的 NAS 檔案系統和一個掛載點。
  • filesystem類型的PV刪除時預設保留NAS檔案系統和掛載點。如需在刪除PV時同步刪除NAS檔案系統和掛載點,需在StorageClass中進行以下配置:

    • reclaimPolicy: Delete

    • parameters.deleteVolume: "true"

  • 使用ACK專有叢集時,需授予csi-provisioner相應的許可權。

    展開查看授權流程

    filesystem類型的NAS儲存卷涉及NAS檔案系統和掛載點的動態建立與刪除,因此ACK專有叢集需要授予csi-provisioner相應的許可權。

    RAM Policy的最小集合如下。

    {
        "Action": [
            "nas:DescribeMountTargets",
            "nas:CreateMountTarget",
            "nas:DeleteFileSystem",
            "nas:DeleteMountTarget",
            "nas:CreateFileSystem"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }

    可通過以下任意一種方式進行授權:

    • 編輯ACK專有叢集的Master RAM角色中的自訂策略內容,添加以上NAS相關的使用權限設定。請參見修改自訂權限原則內容和備忘自訂授權

    • 建立RAM使用者並授權以上RAM Policy,並產生AccessKey,配置到csi-provisioner的env變數中。

      env:
      - name: CSI_ENDPOINT
        value: unix://socketDir/csi.sock
      - name: ACCESS_KEY_ID
        value: ""
      - name: ACCESS_KEY_SECRET
        value: ""

1. 建立StorageClass

StorageClass作為動態磁碟區的供應模板,定義了儲存資源的來源和行為。

  1. 參見以下內容建立alicloud-nas-fs.yaml,定義一個filesystem模式的StorageClass。

    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-beijing
      zoneId: cn-beijing-e
      vpcId: "vpc-2ze2fxn6popm8c2mzm****"
      vSwitchId: "vsw-2zwdg25a2b4y5juy****"
      accessGroupName: DEFAULT_VPC_GROUP_NAME
      deleteVolume: "false"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    參數

    描述

    mountOptions

    NAS的掛載參數,包括NFS協議版本等。預設使用v3協議掛載,可通過vers=4.0方式指定協議版本。關於不同NAS類型支援的NFS協議,請參見NFS協議

    parameters.volumeAs

    掛載方式,設定為filesystem

    parameters.fileSystemType

    NAS檔案系統的類型。取值:

    • standard(預設):通用型NAS。

    • extreme:極速型NAS。

    parameters.storageType

    NAS檔案系統的儲存規格。

    • 通用型NAS的可取值:

      • Performance(預設):效能型

      • Capacity:容量型

    • 極速型NAS的可取值:

      • standard(預設):標準型

      • advance:進階型

    parameters.regionId

    NAS檔案系統所屬地區。需與叢集保持一致。

    parameters.zoneId

    NAS檔案系統所屬可用性區域。同一VPC下,NAS可以跨可用性區域掛載。

    parameters.vpcId

    NAS檔案系統掛載點所屬VPC。需與叢集保持一致。

    parameters.vSwitchId

    NAS檔案系統掛載點所在vSwitch ID。

    parameters.accessGroupName

    NAS檔案系統掛載點所在許可權組。預設為DEFAULT_VPC_GROUP_NAME

    parameters.deleteVolume

    刪除PVC時,是否同時刪除PV,以及對應的NAS檔案系統和掛載點。由於NAS為共用檔案系統,出於安全考慮需要同時配置deleteVolumereclaimPolicy

    provisioner

    驅動類型。使用阿里雲NAS CSI組件時固定為nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。當值為DeletedeleteVolumetrue時,才會在刪除PVC的同時,刪除PV以及對應的NAS檔案系統和掛載點。

  2. 執行以下命令建立StorageClass。

    kubectl create -f alicloud-nas-fs.yaml

2. 建立PVC

  1. 參見以下內容建立nas-pvc-fs.yaml,申請使用儲存資源。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-csi-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-fs
      resources:
        requests:
          storage: 20Gi

    相關參數說明如下:

    參數

    說明

    accessModes

    配置訪問模式。可取值:

    • ReadWriteMany(預設):多節點讀寫。

    • ReadWriteOnce:單節點讀寫。

    • ReadOnlyMany:多節點唯讀。

    storage

    可分配的儲存容量,即待建立的NAS儲存卷容量。

    極速型NAS的最小容量限制為100 GiB。如果StorageClass中定義了極速型NAS,此處storage的值須≥100 GiB。

    storageClassName

    待綁定的StorageClass。

  2. 建立PVC。

    kubectl create -f nas-pvc-fs.yaml

3. 建立應用並掛載NAS

  1. 參見以下內容,建立nas-fs.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-fs
      labels:
        app: nginx-test
    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-fs
  2. 建立Deployment。

    kubectl create -f nas-fs.yaml
  3. 檢查PVC狀態。

    kubectl get pvc nas-csi-pvc-fs

    預期輸出如下,表明PVC 已成功與PV綁定。

    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
    nas-csi-pvc-fs   Bound    nas-8338540d-34a1-4796-89cf-be2a7*******   20Gi       RWX            alicloud-nas-fs   <unset>                 13m
  4. 檢查 PV 資訊中建立的NAS 檔案系統 ID。

    nas-8338540d-34a1-4796-89cf-be2a7*******替換為實際PV名稱。
    kubectl describe pv nas-8338540d-34a1-4796-89cf-be2a7******* | grep "fileSystemId"

    預期輸出的ID即為NAS檔案系統ID,可登入NAS控制台,在檔案系統列表頁面查看。

驗證共用儲存和持久化儲存

成功部署應用後,可驗證儲存卷是否按預期工作。本小節以subpath 模式下建立的 nas-test-1 和 nas-test-2 為例進行驗證。

共用儲存

持久化儲存

在一個Pod中建立檔案,然後在另一個Pod中查看檔案,驗證資料的共用儲存。

  1. 查看Pod資訊,擷取Pod名稱。

    kubectl get pod | grep nas-test

    預期輸出:

    nas-test-1-b75d5b6bc-*****           1/1     Running   0          50s
    nas-test-2-b75d5b6bc-*****           1/1     Running   0          60s
  2. 在一個Pod中建立檔案。

    以名為nas-test-1-b75d5b6bc-*****的Pod作為樣本:

    kubectl exec nas-test-1-b75d5b6bc-***** -- touch /data/test.txt
  3. 在另一個Pod中查看檔案是否存在。

    以名為nas-test-2-b75d5b6bc-*****的Pod為例。

    kubectl exec nas-test-2-b75d5b6bc-***** -- ls /data

    預期輸出:

    test.txt

    可以查看到此前建立的檔案,表明資料可在多Pod間共用。

重建Deployment,在建立Pod中查看檔案系統中的資料是否存在,驗證資料的持久化儲存。

  1. 刪除應用Pod以觸發重建。

    kubectl rollout restart deploy nas-test-1
  2. 查看Pod,等待新Pod啟動並進入Running狀態。

    kubectl get pod | grep nas-test

    預期輸出:

    nas-test-1-5bb845b795-*****           1/1     Running   0          115m
    nas-test-2-5b6bccb75d-*****           1/1     Running   0          103m
  3. 在新Pod中查看此前建立的檔案是否存在。

    以名為nas-test-1-5bb845b795-*****的Pod為例。

    kubectl exec nas-test-1-5bb845b795-***** -- ls /data

    預期輸出:

    test.txt

    可以查看到此前寫入的檔案,表明資料可持久化儲存。

適用於生產環境

  • 安全與資料保護

    • 使用Retain回收策略: 推薦將StorageClass的reclaimPolicy設定為Retain,防止因誤刪PVC而導致後端資料被刪除。

    • 使用許可權組進行存取控制:NAS通過許可權組來管理網路存取權限。請遵循最小許可權原則,在許可權組中僅添加叢集節點的私網IP地址或其所屬的vSwitch網段,避免授權範圍過大(如 0.0.0.0/0)。

  • 效能與成本最佳化

    • 選擇合適的NAS類型:參見檔案系統選型,根據應用對IOPS和輸送量的要求合理選擇NAS類型。

    • 最佳化掛載選項 (mountOptions):根據工作負載特性調整NFS掛載參數。例如,使用vers=4.0vers=4.1協議版本可能在某些情境下獲得更好的效能和檔案鎖定能力。對於大規模檔案讀寫,可測試調整rsizewsize參數以最佳化讀寫效能。

  • 營運與可靠性

    • 配置健全狀態檢查:為應用Pod配置存活探針(Liveness Probe),檢查掛載點是否正常。當掛載失效時,ACK可自動重啟Pod,觸發儲存卷的重新掛載。

    • 監控與警示:利用容器儲存監控配置警示,及時發現儲存卷的異常或效能瓶頸。

資源釋放指引

為避免產生預期外費用,當您不再需要使用NAS儲存卷時,請按照以下順序釋放相關資源。

  1. 刪除工作負載

    • 操作:刪除所有使用該NAS儲存卷的應用(如Deployment、StatefulSet等)。此操作將停止應用Pod對儲存卷的掛載和讀寫。

    • 命令樣本:kubectl delete deployment <your-deployment-name>

  2. 刪除PVC

    • 操作:刪除應用所關聯的PVC。刪除PVC後,其綁定的PV和後端NAS的後續行為取決於對應StorageClass中定義的reclaimPolicy

      • subpath模式

        • reclaimPolicy: Retain:刪除PVC後,其綁定的PV會進入Released狀態。PV對象和後端NAS上的對應子目錄及資料都會被保留,需手動刪除。

        • reclaimPolicy: Delete:刪除PVC後,其綁定的PV會被自動刪除。後端NAS子目錄的處理方式取決於archiveOnDelete參數:

          • archiveOnDelete: "true":後端資料不會被刪除,而是被重新命名歸檔為 archived-{pvName}.{timestamp}

          • archiveOnDelete: "false":後端NAS上與該PV對應的子目錄及其中資料會被徹底刪除。請謹慎操作。

          在 ACK Serverless 叢集中,由於許可權限制,即使配置為reclaimPolicy: Delete,後端NAS目錄及資料也不會被刪除或歸檔,僅PV對象會被刪除。
      • sharepath模式

        reclaimPolicy 僅支援 Retain。刪除PVC後,其綁定的PV會進入Released狀態。由於是共用目錄,PV對象和後端的NAS共用目錄及資料會被保留。

      • filesystem模式

        • reclaimPolicy: Retain:刪除PVC後,其綁定的PV會進入Released狀態。PV對象、動態建立的後端NAS檔案系統及掛載點都會被保留。

        • reclaimPolicy: Delete:刪除PVC後,其綁定的PV會被自動刪除。後端NAS檔案系統的處理方式取決於deleteVolume參數:

          • deleteVolume: "false":後端NAS檔案系統和掛載點會被保留,需手動刪除。

          • deleteVolume: "true":後端NAS檔案系統和掛載點會被自動刪除。請謹慎操作。

    • 命令樣本:kubectl delete pvc <your-pvc-name>

  3. 刪除PV

    • 操作:當PV處於AvailableReleased狀態時,可執行刪除操作。此操作僅從Kubernetes叢集中移除該PV的定義,不會刪除後端NAS檔案系統上的資料。

    • 命令樣本:kubectl delete pv <your-pv-name>

  4. 刪除後端NAS檔案系統(可選)

    • subpathsharepath模式:請參見刪除檔案系統。此操作將永久刪除該NAS上的所有資料,且無法恢複,請謹慎操作。執行前,請務必確認該NAS已無任何業務依賴。

    • filesystem模式:如在刪除PVC時後端NAS檔案系統未被自動刪除,請參見刪除檔案系統,定位並手動刪除對應的檔案系統。

相關文檔