You need to enable JavaScript to run this app.
导航
使用 vePFS 文件存储静态存储卷
最近更新时间:2024.10.31 10:52:28首次发布时间:2023.12.26 11:50:33

容器服务支持通过 CSI 使用 vePFS 文件存储,本文为您介绍如何创建 vePFS 文件存储类型的存储卷和存储卷声明,以及工作负载如何使用 vePFS 文件存储静态存储卷。

说明

邀测·申请试用使用 vePFS 文件存储静态存储卷功能智算版规格 目前均处于邀测阶段,如需使用,请提交申请。

前提条件

使用限制

使用 vePFS 文件存储时,需要注意以下部署兼容性、组件卸载、服务挂载、运行性能相关限制或影响。

部署兼容性相关限制

  • 一个 vePFS 挂载服务不能同时用于 vePFS CSI 方案和主机预挂载 vePFS 方案。对一个 vePFS 文件系统实例,如果用户已经使用 VKE 节点预挂载 vePFS 并通过 hostpath 供给 Pod 的方式,需要额外创建一个 vePFS 挂载服务,将新的 vePFS 挂载服务配置给 vePFS CSI 使用。
  • 当前通过 CSI 使用 vePFS 文件存储的方案与原有 VKE 接入使用 vePFS 方案不能同时使用。因此,建议创建新集群使用 CSI 方案,若存量资源需要迁移最新 CSI 方案,请 提交工单 获取技术支持。
  • vePFS CSI controller 会被优先调度到拥有标签vepfs.csi.volcengine.com/controller=preferred的节点,如果计划对 VKE 集群节点池进行频繁扩缩容,建议 CSI controller 优先调度到常驻节点(不受扩缩容影响),以保证 vePFS CSI 可以快速及时地处理 VKE 集群和 vePFS 集群的成员一致性。否则,运行 vePFS CSI controller 的节点被缩容删除时,vePFS CSI controller 可能无法维持 VKE 和 vePFS 集群间的成员一致性,导致 vePFS CSI 后续的操作缓慢。
  • 已经以 VPC 网络加入到 vePFS 集群中的节点将无法使用 RDMA 网络。如果要切换成 RDMA 网络,请将 VKE 节点从 vePFS 文件系统集群中删除。

组件卸载相关限制

  • 若 csi-vepfs 组件被卸载,正在运行的 Pod 仍可继续访问 vePFS 存储至运行结束;但若 csi-vepfs 已经被卸载,删除 Pod 将会阻塞住,重新安装 csi-vepfs 后可继续删除 Pod。因此,不建议在 Pod 运行的时卸载 csi-vepfs 组件。
  • csi-vepfs 使文件系统客户端运行在专用容器中,vePFS 客户端将占用容器 Kubernetes 节点的计算资源(默认占用 4 CPU 和 4 GiB 内存),若节点资源紧张,csi-vepfs 客户端容器将无法启动成功,Pod 也将阻塞在创建阶段无法启动。
  • 提前删除 vePFS 挂载服务,将导致 vePFS CSI 组件无法卸载。
  • vePFS CSI 组件删除后,部分资源无法确认能否被删除,可能构成资源残留。
    • vePFS mount service secret:创建 vePFS PV 时,VKE 将一起创建一个 Secret,其中保存了 vePFS 挂载服务三个管理节点的地址和登录秘钥,可通过以下命令查询 VKE 集群中存在的上述 Secret。
    kubectl get -n kube-system secrets | grep "^vepfs-secret-mount-[0-9a-z]*"
    
    • VKE 节点上的安全组:为了保证 VKE 节点能够与 vePFS 文件系统集群互通,vePFS CSI 会同时将管理服务 ECS 的安全组添加到 VKE 节点的安全组列表中。但 CSI 卸载的过程中无法确定该安全组是否仍被用户使用,所以无法将它从 VKE 节点中解绑,用户可以通过 ECS 控制台,在安全组选项中查看或删除与 vePFS 挂载服务 所属 ECS 节点中相同的安全组。

服务挂载相关限制

  • 单个 vePFS 实例支持绑定多个挂载服务;单个挂载服务也支持绑定到多个 vePFS 实例。
  • 单个 ECS 只能加入一个 vePFS 挂载服务(相当于客户端集群),一个挂载服务可以绑定多个文件系统存储实例。
  • 一个节点仅支持绑定一个挂载服务,因此,推荐一个 VKE 集群绑定一个 vePFS 挂载服务。
  • vePFS 暂不支持使用 veLinux CentOS 兼容版镜像。

运行性能相关限制

  • 第一次在节点上启动使用 vePFS 的容器相比后续启动速度慢 15 秒左右。因为vePFS CSI 需要在节点上为 vePFS 编译内核驱动,编译过程引入了更多的耗时,但是这个耗时仅仅发生在第一次创建使用 vePFS 卷的容器的过程中。

操作步骤

可根据实际情况选择控制台或 kubectl 命令行方式使用 vePFS 文件存储静态存储卷。

方式一:通过控制台使用

已经登录 容器服务控制台 的情况下,可直接通过控制台使用 vePFS 文件存储静态存储卷。

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

  1. 单击目标集群名称,在集群管理页面选择 存储管理 > 存储卷
  2. 在存储卷管理页面,单击 创建存储卷
  3. 在弹出的存储卷创建页面,配置 vePFS 文件存储类型存储卷相关参数,完成后单击 确定

alt

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

规格

选择创建存储卷使用的文件系统规格,目前支持:100 MB/s/TiB、性能版,更多详细介绍参见:vePFS 产品规格

说明

邀测·申请试用】智算版规格目前处于邀测阶段,如需使用,请提交申请。

项目

按需选择创建存储卷的项目,默认为:default 项目。
项目管理是火山引擎提供的一种资源管理方式,可以对不同业务或项目使用的云资源进行分组管理。更多详细介绍参见:项目管理

文件系统根据实际需求,依次选择已经创建的 vePFS 文件系统、挂载服务、安全组,以及配置挂载服务的高级配置。

挂载服务:按需选择文件系统绑定的挂载服务。

注意

  • 仅支持选择 running 状态的挂载服务,仅支持 与集群同 VPC 的挂载服务。

  • vePFS 挂载服务将占用挂载节点实际 2 GiB 资源,请注意集群资源规划。

高级配置:配置挂载服务相关高级配置,可展示和配置以下参数

  • 预留内存:vePFS 挂载服务的预留内存,将占用挂载节点实际 2 GiB 资源,不支持修改。

  • 访问密钥:默认生成的 secret,该秘钥已经保存 vePFS 客户端节点访问的初始密码,如已修改,请更新对应节点密码。

注意

若密码不正确将导致 vePFS 无法挂载,请务必确保密码准确无误。

安全组:按需选择挂载服务客户端安全组
该安全组将通过跨服务授权自动加入到用户节点主网卡,从而实现用户节点加入挂载服务集群的目的,使用户集群与 vePFS Server 连通。

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

  1. 单击目标集群名称,在集群管理页面选择 存储管理 > 存储卷声明
  2. 在存储卷管理页面,单击 创建存储卷声明
  3. 在弹出的存储卷声明创建页面,配置 vePFS 文件存储类型存储卷声明相关参数,完成后单击 确定

alt

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

规格

选择创建存储卷使用的文件系统规格,目前支持:100 MB/s/TiB、性能版,更多详细介绍参见:vePFS 产品规格

说明

邀测·申请试用】智算版规格目前处于邀测阶段,如需使用,请提交申请。

创建方式存储卷声明的创建方式包括:基于存储类创建、使用已有存储卷。本场景选择 使用已有存储卷
存储卷指定 vePFS 文件存储类型的存储卷进行关联挂载,本场景选择步骤一中创建的存储卷。

步骤三:工作负载添加卷

vePFS 文件存储类型的静态存储卷创建完成后,可通过添加卷的方式挂载到工作负载使用,包括:无状态负载、有状态负载、任务、定时任务、守护进程。

可通过创建工作负载或更新工作负载操作的容器配置步骤,为工作负载添加卷并挂载卷。详细操作参见:工作负载

alt

方式二:通过 kubectl 命令行使用

已经 连接集群 的情况下,可通过 kubectl 命令行使用 vePFS 文件存储静态存储卷。

步骤一:连接鉴权

依次执行以下命令,将 vepfs 管理节点的 ssh 连接鉴权信息写在 secret 中。

说明

以下示例中的 address、password、hostname 仅做演示,请根据实际场景替换为真实配置。

echo -n '[
    {
        "address":"10.244.0.1",
        "password":"sshpassword",
        "hostname":"i-host1"
    },
    {
        "address":"10.244.0.2",
        "password":"sshpassword",
        "hostname":"i-host2"
    },
    {
        "address":"10.244.0.3",
        "password":"sshpassword",
        "hostname":"i-host3"
    }
]' > /tmp/vepfs-hots.json


kubectl create secret generic vepfs-secret --namespace kube-system --from-file=vepfsHosts=/tmp/vepfs-hots.json

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

  1. 创建 PV 的 YAML 文件,示例文件vke-vepfs-static-pv.yaml。支持挂载整个文件系统或文件系统子目录,可根据实际情况按需选择。
  • 挂载整个 vePFS 文件系统的 Yaml 示例如下:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: vepfs-static-pv           # PV 名称,建议 PV name 集群内唯一。
  namespace: default
  annotations:
    pv.kubernetes.io/provisioned-by: vepfs.csi.volcengine.com
spec:
  volumeMode: Filesystem
  accessModes:             # 访问方式,ReadWriteMany:多点读写。
    - ReadWriteMany
  capacity:
    storage: 20Gi          # 声明的存储容量,Kubernetes 必填字段,但对 vePFS 没有意义,仅作为校验参数必填。
  persistentVolumeReclaimPolicy: Retain   # PV 回收策略。Retain 表示保留策略,Delete 表示删除策略。
  csi:
    driver: vepfs.csi.volcengine.com      # 驱动类型,本示例为 vepfs.csi.volcengine.com ,表示火山引擎 csi-vepfs 插件。
    readOnly: false
    nodeStageSecretRef:                        # Secret 对应的不同 vepfs 挂载服务。
      name: vepfs-secret
      namespace: kube-system
    controllerPublishSecretRef:
      name: vepfs-secret
      namespace: kube-system
    volumeAttributes:
      fsid: vepfs-cnbjexxxxac6e7b3                # 文件系统的 ID。
      hpcClusterID: vepfs-cluster-id-xxx          # HPC 集群 ID,仅 fsid 使用智算版时需要绑定 HPC 集群。
      mountServiceID: mount-ff0b****              # 挂载服务。
      securityGroupID: msadgh-14332               # vePFS 挂载点客户端安全组。
      # pass resource request and limit value
      # memoryRequest: 4Gi
      # memoryLimit:
      mountpoint: /vepfs-cnglxxxxx279f1b7          # 挂载点。
    volumeHandle: vepfs-cnbjexxxxac6e7b3           # PV 的唯一标识符,要求与 fsid 保持一致。
  • 挂载 vePFS 文件系统子目录的 Yaml 示例如下:

注意

  • 目前,仅通过 Yaml 静态创建 vePFS 类型 PV 时,支持挂载 vePFS 文件系统子目录(subpath)。
  • 创建 PV 时必须使用已经创建的 vePFS 文件系统子目录,否则,创建 Pod 过程将无法挂载 volume。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: vepfs-static-pv           # PV 名称,建议 PV name 集群内唯一。
  namespace: default
  annotations:
    pv.kubernetes.io/provisioned-by: vepfs.csi.volcengine.com
spec:
  volumeMode: Filesystem
  accessModes:             # 访问方式,ReadWriteMany:多点读写。
    - ReadWriteMany
  capacity:
    storage: 20Gi          # 声明的存储容量,Kubernetes 必填字段,但对 vePFS 没有意义,仅作为校验参数必填。
  persistentVolumeReclaimPolicy: Retain   # PV 回收策略。Retain 表示保留策略,Delete 表示删除策略。
  csi:
    driver: vepfs.csi.volcengine.com      # 驱动类型,本示例为 vepfs.csi.volcengine.com ,表示火山引擎 csi-vepfs 插件。
    readOnly: false
    nodeStageSecretRef:                        # Secret 对应的不同 vepfs 挂载服务。
      name: vepfs-secret
      namespace: kube-system
    controllerPublishSecretRef:
      name: vepfs-secret
      namespace: kube-system
    volumeAttributes:
      fsid: vepfs-cnbjexxxxac6e7b3                # 文件系统的 ID。
      hpcClusterID: vepfs-cluster-id-xxx          # HPC 集群 ID,仅 fsid 使用智算版时需要绑定 HPC 集群。
      mountServiceID: mount-ff0b****              # 挂载服务。
      securityGroupID: msadgh-14332               # vePFS 挂载点客户端安全组。
      # pass resource request and limit value
      # memoryRequest: 4Gi
      # memoryLimit:
      mountpoint: /vepfs-cnglxxxxx279f1b7          # 挂载点。
      subpath: /l1.dir1/l2.dir1                    # 挂载文件系统的子目录,务必使用已经创建的 vePFS 文件系统子目录。
    volumeHandle: /l1.dir1/l2.dir1@vepfs-cnbjexxxxac6e7b3  # PV 的唯一标识符,按照格式 ${subpath}@${fsid} 定义,不同 PV 的 volumeHandle 不能相同。
  1. 执行以下命令,创建 PV。
kubectl create -f vke-vepfs-static-pv.yaml

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

  1. 创建 PVC 的 YAML 文件。示例文件vke-vepfs-static-pvc.yaml代码如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: vepfs-static-pvc        # PVC 名称。
  namespace: default            # PVC 所属的命名空间。
spec:
  accessModes:                  # PVC 访问方式。目前仅支持 ReadWriteMany ,表示多点读写。
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi             # 声明的存储容量,Kubernetes 必填字段,但对 vePFS 没有意义,仅作为校验参数必填。
  volumeName: vepfs-static-pv   # 绑定到该 PVC 的 PV 名称。
  1. 执行以下命令,创建 PVC。
kubectl create -f vke-vepfs-static-pvc.yaml
  1. 执行以下命令,查看 PVC 与 PV 的静态绑定结果。
kubectl get pvc

预期输出结果如下,表示 PVC 与 PV 静态绑定成功。

NAME                   STATUS   VOLUME                 CAPACITY   ACCESS MODES   STORAGECLASS   AGE
vke-vepfs-static-pvc   Bound    vke-vepfs-static-pv    10Pi       RWX                           2m36s

步骤四:创建 Deployment

  1. 创建 Deployment 的 YAML 文件。示例文件deployment-nginx-static.yaml代码如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nginx-static
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx-c1
            image: cr-cn-beijing.volces.com/****/vci-demo-nginx:latest    # 指定需要部署的镜像文件。
            ports:
            - containerPort: 80
              name: nginx
            volumeMounts:
            - name: vepfs
              mountPath: /mnt/vepfs                # vePFS 在容器中挂载的位置。
          volumes:
            - name: vepfs
              persistentVolumeClaim:
                claimName: vepfs-static-pvc        # 步骤二中创建的 PVC 名称。
    
  2. 执行以下命令创建 Deployment。

kubectl apply -f deployment-nginx-static.yaml

注意

创建工作负载过程中,会优先在节点上启动一个用于挂载 vePFS 客户端的专用容器,vePFS 客户端将占用容器 Kubernetes 节点的计算资源(默认占用 4 CPU 和 4 GiB 内存),若节点资源紧张,csi-vepfs 客户端容器将无法启动成功,Pod 也将阻塞在创建阶段无法启动。

相关文档