全部產品
Search
文件中心

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

更新時間:Nov 07, 2025

NAS儲存卷適用於巨量資料分析、共用資料、Web應用以及儲存日誌等情境。除使用靜態儲存卷外,您也可以建立PVC並配置StorageClass來實現儲存資源的動態分配,讓系統為您自動預留持久化儲存卷,無需預先手動建立和配置儲存資源。您可以通過subpath方式、sharepath方式以及filesystem方式掛載NAS動態儲存裝置卷。

前提條件

  • 叢集已安裝CSI組件(預設安裝)。

    如需升級,請參見升級CSI組件

使用限制

  • 不支援掛載SMB協議的NAS檔案系統。

  • NAS檔案系統只能掛載到相同VPC的Pod上,不支援跨VPC掛載。

    說明

    同一VPC下,NAS可以跨可用性區域掛載。

  • 通用型NAS與極速型NAS在掛載連通性、檔案系統數量及協議類型等方面存在相應約束條件。更多資訊,請參見使用限制

注意事項

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

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

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

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

掛載說明

StorageClass中的volumeAs參數可以定義PV和NAS檔案系統(及其子目錄)的對應關係,請根據您的業務情境選擇合適的掛載方式。

掛載方式

說明

使用情境

使用subpath方式掛載

建立子目錄類型的PV,一個PV對應一個NAS檔案系統的子目錄。

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

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

使用sharepath方式掛載

建立PV時不會建立實際的目錄,每個PV實際上會對應同一個NAS目錄。

多個跨Namespace的Pod掛載同一個NAS子目錄。

使用filesystem方式掛載(不推薦)

自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。

單獨使用一個NAS檔案系統。需要動態建立和刪除NAS檔案系統和掛載點。

使用subpath方式掛載

重要

使用subpath方式掛載時,請確保CSI組件的版本為1.31.4及以上。如需升級,請參見升級CSI組件

步驟一:擷取NAS檔案系統和掛載點資訊

  1. 登入NAS控制台,在左側導覽列,單擊檔案系統 > 檔案系統列表

  2. 建立NAS檔案系統和掛載點。

    僅支援掛載NFS協議的NAS檔案系統,掛載點和叢集節點需在同一VPC內。

    • 如果您使用已有NAS,請確認NAS滿足條件。

    • 如果您沒有可用的NAS,請建立滿足條件的NAS檔案系統和掛載點。具體操作,請參見建立檔案系統管理掛載點

  3. 擷取掛載點資訊。

    1. 單擊檔案系統ID,然後在左側導覽列,單擊掛載使用

    2. 掛載點地區,確認已有掛載點的狀態為可用,然後擷取掛載點地址。

步驟二:建立儲存類(StorageClass)

kubectl

  1. 修改以下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

    參數

    描述

    mountOptions

    NAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議

    parameters

    volumeAs

    掛載方式。本樣本設定為subpath,表示建立子目錄類型的PV。一個PV對應一個NAS檔案系統的子目錄。

    server

    要掛載的NAS檔案系統的掛載點地址及子目錄。格式為<NAS掛載點地址>:<掛載目錄>。如未設定子目錄,則預設掛載根目錄/

    archiveOnDelete

    表示在reclaimPolicyDelete時,是否刪除後端隱藏檔資料。由於NAS為共用儲存,添加此選項進行雙重確認。

    • true(預設):不會真正刪除目錄或檔案,而是將其重新命名,格式為archived-{pvName}.{timestamp}

    • false:會真正刪除後端對應的儲存資源。

    說明

    provisioner

    驅動類型。固定為nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI外掛程式。

    reclaimPolicy

    PV的回收策略,預設為Delete,支援Retain

    • Delete:需配合archiveOnDelete一起使用。

      • archiveOnDeletetrue時,刪除PVC時,NAS中的檔案只會被重新命名,不會被刪除。

      • archiveOnDeletefalse時,刪除PVC時,NAS中的檔案會被真正刪除。

        重要

        此處真正刪除的是NAS的subpath目錄以及其中的檔案,NAS檔案系統本身不會被刪除,如需繼續刪除NAS檔案系統,請參見刪除檔案系統

    • Retain:刪除PVC的時候,PV和NAS中檔案不會被刪除,需要您手動刪除。

    如果資料安全性要求高,推薦使用Retain方式以免誤刪資料。

    allowVolumeExpansion

    僅通用型NAS檔案系統支援設定此參數。開啟時,該StorageClass動態建立的PV將會被配置NAS目錄配額以限制可使用的容量,並支援通過更新PVC進行卷容量擴容。更多資訊,請參見為NAS動態儲存裝置卷設定目錄配額

    說明

    NAS配額的生效是非同步,即動態建立出PV後,目錄配額不能保證立即生效,且快速連續寫入大量資料可能會超出設定的容量上限。關於NAS目錄配額的更多資訊,請參見目錄配額

  2. 建立StorageClass。

    kubectl create -f alicloud-nas-subpath.yaml

控制台

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

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

  3. 儲存類頁面,單擊建立

  4. 建立對話方塊中,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

  1. 修改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,支援ReadWriteOnceReadOnlyMany

    storageClassName

    要綁定的StorageClass的名稱。

    storage

    聲明所需使用的儲存卷的容量。

    重要
    • 預設情況下,NAS儲存卷的實際可用容量不受該配置限制,由NAS檔案系統的規格決定,請參見通用型NAS極速型NAS確認具體可用容量。

    • 如果使用通用型NAS,且StorageClass的allowVolumeExpansiontrue時,CSI將按照該配置設定NAS目錄配額,限制NAS儲存卷的可用容量。

  2. 建立PVC。

    kubectl create -f nas-pvc.yaml
  3. 查看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

控制台

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

  2. 儲存聲明頁面,單擊建立

  3. 在彈出的建立儲存聲明頁面中,配置完成後,單擊建立

    配置項

    說明

    樣本值

    儲存宣告類型

    選擇NAS。

    NAS

    名稱

    建立的儲存聲明名稱在命名空間內必須唯一。

    pvc-nas

    分配模式

    本樣本選擇使用儲存類動態建立

    使用儲存類動態建立

    已有儲存類

    單擊選擇儲存類,在彈出的對話中選擇上一步建立的儲存類。

    alicloud-nas-subpath

    總量

    建立儲存卷的容量,此處設定的大小不會限制應用可使用的最大容量。

    重要
    • 預設情況下,NAS儲存卷的實際可用容量不受該配置限制,由NAS檔案系統的規格決定,請參見通用型NAS極速型NAS確認具體可用容量。

    • 如果使用通用型NAS,且StorageClass的allowVolumeExpansiontrue時,CSI將按照該配置設定NAS目錄配額,限制NAS儲存卷的可用容量。

    20Gi

    訪問模式

    預設為ReadWriteMany,也可選擇ReadWriteOnceReadOnlyMany

    ReadWriteMany

步驟四:建立應用並掛載NAS

kubectl

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

說明

如果要為多個Pod掛載同一NAS檔案系統的不同子目錄,請按照子目錄建立不同的StorageClass和對應的PVC,再分別掛載PVC。

  1. 修改以下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       # 用於綁定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
                mountPath: "/data"           # NAS在容器中的掛載路徑
          volumes:
            - name: nas-pvc                 
              persistentVolumeClaim:
                claimName: nas-csi-pvc       # 用於綁定PVC
  2. 建立2個Deployment。

    kubectl create -f nginx-1.yaml -f nginx-2.yaml
  3. 查看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檔案系統的同一個子目錄。

  1. 在叢集管理頁左側導覽列,選擇工作負載 > 無狀態

  2. 無狀態頁面,單擊使用鏡像建立

  3. 配置建立應用的參數資訊。

    主要參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載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

    nas1.png

  4. 查看應用部署狀態。

    1. 無狀態頁面,單擊應用程式名稱。

    2. 容器組頁簽下,確認Pod已正常運行(狀態為Running)。

使用sharepath方式掛載

步驟一:擷取NAS檔案系統和掛載點資訊

  1. 登入NAS控制台,在左側導覽列,單擊檔案系統 > 檔案系統列表

  2. 建立NAS檔案系統和掛載點。

    僅支援掛載NFS協議的NAS檔案系統,掛載點和叢集節點需在同一VPC內。

    • 如果您使用已有NAS,請確認NAS滿足條件。

    • 如果您沒有可用的NAS,請建立滿足條件的NAS檔案系統和掛載點。具體操作,請參見建立檔案系統管理掛載點

  3. 擷取掛載點資訊。

    1. 單擊檔案系統ID,然後在左側導覽列,單擊掛載使用

    2. 掛載點地區,確認已有掛載點的狀態為可用,然後擷取掛載點地址。

步驟二:建立儲存類(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:/sharepath"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    參數

    描述

    mountOptions

    NAS的掛載參數,包括NFS協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議

    parameters

    volumeAs

    掛載方式。本樣本設定為sharepath,表示建立PV時不會建立實際的目錄,將會直接使用StorageClass裡設定的路徑,即每個PV實際上會對應同一個NAS目錄。

    server

    要掛載的NAS檔案系統的掛載點地址及子目錄。格式為<NAS掛載點地址>:<掛載目錄>

    • 如未設定子目錄,則預設掛載根目錄/

    • 如果NAS中沒有該目錄,會自動建立後再進行掛載。

    通用型NAS的根目錄為/,極速型NAS的根目錄為/share。掛載極速型NAS的子目錄時,path必須以/share開頭,如/share/data

    provisioner

    驅動類型。固定為nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI外掛程式。

    reclaimPolicy

    PV的回收策略。使用sharepath方式掛載時必須要設定為 Retain

  2. 建立StorageClass。

    kubectl create -f alicloud-nas-sharepath.yaml

控制台

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

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

  3. 儲存類頁面,單擊建立

  4. 建立對話方塊中,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。

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

    kubectl create ns ns1
    kubectl create ns ns2
  2. 修改以下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,支援ReadWriteOnceReadOnlyMany

    storageClassName

    要綁定的StorageClass的名稱。

    storage

    聲明所需使用的儲存卷的容量。

    重要
    • 預設情況下,NAS儲存卷的實際可用容量不受該配置限制,由NAS檔案系統的規格決定,請參見通用型NAS極速型NAS確認具體可用容量。

    • 如果使用通用型NAS,且StorageClass的allowVolumeExpansiontrue時,CSI將按照該配置設定NAS目錄配額,限制NAS儲存卷的可用容量。

  3. 建立PVC。

    kubectl create -f pvc.yaml
  4. 查看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

控制台

  1. 建立命名空間ns1和ns2,請參見建立命名空間

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

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

    1. 儲存聲明頁面,選擇命名空間ns1,單擊建立

    2. 在彈出的建立儲存聲明頁面中,配置完成後,單擊建立

      配置項

      說明

      樣本值

      儲存宣告類型

      選擇NAS。

      NAS

      名稱

      建立的儲存聲明名稱在命名空間內必須唯一。

      pvc-nas

      分配模式

      本文中選擇使用儲存類動態建立

      使用儲存類動態建立

      已有儲存類

      單擊選擇儲存類,在彈出的對話方塊中選擇已建立的儲存類。

      alicloud-nas-sharepath

      總量

      建立的儲存卷的容量。

      20Gi

      訪問模式

      預設為ReadWriteMany,也可選擇ReadWriteOnceReadOnlyMany

      ReadWriteMany

  4. 參考上一步,在命名空間ns2下,再建立一個儲存聲明。

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

步驟四:建立應用並掛載NAS

在2個不同Namespace下分別建立應用,並掛載相應Namespace下的PVC,它們將共用StorageClass中定義的NAS目錄。

kubectl

  1. 修改以下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-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下的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

控制台

  1. 在叢集管理頁左側導覽列,選擇工作負載 > 無狀態

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

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

    2. 配置建立應用的參數資訊。

      主要參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載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

      nas1.png

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

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

使用filesystem方式掛載

當應用需要動態建立和刪除NAS檔案系統和掛載點時,您可以使用filesystem方式掛載NAS,使用filesystem類型NAS儲存卷的Pod只能建立一個檔案系統和一個掛載點。

重要

filesystem類型的NAS動態磁碟區在刪除時預設保留檔案系統和掛載點,如需在釋放PV資源的同時釋放NAS檔案系統和掛載點,則需要同時設定StorageClass中的reclaimPolicyDeletedeleteVolume的值為true

步驟一:RAM Policy設定和授予(僅ACK專有叢集需執行)

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: ""

步驟二:建立儲存類(StorageClass)

  1. 修改以下YAML內容,並儲存為alicloud-nas-fs.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-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協議版本等。推薦使用NFS v3協議,極速型NAS僅支援NFS v3。關於NFS協議的更多資訊,請參見NFS協議

    parameters

    volumeAs

    掛載方式。本樣本設定為filesystem,表示會自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。

    fileSystemType

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

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

    • extreme:極速型NAS。

    storageType

    NAS檔案系統的儲存規格。

    • 對於通用型NAS,可選值如下:

      • Performance(預設):效能型

      • Capacity:容量型

    • 對於極速型NAS,可選值如下:

      • standard(預設):標準型

      • advance:進階型

    regionId

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

    zoneId

    NAS檔案系統所屬可用性區域。

    說明

    同一VPC下,NAS可以跨可用性區域掛載。

    vpcId

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

    vSwitchId

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

    accessGroupName

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

    deleteVolume

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

    provisioner

    驅動類型。此處須配置為nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI組件。

    reclaimPolicy

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

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

    kubectl create -f alicloud-nas-fs.yaml

步驟三:建立儲存聲明(PVC)

  1. 修改以下YAML,儲存為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
  2. 建立PVC。

    kubectl create -f nas-pvc-fs.yaml

步驟四:建立應用並掛載NAS

  1. 修改以下YAML,儲存為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

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

按照上文樣本建立的多個Pod掛載了同一NAS檔案系統。您可以通過以下方式進行驗證:

  • 在一個Pod中建立檔案,然後另一個Pod中查看檔案,以此來驗證共用儲存。

  • 重建Deployment,然後在新建立的Pod中查看檔案系統中的資料是否存在,以此來驗證持久化儲存。

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

    kubectl get pod | grep nas-test

    預期輸出:

    nas-test-*****a   1/1     Running   0          40s
    nas-test-*****b   1/1     Running   0          40s
  2. 在一個Pod中建立檔案。

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

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

    以名為nas-test-*****b的Pod為例。

    kubectl exec nas-test-*****b -- ls /data

    預期輸出:

    test.txt

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

常見問題

在掛載和使用NAS儲存卷的過程中,如果遇到問題,可參考以下文檔進行排查。

相關文檔