全部產品
Search
文件中心

File Storage NAS:使用NAS實現共用儲存和持久化儲存-Flexvolume

更新時間:Nov 29, 2024

NAS提供了共用儲存和持久化儲存的服務,滿足您需要多個Pod共用資料的應用情境。本文介紹如何使用NAS實現共用儲存和持久化儲存。

前提條件

背景資訊

NAS支援同時被多個Pod掛載,此時多個Pod可能同時修改相同資料,需要應用自行實現資料的同步。

具狀態服務-NAS的使用情境:

  • 對磁碟I/O要求較高的應用。

  • 讀寫效能相對於Object Storage Service更高。

  • 可實現跨主機檔案分享權限設定,例如可作為檔案伺服器。

具狀態服務-NAS的使用方式:

  1. 手動建立檔案系統,並添加掛載點。

  2. 手動建立PV及PVC。

本文介紹如何利用阿里雲提供的flexvolume外掛程式,通過PV或PVC的方式使用阿里雲NAS。

建立PV

  1. 建立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會導致掛載非常慢,甚至掛載失敗,不建議配置。

  2. 執行以下命令,建立PV。

    kubectl create -f pv-nas.yaml

預期結果:

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列中,單擊叢集

  3. 叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

  4. 在叢集管理頁左側導覽列中,選擇儲存 > 儲存卷,可以看到剛剛建立的PV。建立PV

建立PVC

建立NAS儲存聲明PVC,使用selector篩選PV,精確配置PVC和PV的綁定關係。

  1. 建立pvc-nas.yaml檔案。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas
  2. 執行以下命令,建立PVC。

    kubectl create -f pvc-nas.yaml

預期結果:

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列中,單擊叢集

  3. 叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

  4. 在叢集管理頁左側導覽列中,選擇儲存 > 儲存聲明,可以看到剛剛建立的PVC。建立PVC

建立應用

  1. 建立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
  2. 執行以下命令,建立Deployment。

    kubectl create -f nas.yaml

預期結果:

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列中,單擊叢集

  3. 叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的應用管理

  4. 在目標叢集頁面下,選擇左側導覽列的工作負載 > 無狀態,可以看到剛剛建立的Deployment。建立應用

NAS的共用儲存

  1. 執行以下命令,查看部署的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
  2. 執行以下命令,查看/data路徑下的檔案。

    kubectl exec nas-static-f96b6b5d7-r**** -- ls /data                    

    預期輸出:

    kubectl exec nas-static-f96b6b5d7-w**** -- ls /data                   
    說明

    /data路徑下為空白,沒有檔案。

  3. 執行以下命令,在任意一個Pod的/data路徑下建立檔案nas

    kubectl exec nas-static-f96b6b5d7-r**** -- touch /data/nas
  4. 查看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的持久化儲存

  1. 執行以下命令,刪除該應用的所有Pod。

    kubectl delete pod nas-static-f96b6b5d7-r**** nas-static-f96b6b5d7-wthmb

    預期輸出:

    pod "nas-static-f96b6b5d7-r****" deleted
    pod "nas-static-f96b6b5d7-w****" deleted
  2. 執行以下命令,查看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
  3. 執行以下命令,查看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
  4. 查看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的資料可持久儲存。