全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用NAS动态存储卷

更新时间:Dec 11, 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文件系统。

      专有网络VPC虚拟交换机

      仅针对通用型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. 登录容器服务管理控制台,在左侧导航栏选择集群

  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. 登录容器服务管理控制台,在左侧导航栏选择集群

  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

相关文档