全部產品
Search
文件中心

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

更新時間:Dec 12, 2024

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

前提條件

  • 叢集預設已安裝CSI組件。如需升級請參見升級csi-plugin和csi-provisioner

    說明

    如果您叢集中使用Flexvolume組件,由於Flexvolume已廢棄,請參見遷移Flexvolume至CSI完成遷移後再進行掛載。您可以在營運管理 > 組件管理,在儲存頁簽下確認儲存群組件類型。

使用限制

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

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

注意事項

  • NAS為共用儲存,一個NAS儲存卷可以掛載到多個Pod上,可能出現多個Pod同時寫入資料的問題,需應用自行確保資料一致性。關於NAS並發寫入的一些限制條件,請參見如何避免多進程或多用戶端並發寫同一記錄檔可能出現的異常?如何解決向NFS檔案系統中寫入資料延遲問題?

  • NAS掛載點建立後,等待一定時間,待掛載點狀態可用後方可使用。請勿刪除掛載點,否則會造成系統無響應。

  • 在使用極速型NAS檔案系統時,配置動態儲存裝置卷StorageClass中的path需要以/share為父目錄。例如,0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/share/subpath表示Pod掛載的NAS檔案系統的子目錄為/share/subpath

  • 若您在應用模板中配置了securityContext.fsgroup參數,kubelet在儲存卷掛載完成後會執行chmodchown操作,導致掛載時間延長。若已配置securityContext.fsgroup參數,且需要減少掛載時間。具體操作,請參見NAS儲存卷掛載時間延長

掛載說明

您可以通過subpath方式、sharepath方式以及filesystem方式掛載NAS動態儲存裝置卷,使用subpath方式和sharepath方式掛載時,您需要提前建立NAS檔案系統和掛載點,使用filesystem方式掛載無需提前建立。

  • 使用subpath方式掛載當多個應用或者Pod需要掛載同一個NAS檔案系統共用資料時,或者不同的Pod掛載同一個NAS檔案系統的不同子目錄。

  • 使用sharepath方式掛載如果您需要在多個跨命名空間的Pod中掛載同一個NAS目錄。

  • 使用filesystem方式掛載當應用需要動態建立和刪除NAS檔案系統和掛載點時,CSI組件在PVC建立時會自動動態建立NAS檔案系統和掛載點,建立一個PVC,就會建立一個NAS檔案系統,PVC刪除時動態刪除掛載點和NAS檔案系統。僅支援kubectl命令列操作。

步驟一:建立NAS檔案系統和掛載點

不同類型的NAS檔案系統支援的地區、可用性區域不同。請根據業務需求、叢集所屬地區和叢集中Pod使用的VPC和交換器資訊,確定所需要建立的NAS檔案系統和掛載點。

  • 不同類型NAS檔案系統的儲存規格、效能、計費、支援的地區和可用性區域等資訊,請參見通用型NAS極速型NAS

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

  1. 登入NAS控制台

  2. 建立NAS檔案系統。具體操作,請參見建立檔案系統

    1. 檔案系統列表頁面,單擊建立檔案系統,然後選擇建立通用型NAS建立極速型NAS

    2. 在彈出面板完成NAS相關參數配置,然後單擊立即購買,完成後續操作。

      本文以通用型NAS為例,主要參數如下,更多資訊,請參見建立檔案系統

      配置項

      說明

      地區

      與叢集一致。

      可用性區域

      選擇對應的可用性區域。

      協議類型

      選擇NFS。目前不支援掛載SMB協議的NAS檔案系統。

      Virtual Private Cloud虛擬交換器

      僅針對通用型NAS。

      選擇叢集中Pod使用的VPC和交換器。

步驟二:掛載NAS動態儲存裝置卷

使用subpath方式掛載

kubectl

1、建立儲存類StorageClass

  1. 儲存以下內容至alicloud-nas-subpath.yaml檔案,並根據需求修改相關參數。

    allowVolumeExpansion: true
    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/"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    參數

    描述

    allowVolumeExpansion

    僅通用型NAS檔案系統支援設定此參數。開啟時,該StorageClass動態建立的PV將會被配置NAS目錄配額,並支援通過編輯PVC進行卷容量擴容。

    說明

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

    mountOptions

    掛載NAS的options參數在mountOptions中配置,包括NFS協議版本。

    volumeAs

    設定為subpath。取值:

    • subpath:表示建立子目錄類型的PV。您需要手動建立NAS檔案系統以及掛載點。一個PV對應一個NAS檔案系統的子目錄。

    • sharepath:表示建立PV時不會建立實際的目錄,將會直接使用StorageClass中設定的路徑,這意味著每個PV實際上會對應同一個NAS目錄,便於跨Namespace共用目錄的使用情境。

    • filesystem:表示Provisioner會自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。

    server

    表示建立子目錄類型的PV時,NAS檔案系統的掛載點地址,不設定則預設為/。

    重要

    此處需替換為實際的掛載點地址,關於如何查看掛載點地址,請參見查看掛載點地址

    provisioner

    驅動類型。本例中取值為nasplugin.csi.alibabacloud.com,表示使用阿里雲NAS CSI外掛程式。

    reclaimPolicy

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

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

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

      • archiveOnDeletefalse時,刪除PVC時,PV和NAS檔案會被真正刪除。

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

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

    archiveOnDelete

    表示在reclaimPolicyDelete時,是否刪除後端儲存。因為NAS為共用儲存,添加此選項進行雙重確認。在參數parameters下配置。

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

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

    說明

    業務流量非常大時,不建議配置為false。更多資訊,請參見使用NAS動態儲存裝置卷時Controller的任務隊列已滿且無法建立新的PV

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

    kubectl create -f alicloud-nas-subpath.yaml

2、建立PVC

  1. 儲存以下內容至pvc.yaml檔案,並根據需求修改相關參數。

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

    參數

    說明

    name

    PVC名稱。

    accessModes

    配置訪問模式。預設為ReadWriteMany,支援ReadWriteOnceReadOnlyMany

    storageClassName

    StorageClass的名稱,用於綁定StorageClass。

    storage

    聲明應用儲存使用量。

    重要

    NAS配置PVC的容量僅在檔案系統類型為通用型NAS,且StorageClass設定allowVolumeExpansiontrue時才會生效。此時,CSI將按照PVC容量設定NAS目錄配額。NAS目錄配額單位為GiB,實際設定的容量上限為PVC容量按GiB單位向上取整。

  2. 建立PVC。

    kubectl create -f pvc.yaml

3、建立應用並掛載NAS

建立應用nginx-1和nginx-2,使其共用同一個NAS檔案系統的同一個子目錄。

  1. 儲存以下內容至nginx-1.yaml檔案中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-1
      labels:
        app: nginx-1
    spec:
      selector:
        matchLabels:
          app: nginx-1
      template:
        metadata:
          labels:
            app: nginx-1
        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
    • mountPath:NAS在容器中掛載的位置。

    • claimName:PVC的名稱,用於綁定PVC。本例中為nas-csi-pvc

  2. 儲存以下內容至nginx-2.yaml檔案中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-2
      labels:
        app: nginx-2
    spec:
      selector:
        matchLabels:
          app: nginx-2
      template:
        metadata:
          labels:
            app: nginx-2
        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
    • mountPath:NAS在容器中掛載的位置。本例為/data

    • claimName:輸入與nginx-1應用相同的PVC名稱,本例為nas-csi-pvc

  3. 建立應用nginx-1和nginx-2。

    kubectl create -f nginx-1.yaml -f nginx-2.yaml
  4. 查看Pod資訊。

    kubectl get pod

    預期輸出:

    NAME                                READY   STATUS    RESTARTS   AGE
    deployment-nas-1-5b5cdb85f6-a****   1/1     Running   0          32s
    deployment-nas-2-c5bb4746c-b****    1/1     Running   0          32s

    為不同的Pod掛載同一個NAS檔案系統的同一個子目錄/data,即掛載點為0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/nas-79438493-f3e0-11e9-bbe5-00163e09****的NAS儲存卷已同時掛載到應用deployment-nas-1-5b5cdb85f6-a****deployment-nas-2-c5bb4746c-b****/data目錄下。其中:

    • /k8s為StorageClass中指定的subpath。

    • nas-79438493-f3e0-11e9-bbe5-00163e09****為自動建立的NAS儲存卷PV的名稱。

    說明

    如果需要為不同的Pod掛載同一個NAS檔案系統的不同子目錄,則需要分別建立pvc-1和nginx-1以及pvc-2和nginx-2。

控制台

1、建立儲存類StorageClass

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

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

  3. 儲存類頁面,單擊右上方的建立

  4. 建立對話方塊中,StorageClass的相關配置完成後,單擊建立

    主要配置項如下所示。

    配置項

    說明

    樣本值

    名稱

    StorageClass的名稱。

    名稱必須以小寫字母開頭,只能包含小寫字母、數字、小數點(.)和中劃線(-)。

    alicloud-nas-subpath

    儲存卷類型

    選擇NAS

    NAS

    選擇掛載點

    NAS檔案系統的掛載點地址。關於如何查看掛載點地址,請參見查看掛載點地址

    若無可選的掛載點地址,請先建立NAS檔案系統。具體操作,請參見建立NAS檔案系統和掛載點

    0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/

    儲存卷模式

    儲存卷訪問模式。預設為共用目錄模式。取值:

    • 共用目錄:即Sharepath方式掛載,所有儲存卷共用掛載路徑,即資料將儲存於<bucket>:<path>/下。

    • 子目錄:即Subpath方式掛載,建立儲存卷時在掛載路徑下自動建立子目錄,即資料將儲存於<bucket>:<path>/<pv-name>/下。

      說明

      子目錄模式僅在CSI組件為1.31.4及以上版本時生效,否則均為共用目錄模式。

    子目錄

    掛載路徑

    NAS檔案系統中的掛載路徑。

    • 如果NAS根目錄下沒有此子目錄,會預設建立後再進行掛載。

    • 您可以不填此項,預設掛載到NAS根目錄。

    • 極速型NAS需要以/share為根目錄,例如/share/data

    /

    回收策略

    回收策略。支援DeleteRetain模式, 預設為Delete模式。

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

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

      • archiveOnDeletefalse時,刪除PVC時,PV和NAS檔案會被真正刪除。

    • Retain模式:刪除PVC時,PV和NAS檔案系統不會被刪除,需要您手動刪除。

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

    Retain

    掛載選項

    掛載NAS的選擇性參數,包括NFS協議版本等。

    NFS協議版本號碼推薦使用v3,且極速類型NAS僅支援v3。關於NFS協議的更多資訊,請參見NFS協議

    保持預設

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

2、建立PVC

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

  2. 儲存聲明頁面,單擊右上方的建立

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

    配置項

    說明

    樣本值

    儲存宣告類型

    選擇NAS。

    NAS

    名稱

    建立的儲存聲明名稱在叢集內必須唯一。

    pvc-nas

    分配模式

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

    使用儲存類動態建立

    已有儲存類

    單擊選擇儲存類,在選擇儲存類對話方塊目標儲存類右側操作列單擊選擇

    選擇上一步建立的alicloud-nas-subpath儲存類

    總量

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

    20Gi

    訪問模式

    預設為ReadWriteMany,也可選擇ReadWriteOnceReadOnlyMany

    ReadWriteMany

3、建立應用並掛載NAS

參考以下操作,分別建立應用 deployment-nas-1和 deployment-nas-2,使其共用同一個NAS檔案系統的同一個子目錄。

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

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

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

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

    配置項

    參數

    說明

    樣本

    應用基本資料

    應用程式名稱

    Deployment名稱,自訂輸入。格式要求請參考介面提示。

    deployment-nas-1

    副本數量

    Deployment的副本數量。

    2

    容器配置

    鏡像名稱

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

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    所需資源

    所需的vCPU和記憶體資源。

    0.25 vCPU,0.5 GiB

    資料卷

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

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

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

    • 掛載源:pvc-nas

    • 容器路徑:/data

    nas1.png

  4. 查看應用部署狀態。

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

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

使用sharepath方式掛載

kubectl

1、建立儲存類StorageClass

  1. 儲存以下內容至alicloud-nas-subpath.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:/data"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    參數

    描述

    mountOptions

    掛載NAS的選擇性參數,包括NFS協議版本等。

    NFS協議版本號碼推薦使用v3,且極速類型NAS僅支援v3。關於NFS協議的更多資訊,請參見NFS協議

    volumeAs

    設定為sharepath。取值:

    • subpath:表示建立子目錄類型的PV。您需要手動建立NAS檔案系統以及掛載點。一個PV對應一個NAS檔案系統的子目錄。

    • sharepath:表示建立PV時不會建立實際的目錄,將會直接使用StorageClass裡設定的路徑,這意味著每個PV實際上會對應同一個NAS目錄,便於跨namespace共用目錄使用情境。

    • filesystem:表示Provisioner會自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。

    server

    表示建立子目錄類型的PV時,NAS檔案系統的掛載點地址以及路徑,不設定路徑則預設為/

    重要

    此處需替換為實際的掛載點地址,關於如何查看掛載點地址,請參見查看掛載點地址

    provisioner

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

    reclaimPolicy

    使用 sharepath時必須要設定為 Retain

  2. 建立StorageClass。

    kubectl create -f alicloud-nas-sharepath.yaml

2、在兩個不同命名空間下建立PVC

為實現跨命名空間下Pod的掛載NAS,您需要先建立兩個不同的命名空間。

  1. 執行以下命令,建立命名空間ns1和ns2。

    kubectl create ns ns1
    kubectl create ns ns2
  2. 儲存以下內容至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

    參數

    說明

    name

    PVC名稱。

    accessModes

    配置訪問模式。預設為ReadWriteMany,支援ReadWriteOnceReadOnlyMany

    storageClassName

    StorageClass的名稱,用於綁定StorageClass。

    storage

    聲明應用儲存使用量。

    重要

    使用sharepath時,聲明不會實際產生效果。

  3. 建立PVC。

    kubectl create -f pvc.yaml

3、建立應用並掛載

  1. 在兩個不同命名空間下分別建立應用,掛載相應命名空間下建立的PVC,它們將共用StorageClass中定義的NAS目錄。

    1. 儲存以下內容至nginx.yaml檔案中,包含兩個 Deployment。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        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
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        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
      • mountPath:NAS在容器中掛載的位置。

      • claimName:PVC的名稱,用於綁定PVC。本例中為nas-csi-pvc

    2. 建立應用。

      kubectl create -f nginx.yaml
  2. 查看Pod資訊。

    kubectl get pod -A -l app=nginx

    預期輸出:

    NAMESPACE  NAME                READY   STATUS    RESTARTS   AGE
    ns1      nginx-5b5cdb85f6-a****   1/1     Running   0          32s
    ns2      nginx-c5bb4746c-b****    1/1     Running   0          32s

    為不同命名空間的Pod掛載同一個NAS檔案系統的同一個子目錄/data,即掛載點為0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/data的NAS儲存卷已同時掛載到應用nginx-5b5cdb85f6-a****nginx-c5bb4746c-b****/data目錄下。

控制台

1、建立儲存類StorageClass

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

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

  3. 儲存類頁面,單擊右上方的建立

  4. 建立對話方塊中,StorageClass的相關配置完成後,單擊建立

    主要配置項如下所示。

    配置項

    說明

    樣本值

    名稱

    StorageClass的名稱。

    名稱必須以小寫字母開頭,只能包含小寫字母、數字、小數點(.)和中劃線(-)。

    alicloud-nas-sharepath

    儲存卷類型

    選擇NAS

    NAS

    選擇掛載點

    NAS檔案系統的掛載點地址。關於如何查看掛載點地址,請參見查看掛載點地址

    若無可選的掛載點地址,請先建立NAS檔案系統。具體操作,請參見建立NAS檔案系統和掛載點

    0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/data

    儲存卷模式

    儲存卷訪問模式。預設為共用目錄模式。取值:

    • 共用目錄:即Sharepath方式掛載,表示建立PV時不會建立實際的目錄,將會直接使用StorageClass裡設定的路徑,這意味著每個PV實際上會對應同一個NAS目錄,便於跨Namespace共用目錄使用情境。

    • 子目錄:即Subpath方式掛載,表示建立子目錄類型的PV。您需要手動建立NAS檔案系統以及掛載點。一個PV對應一個NAS檔案系統的子目錄。

    共用目錄

    掛載路徑

    NAS檔案系統中的掛載路徑。

    • 如果NAS根目錄下沒有此子目錄,會預設建立後再進行掛載。

    • 您可以不填此項,預設掛載到NAS根目錄。

    • 極速型NAS需要以/share為根目錄,例如/share/data

    /

    回收策略

    使用sharepath時必須要設定為Retain

    Retain

    掛載選項

    掛載NAS的選擇性參數,包括NFS協議版本等。

    NFS協議版本號碼推薦使用v3,且極速類型NAS僅支援v3。關於NFS協議的更多資訊,請參見NFS協議

    保持預設

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

2、建立PVC

為實現應用跨Namespace共用目錄的掛載,您需要首先在控制台建立命名空間ns1和ns2。

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

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

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

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

    配置項

    說明

    樣本值

    儲存宣告類型

    選擇NAS。

    NAS

    名稱

    建立的儲存聲明名稱在叢集內必須唯一。

    pvc-nas

    分配模式

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

    使用儲存類動態建立

    已有儲存類

    單擊選擇儲存類,在選擇儲存類對話方塊目標儲存類右側操作列單擊選擇

    選擇上一步建立的儲存類alicloud-nas-sharepath

    總量

    建立儲存卷的容量。

    20Gi

    訪問模式

    預設為ReadWriteMany,也可選擇ReadWriteOnceReadOnlyMany

    ReadWriteMany

  5. 參考以上操作,在命名空間ns2下建立pvc-nas。

3、建立應用並掛載NAS

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

  2. 無狀態頁面,選擇命名空間ns1,單擊使用鏡像建立

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

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

    配置項

    參數

    說明

    樣本

    應用基本資料

    應用程式名稱

    Deployment名稱,自訂輸入。格式要求請參考介面提示。

    nginx

    副本數量

    Deployment的副本數量。

    2

    容器配置

    鏡像名稱

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

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    所需資源

    所需的vCPU和記憶體資源。

    0.25 vCPU,0.5 GiB

    資料卷

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

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

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

    • 掛載源:pvc-nas

    • 容器路徑:/data

    nas1.png

  4. 參考以上操作,在命名空間ns2下建立應用nginx。

  5. 查看應用部署狀態。

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

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

步驟三:驗證NAS的儲存特性

以上建立的工作負載Deployment中包含2個Pod,2個Pod掛載了同一個NAS檔案系統,您可以通過以下方式對NAS儲存卷進行共用儲存和持久化儲存驗證。

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

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

驗證NAS的持久化儲存

  1. 查看應用所在的Pod。

    kubectl get pod 

    預期輸出:

    NAME                                READY   STATUS    RESTARTS   AGE
    deployment-nas-1-5b5cdb85f6-a****   1/1     Running   0          32s
    deployment-nas-2-c5bb4746c-b****    1/1     Running   0          32s
  2. 在一個Pod中建立檔案。

    1. 查看應用中掛載的/data路徑下有無檔案。

      以一個名為deployment-nas-1-5b5cdb85f6-a****的Pod為例。

      kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data

      無返回結果,表明/data路徑下無檔案。

    2. 在該Pod的/data路徑下建立檔案nas。

      kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- touch /data/nas
  3. 在另一個Pod中查看建檔案。

    以另一個名為deployment-nas-2-c5bb4746c-b****的Pod為例。

    kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data

    預期輸出:

    nas
  4. 重建Pod。

    1. 刪除Pod。

      kubectl delete pod deployment-nas-1-5b5cdb85f6-a****
    2. 同時在另一個視窗中,查看Pod刪除及Kubernetes重建Pod的過程。

      kubectl get pod -w -l app=nginx
  5. 驗證刪除Pod後,NAS裡建立的檔案是否還存在。

    1. 查看重建的Pod名稱。

      kubectl get pod

      預期輸出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdm2g5-c****    1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-b****    1/1     Running   0          32s
    2. 查看重建Pod的/data路徑下的檔案。

      以名為deployment-nas-1-5b5cdm2g5-c**** 的Pod為例。

      kubectl exec deployment-nas-1-5b5cdm2g5-c**** -- ls /data

      預期輸出:

      nas

      nas檔案仍然存在,表明NAS的資料可持久化儲存。

驗證NAS的共用儲存

NAS儲存卷支援同時被多個Pod掛載,當某個Pod修改資料時,其餘Pod將自行實現資料的同步,根據以下樣本驗證NAS儲存卷的共用儲存特性:

  1. 查看部署的應用所在的Pod和NAS檔案。

    1. 執行以下命令,查看應用所在的Pod名稱。

      kubectl get pod 

      預期輸出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdb85f6-a****   1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-b****    1/1     Running   0          32s
    2. 查看2個Pod的/data路徑下的檔案。

      kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data
      kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data

      無返回結果,說明當前儲存路徑/data下無檔案。

  2. 在任意一個Pod的/data路徑下建立檔案nas。

    以名為deployment-nas-1-5b5cdb85f6-a****的Pod為例。

     kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- touch /data/nas
  3. 查看2個Pod的/data路徑下的檔案。

    1. 查看名為deployment-nas-1-5b5cdb85f6-a****的Pod的/data路徑下的檔案。

      kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data

      預期輸出:

      nas
    2. 查看另一個名為deployment-nas-2-c5bb4746c-b****的Pod的 /data路徑下的檔案。

      kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data

      預期輸出:

      nas

      在任意一個Pod的/data下建立的檔案,兩個Pod下的/data路徑下均存在此檔案,說明兩個Pod共用一個NAS。

常見問題

如何?NAS的使用者或使用者組隔離?

為確保不同使用者和使用者組之間資料的安全性,您可以參考以下操作對NAS的使用者或使用者組進行隔離。

  1. 使用以下YAML內容,在容器組內使用nobody使用者啟動進程,建立的目錄UID和GID為65534。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nas-sts
    spec:
      selector:
        matchLabels:
          app: busybox
      serviceName: "busybox"
      replicas: 1
      template:
        metadata:
          labels:
            app: busybox
        spec:
          securityContext:
            fsGroup: 65534    #建立目錄/檔案時,UID/GID為65534(nobody使用者)。
            fsGroupChangePolicy: "OnRootMismatch"    #只有根目錄的屬主與存取權限與卷所期望的許可權不一致時, 才改變其中內容的屬主和存取權限。
          containers:
          - name: busybox
            image: busybox
            command:
            - sleep
            - "3600"
            securityContext:
              runAsUser: 65534    #所有容器內的進程都使用使用者ID為65534(nobody使用者)來運行。
              runAsGroup: 65534   #所有容器中的進程都以主組ID為65534(nobody使用者)來運行。
              allowPrivilegeEscalation: false
            volumeMounts:
            - name: nas-pvc
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: nas-pvc
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alicloud-nas-subpath"
          resources:
            requests:
              storage: 100Gi
  2. 執行以下命令,在容器中啟動top命令,查看USER是否為nobody。

    kubectl exec nas-sts-0 -- "top"

    預期輸出:

    Mem: 11538180K used, 52037796K free, 5052K shrd, 253696K buff, 8865272K cached
    CPU:  0.1% usr  0.1% sys  0.0% nic 99.7% idle  0.0% io  0.0% irq  0.0% sirq
    Load average: 0.76 0.60 0.58 1/1458 54
      PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
       49     0 nobody   R     1328  0.0   9  0.0 top
        1     0 nobody   S     1316  0.0  10  0.0 sleep 3600

    預期輸出表明,是nobody使用者執行的top命令。

  3. 執行以下命令,驗證在NAS掛載目錄下建立的目錄和檔案是否為nobody

    kubectl exec nas-sts-0 -- sh -c "touch /data/test; mkdir /data/test-dir; ls -arlth /data/"

    預期輸出:

    total 5K
    drwxr-xr-x    1 root     root        4.0K Aug 30 10:14 ..
    drwxr-sr-x    2 nobody   nobody      4.0K Aug 30 10:14 test-dir
    -rw-r--r--    1 nobody   nobody         0 Aug 30 10:14 test
    drwxrwsrwx    3 root     nobody      4.0K Aug 30 10:14 .

    預期輸出表明,在/data下建立的test檔案和test-dir目錄中,UID和GID對應的使用者均為nobody使用者。

如何使用filesystem方式掛載NAS動態儲存裝置卷?

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

展開查看如何使用filesystem方式掛載

重要

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

使用filesystem類型NAS儲存卷的Pod只能建立一個檔案系統和一個掛載點。

ACK專有叢集需執行以下全部步驟,其他類型叢集從以下步驟2建立儲存類StorageClass開始執行至結束。

1、(可選)RAM Policy設定和授予

ACK專有叢集需要執行本步驟。

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

2、建立儲存類StorageClass

  1. 建立並複製以下內容到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

    參數

    描述

    volumeAs

    設定為filesystem。取值:

    • subpath:表示建立子目錄類型的PV。你需要手動建立NAS檔案系統以及掛載點。一個PV對應一個NAS檔案系統的子目錄。

    • filesystem:表示Provisioner會自動建立NAS檔案系統,一個PV對應一個NAS檔案系統。

    fileSystemType

    建立NAS檔案系統的類型。預設為standard。取值:

    • standard:通用型NAS。

    • extreme:極速型NAS。

    storageType

    建立NAS檔案系統的儲存規格類型。

    • 當fileSystemType=standard時,可選Performance(效能型)和Capacity(容量型)兩種類型,預設為Performance(效能型)。

    • 當fileSystemType=extreme時,可選standard(標準型)和advanced(進階型)兩種類型,預設為standard(標準型)。

    regionId

    建立NAS檔案系統所在地區。

    zoneId

    建立NAS檔案系統所在可用性區域。

    vpcId

    建立NAS檔案系統對應掛載點所在VPC。

    vSwitchId

    建立NAS檔案系統對應掛載點所在vSwitch ID。

    accessGroupName

    建立NAS檔案系統對應掛載點所用的AccessGroup。預設為DEFAULT_VPC_GROUP_NAME

    deleteVolume

    資料卷刪除時NAS檔案系統的處理策略,由於NAS為共用檔案系統,出於安全考慮需要同時配置。

    provisioner

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

    reclaimPolicy

    PV的回收策略。當值為DeletedeleteVolumetrue時,才會在刪除PVC的時候將NAS檔案系統刪除。

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

    kubectl create -f alicloud-nas-fs.yaml

3、建立PVC和Pod掛載NAS儲存卷

  1. 建立並複製以下內容到pvc.yaml檔案中。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-csi-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-fs
      resources:
        requests:
          storage: 20Gi
  2. 建立並複製以下內容到nginx.yaml檔案中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-fs
      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"
          volumes:
            - name: nas-pvc
              persistentVolumeClaim:
                claimName: nas-csi-pvc-fs
  3. 建立PVC和Pod。

    kubectl create -f pvc.yaml -f nginx.yaml

相關文檔