全部產品
Search
文件中心

File Storage NAS:通過NFS使用NAS動態儲存裝置卷

更新時間:Aug 30, 2024

Container Service Kubernetes 版CSI支援subpath方式和filesystem方式兩種類型的NAS動態儲存裝置卷掛載,您可以通過Container Service控制台或kubectl兩種方式進行掛載。本文介紹如何使用阿里雲NAS動態儲存裝置卷,以及如何驗證NAS儲存卷的持久化儲存與共用儲存特性。

前提條件

使用情境

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

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

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

使用限制及說明

  • NAS為共用儲存,可以同時為多個Pod提供共用儲存服務,即一個PVC可以同時被多個Pod使用。

  • CSI外掛程式不支援SMB掛載。

  • 資料卷掛載協議推薦使用NFSv3,極速型NAS僅支援NFSv3,掛載參數需要添加nolock

  • NAS儲存卷只能掛載到相同VPC的ECS執行個體,不支援不同VPC網路的掛載。

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

  • 使用NAS資料卷前,建議將CSI儲存外掛程式升級到最新版本。

  • NAS掛載點建立後,等待一定時間,待掛載點狀態可用後方可使用。

  • 在沒有卸載NAS檔案系統前,務必不要刪除NAS掛載點,否則會造成作業系統無響應。

  • ACK Serverless叢集中,subpath類型的PV刪除後,相應子目錄的不會自動刪除。也就意味著,當PV的reclaimPolicyDelete時,即使PV刪除,NAS中實際的目錄檔案也並不會被刪除。如需刪除,需在手動掛載後執行刪除。

注意事項

  • NAS為共用儲存,可以同時為多個Pod提供共用儲存服務,即一個PVC可以同時被多個應用使用。關於NAS並發寫入的一些限制條件,請參見如何避免多進程或多用戶端並發寫同一記錄檔可能出現的異常?如何解決向NFS檔案系統中寫入資料延遲問題?

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

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

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

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

使用NAS動態儲存裝置卷

CSI外掛程式支援使用subpath方式和filesystem方式掛載NAS動態儲存裝置卷,您可以通過控制台和kubectl命令列兩種方式進行操作。

subpath方式:支援通過控制台和kubectl命令列兩種方式操作。

當多個應用或者Pod需要掛載相同的NAS儲存卷共用資料時,或者不同的Pod掛載相同的NAS檔案系統的不同子目錄時,您可以使用subpath方式進行掛載。

filesystem方式:僅支援通過kubectl命令列方式操作。

當您的Kubernetes應用需要動態建立和刪除NAS檔案系統和掛載點時,您可以使用filesystem方式進行掛載。

sharedpath方式:已廢棄。如果您需要多個Pod掛載同一個NAS目錄,請直接使用靜態建立PV的方式。

通過控制台使用subpath類型的NAS動態儲存裝置卷

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

NAS動態儲存裝置卷的掛載方式為subpath類型時,您需要手動建立NAS檔案系統和掛載點。

  1. 登入NAS控制台

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

    說明

    若需要加密NAS儲存卷中的資料,請在建立NAS檔案系統時配置加密類型。

  3. 添加掛載點,並且該掛載點與叢集節點在同一VPC內。具體操作,請參見管理掛載點

步驟二:建立StorageClass

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

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

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

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

    主要配置項如下所示。

    配置項

    說明

    名稱

    StorageClass的名稱。

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

    儲存卷類型

    可選擇雲端硬碟NAS。本樣本選擇NAS

    選擇掛載點

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

    若無可選的掛載點地址,請先建立NAS檔案系統。具體操作,請參見通過CNFS管理NAS檔案系統(推薦)

    回收策略

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

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

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

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

    • Delete模式:刪除PVC時,會自動刪除PV,但不會實際刪除NAS的對應目錄。這是因為在ACK Serverless叢集中, csi-provisioner組件無法使用Linux特權,所以無法掛載檔案系統進行目錄的刪除或重新命名。

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

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

    掛載選項

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

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

    掛載路徑

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

  5. 參數配置完成後,單擊建立

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

步驟三:建立PVC

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

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

  3. 在彈出的建立儲存聲明頁面中,完成相關配置。

    配置項

    說明

    儲存宣告類型

    支援雲端硬碟、NAS、OSS三種雲端儲存類型。本樣本選擇NAS。

    名稱

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

    分配模式

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

    已有儲存類

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

    總量

    建立儲存卷的容量。

    訪問模式

    預設為ReadWriteMany,也可選擇ReadWriteOnceReadOnlyMany

  4. 單擊建立

步驟四:建立應用

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

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

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

  4. 以下主要為您介紹資料卷的配置。關於其他參數的描述,請參見建立無狀態工作負載Deployment

    ACK資料卷支援配置本機存放區和雲端儲存。

    • 本機存放區:支援主機目錄(HostPath)、配置項(ConfigMap)、保密字典(Secret)和臨時目錄,將對應的掛載源掛載到容器路徑中。更多資訊,請參見Volumes

    • 雲端儲存:支援雲端儲存類型。

    本例中配置了一個NAS類型的資料卷,將該NAS儲存卷掛載到容器中/tmp路徑下。

    image.png

  5. 配置完成後,單擊建立

通過kubectl使用subpath類型的NAS動態儲存裝置卷

NAS動態儲存裝置卷的掛載方式為subpath類型時,您需要手動建立NAS檔案系統和掛載點。

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

    1. 登入NAS控制台

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

      說明

      若需要加密NAS儲存卷中的資料,請在建立NAS檔案系統時配置加密類型。

    3. 添加掛載點,並且該掛載點與叢集節點在同一VPC內。具體操作,請參見管理掛載點

  2. 建立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進行卷容量擴容。

      mountOptions

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

      volumeAs

      可選subpathfilesystem,分別表示建立子目錄類型的PV和檔案系統類型的PV。

      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
  3. 執行以下命令建立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,且StorageClass的allowVolumeExpansion為true時,才會為NAS目錄設定配額。

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

      kubectl create -f pvc.yaml
  4. 執行以下命令建立應用。

    建立應用nginx-1nginx-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: nginx:1.7.9
              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: nginx:1.7.9
              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-1nginx-2

      kubectl create -f nginx-1.yaml -f nginx-2.yaml
  5. 執行以下命令查看Pod資訊。

    kubectl get pod

    預期輸出:

    NAME                                READY   STATUS    RESTARTS   AGE
    deployment-nas-1-5b5cdb85f6-n****   1/1     Running   0          32s
    deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    說明

    NAS儲存卷的0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/share/nas-79438493-f3e0-11e9-bbe5-00163e09****會同時掛載到deployment-nas-1-5b5cdb85f6-n****deployment-nas-2-c5bb4746c-4****/data目錄下。其中:

    • /share:StorageClass中指定的subpath。

    • nas-79438493-f3e0-11e9-bbe5-00163e09****:PV的名稱。

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

通過kubectl使用filesystem類型的NAS動態儲存裝置卷

重要

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

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

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

  1. 可選: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: ""
  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兩種類型:

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

      • subpath類型表示一個PV對應一個NAS檔案系統的子目錄,Provisioner自動建立NAS檔案系統的子目錄。

      fileSystemType

      定義建立NAS檔案系統的類型。可選standard和extreme兩種類型:

      • standard:通用型NAS。

      • extreme:極速型NAS。

      預設為通用型NAS。

      storageType

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

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

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

      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: nginx:1.7.9
              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

這種情境下,CSI會在PVC建立時動態建立NAS檔案系統和掛載點,PVC刪除時動態刪除掛載點和檔案系統。

驗證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-n****   1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 執行以下命令,查看任意一個Pod/data路徑下的檔案,本文以名為deployment-nas-1-5b5cdb85f6-n****的Pod為例。

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

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

  2. 執行以下命令,在名為deployment-nas-1-5b5cdb85f6-n****的Pod/data路徑下建立檔案nas。

    kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- touch /data/nas
  3. 執行以下命令,查看名為deployment-nas-1-5b5cdb85f6-n****的Pod/data路徑下的檔案。

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

    預期輸出:

    nas
  4. 執行以下命令,刪除Pod。

    kubectl delete pod deployment-nas-1-5b5cdb85f6-n****
  5. 同時在另一個視窗中,執行以下命令,查看Pod刪除及Kubernetes重建Pod的過程。

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

    1. 執行以下命令,查看Kubernetes重建的Pod名稱。

      kubectl get pod

      預期輸出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdm2g5-m****    1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 執行以下命令,查看名為deployment-nas-1-5b5cdm2g5-m****的Pod/data路徑下的檔案。

      kubectl exec deployment-nas-1-5b5cdm2g5-m**** -- 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-n****   1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 執行以下命令,查看2個Pod/data路徑下的檔案。

      kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- ls /data
      kubectl exec deployment-nas-2-c5bb4746c-4**** -- ls /data
  2. 執行以下命令,在任意一個Pod的/data路徑下建立檔案nas。

     kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- touch /data/nas
  3. 執行以下命令,查看2個Pod/data路徑下的檔案。

    1. 執行以下命令,查看名為deployment-nas-1-5b5cdb85f6-n****的Pod/data路徑下的檔案。

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

      預期輸出:

      nas
    2. 執行以下命令,查看名為deployment-nas-2-c5bb4746c-4****的Pod /data路徑下的檔案。

      kubectl exec deployment-nas-2-c5bb4746c-4**** -- 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使用者。

相關文檔