You need to enable JavaScript to run this app.
导航

NAS 持久化存储最佳实践

最近更新时间2024.02.01 11:03:42

首次发布时间2022.04.12 10:10:07

NAS 提供了共享存储和持久化存储的服务,满足您需要多个 Pod 共享数据的应用场景。本文以静态创建 PV 的方式介绍如何使用 NAS 实现共享存储和持久化存储。

应用场景

NAS 支持同时被多个 Pod 挂载,此时多个 Pod 可能同时修改相同数据,需要应用自行实现数据的同步。

有状态服务 NAS 的使用场景

  • 对磁盘 I/O 要求较高的应用。
  • 读写性能相对于对象存储 TOS 高。
  • 可实现跨主机文件共享,例如可作为文件服务器。

有状态服务 NAS 的使用方式

  1. 手动创建文件系统,并添加挂载点。
  2. 手动创建 PV 及 PVC。

前提条件

  • 已注册火山引擎账号并完成实名认证,具体步骤,请参见 账号注册实名认证
  • 已创建文件系统所属项目。关于项目的详情及创建项目的具体步骤,请参见 项目管理
  • 已创建私有网络 VPC,操作详情,请参见 创建私有网络。文件系统挂载时的 VPC 网络要与您 Kubernetes 集群所在的 VPC 网络保持一致。
  • 已在文件存储控制台创建一个文件系统和挂载点,若未创建请参见下文步骤一,创建的文件系统需要与您的 Kubernetes 集群在同一可用区。
  • 使用文件系统的 Pod 需运行在同一节点,并且保障节点和您创建的文件存储在同一可用区。

操作步骤

步骤一:创建文件存储和挂载点

  1. 登录 文件系统 NAS 控制台,在顶部菜单栏选择地域。
  2. 在左侧导航栏,选择 文件系统 > 实例列表,创建文件系统。详细介绍参见:创建文件系统

alt

  1. 在左侧导航栏选择 文件系统 > 权限组,创建权限组并完成授权管理规则配置。详细介绍参见:创建权限组及规则

alt

  1. 在左侧导航栏中选择 文件系统 > 实例列表,单击需要创建挂载点的文件系统名称并创建挂载点。详细介绍参见:创建挂载点

alt

步骤二:创建存储卷(PV)

  1. 在集群管理页面,选择 存储管理 > 存储卷
  2. 单击存储卷列表左上角 创建存储卷
  3. 在弹出的 创建存储卷 页面,完成参数配置。

alt

配置项说明
创建方式选择存储卷的创建方式,支持 静态创建,即由管理员创建 PV。
名称根据系统提示,自定义存储卷的名称。需确保存储卷名称在集群内唯一。
存储卷类型存储卷类型包括:云盘、文件存储、对象存储。本场景选择 文件存储
访问模式选择存储卷的访问方式,目前支持 ReadWriteMany ,此访问方式支持多点读写。

文件系统类型

选择文件存储的文件系统类型。

  • 极速型:适用于 Linux 时延敏感型应用,例如:中小场景 AI、文件共享、Devops 代码存储。
  • 通用型:【邀测·申请试用】用于存储频繁访问的热数据,例如:数据库备份、日志存储、主目录等通用类文件共享业务。

说明

通用型文件存储在容器服务和文件存储 NAS 产品中均属于邀测特性,若需要使用此功能,需同时获取容器服务和文件存储 NAS 的邀测试用权限。

挂载点选择已有 NAS 文件系统下存在,且与集群在同一个私有网络(VPC)内的挂载点。

子目录

根据系统提示的输入规范,输入待挂载文件系统的子目录信息,默认为根目录/

说明

需要保证将要挂载的子目录在 NFS 中已经存在。

NFS 版本

选择所创建存储卷的网络文件系统(Network File System)版本,请按实际需求选择使用。

  • 若文件系统类型为极速型,支持 NFSv3 和 NFSv4 两个版本。
  • 若文件系统类型为通用型,支持 NFSv4 和 NFSv4.1 两个版本。
  1. 配置完成后,单击 确定,完成存储卷创建。

使用 Yaml 创建 PV 的示例如下

apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: vke-nas-static-pv  # PV 名称。
    spec:
      accessModes:  # 存储卷的访问方式,目前仅支持 ReadWriteMany(多点读写)。
      - ReadWriteMany
      capacity:
        storage: 100Gi # NAS 存储容量。  
      csi:
        driver: nas.csi.volcengine.com  # 驱动类型,本示例为`nas.csi.volcengine.com`,表示火山引擎 csi-nas 插件。
        volumeAttributes:
          fsId: enas-cnbj1b9f********  # NAS 文件系统 ID,仅当文件系统类型为极速型时需要配置。
          fsType: Extreme   # 文件系统类型,Extreme:极速型;Common:通用型。
          path: /enas-cnbj1b9f********/temp  # NAS 文件系统挂载子目录。
          server: cnbj1b9f********.r*********.nas.ivolces.com  # NAS 文件系统挂载点地址。
          volumeAs: subpath  # 创建的子目录类型。subpath:子路径;filesystem:文件系统。
        volumeHandle: vke-nas-static-pv  # PV 的唯一标识符,与 PV 名称保持一致。如需同时使用多个 PV,则各个 PV 中该值必须不一致。
      mountOptions:
      - nolock,proto=tcp,noresvport
      - vers=3  # 挂载 NAS 数据卷的 NFS 协议版本号。3:NFSv3;4:NFSv4;4.1:NFSv4.1。
      persistentVolumeReclaimPolicy: Retain  # PV 回收策略。Retain:保留策略,Delete:删除策略。
      volumeMode: Filesystem  # PV 类型。Filesystem:将卷作为文件系统使用,设置为 Filesystem 的卷会被 Pod 挂载到某个目录;Block:将卷作为块设备使用。

步骤三:创建存储卷声明(PVC)

  1. 在集群管理页面,选择 存储管理 > 存储卷声明
  2. 单击存储卷列表左上角 创建存储卷声明
  3. 在弹出的 创建存储卷声明 页面,完成参数配置。

alt

配置项说明
命名空间选择存储卷声明所属的命名空间。建议选择您自定义的命名空间,或系统默认创建的 default 命名空间。命名空间相关介绍,请参见 命名空间概述
名称根据系统提示自定义存储卷声明的名称,需确保存储卷声明名称在集群内唯一。
存储类型存储类型包括:云盘、文件存储、对象存储。本场景选择 文件存储
访问模式选择存储卷声明的访问方式,目前支持 ReadWriteMany ,此访问方式支持多点读写。
计费类型按需选择资源计费类型,目前支持按量计费。

文件系统类型

选择文件存储的文件系统类型。

  • 极速型:适用于 Linux 时延敏感型应用,例如:中小场景 AI、文件共享、Devops 代码存储。
  • 通用型:【邀测·申请试用】用于存储频繁访问的热数据,例如:数据库备份、日志存储、主目录等通用类文件共享业务。

说明

通用型文件存储在容器服务和文件存储 NAS 产品中均属于邀测特性,若需要使用此功能,需同时获取容器服务和文件存储 NAS 的邀测试用权限。

创建方式存储卷声明的创建方式包括:基于存储类创建、使用已有存储卷。本场景选择 使用已有存储卷
存储卷使用已有存储卷时需配置此参数。指定文件存储类型的存储卷进行关联挂载。
  1. 配置完成后,单击 确定,完成存储卷声明创建。

使用 Yaml 创建 PVC 的示例如下

apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: vke-nas-static-pvc  # PVC 名称。
    spec:
      accessModes:
      - ReadWriteMany  # PVC 访问模式。目前仅支持 ReadWriteMany ,表示多点读写。
      resources:
        requests:
          storage: 100Gi  # 声明的存储使用量。
      volumeMode: Filesystem  # PV 类型,本示例填写 Filesystem,表示文件存储。
      volumeName: vke-nas-static-pv  # 绑定到该 PVC 的 PV 名称。

步骤四:创建应用并添加卷

文件存储类型的静态存储卷创建完成后,可通过添加卷的方式挂载到工作负载使用,包括:无状态负载、任务、定时任务、守护进程。
可通过创建工作负载或更新工作负载操作的容器配置步骤,为工作负载添加卷并挂载卷。以创建无状态负载为例,详细操作参见:创建无状态负载

alt

使用 Yaml 创建 Deployment 的示例如下

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vke-nas-static-deployment  # Deployment 名称。
      namespace: default
      labels:
      app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vke-nas-static-deployment
      template:
        metadata:
          labels:
            app: vke-nas-static-deployment
        spec:
          containers:
          - image: nginx
            imagePullPolicy: IfNotPresent
            name: nginx
            volumeMounts:
            - mountPath: /tmp  # NAS 在容器中挂载的位置。
              name: nas-pv
          volumes:
          - name: nas-pv
            persistentVolumeClaim:
              claimName: vke-nas-static-pvc  # 步骤二中创建的 PVC 名称。

结果验证

验证 NAS 的共享存储

  1. 在 kubectl 中执行以下命令,查看创建的应用。
kubectl get pod

预期输出:

NAME                                     READY   STATUS    RESTARTS   AGE
web-5c4d7f****-8f9qx                     1/1     Running   0          2m53s
web-5c4d7f****-brvch                     1/1     Running   0          2m53s
web-5c4d7f****-xltnr                     1/1     Running   0          2m53s
  1. 执行以下命令,查看在 /test 路径下的文件。
kubectl exec web-5c4d7f****-8f9qx ls /test

预期输出:

kubectl exec web-5c4d7f****-8f9qx ls /test

说明

路径 /test 下为空,没有文件。

  1. 执行以下命令,在/test路径下创建文件 nas
kubectl exec web-5c4d7f****-8f9qx touch /test/nas
  1. 执行以下命令,查看在/test路径下的文件。
kubectl exec web-5c4d7f****-8f9qx ls /test

预期输出:

nas
  1. 执行以下命令,在其他 Pod 上查看 /test 路径下的文件。
kubectl exec web-5c4d7f****-brvch ls /test

预期输出:

nas
6. 在任意一个 Pod 的 `/test` 下创建的文件,两个 Pod 下的 `/test` 路径下均存在此文件,说明两个 Pod 共享一个 NAS。

验证 NAS 存储持久化

  1. 执行以下命令,删除该应用的所有 Pod。
kubectl delete pod web-5c4d7f****-8f9qx web-5c4d7f****-brvch web-5c4d7f****-xltnr

预期输出:

pod "web-5c4d7f****-8f9qx" deleted
pod "web-5c4d7f****-brvch" deleted
pod "web-5c4d7f****-xltnr" deleted
  1. 执行以下命令,查看 Kubernetes 重建的 Pod 名称。
kubectl get pod

预期输出:

NAME                                     READY   STATUS    RESTARTS   AGE
web-5c4d7f****-8l78w                     1/1     Running   0          53s
web-5c4d7f****-r5282                     1/1     Running   0          53s
web-5c4d7f****-vbswz                     1/1     Running   0          53s

说明

可以看到 Pod 自动完成重建并且名称与原来不同。

  1. 执行以下命令,查看重新创建的 Pod/test 路径下的文件。
kubectl exec web-5c4d7f****-8l78w ls /test

预期输出:

nas
  1. 执行以下命令,查看另一个 Pod/test 路径下的文件。
kubectl exec web-5c4d7f****-vbswz ls /test

预期输出:

nas
  1. 创建的文件 nas 并没有被随着 Pod 的删除而删除,即 NAS 的数据可持久保存。