You need to enable JavaScript to run this app.
导航
使用 LVM 类型的本地存储动态存储卷
最近更新时间:2024.12.05 19:59:23首次发布时间:2024.08.26 16:34:39

容器服务支持通过 CSI 使用本地存储,本文为您介绍如何使用 LVM 类型的本地存储动态存储卷。

说明

邀测·申请试用】本地存储相关的 csi-local 组件存储感知调度 功能目前均处于邀测阶段,如需使用,请提交申请。

前提条件

  • 已经创建 Kubernetes 版本符合要求的容器集群,详细介绍参见:创建集群
  • 目前支持通过 kubectl 命令行使用,需确保本地已经将安装 kubectl 工具。详细操作参见:安装和设置 kubectl

使用限制

  • 确保使用极速型 SSD 数据盘挂载到容器、镜像存储目录 /var/lib/containerd/var/lib/kubelet避免使用本地盘挂载到容器、镜像存储目录,否则,将不适用本地存储使用场景。
  • 本场景依赖的 3 个组件的安装和卸载存在顺序要求,务必根据推荐的顺序进行安装或卸载,否则将影响正常调度功能
  • 确保容器集群的 Kubernetes 版本符合要求,支持 v1.24.15-vke.34 及以上版本的 1.24 集群、v1.26.10-vke.22 及以上版本的 1.26 集群、v1.28.3-vke.16 及以上版本的 1.28 集群。
  • 本地存储并非高可用存储卷,只适用于一些临时数据的保存及应用自带高可用的场景。
  • LVM 类型的本地存储卷,不支持数据的跨节点迁移,不适合在高可用场景中使用。
  • 需要为每个节点安装 lvm2,安装命令为:apt-get install lvm2

操作步骤

步骤一:安装和配置依赖组件

使用本地存储需要依赖 3 个组件,请参考以下顺序依次安装和配置。

警告

  • csi-local 组件依赖 snapshot-controller 组件,安装 csi-local 组件前确认 snapshot-controller 组件已安装。
  • csi-local 组件必须与 scheduler-plugin 组件中的存储感知调度功能结合使用,开启存储感知调度功能前,请确保 snapshot-controller 和 csi-local 组件均已安装,否则会影响正常调度。
  • 如需卸载 csi-local 组件,请关闭 scheduler-plugin 组件中的存储感知调度功能后再执行卸载操作,否则会影响正常调度。
  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击需要配置的目标集群。
  3. 在集群管理页面的左侧导航栏中,选择 组件管理
  4. 单击组件右上角的 ... > 安装,依次安装 snapshot-controllercsi-local 组件。

alt

  1. 单击 scheduler-plugin 组件右侧 配置 按钮,在配置弹窗中勾选存储感知调度配置项的 本地存储

alt

配置项说明

存储感知调度

目前支持本地存储,默认关闭,勾选即表示开启本地存储的存储感知调度功能,开启后可根据节点所具有的存储资源进行调度。

说明

需要安装相应存储 CSI 组件才可以生效,本场景已经安装 csi-local 组件。

步骤二:配置本地盘类型的节点池

创建挂载本地盘的节点池或使用已有节点池,并配置节点池相关信息。本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建节点池创建托管节点池

alt

alt

配置项说明

数据盘

容器、镜像存储目录
使用极速型 SSD 数据盘挂载到容器、镜像存储目录 /var/lib/containerd/var/lib/kubelet

警告

避免使用本地盘挂载到容器、镜像存储目录,否则,将不适用本地存储使用场景。

其他数据盘
本地数据盘支持 SSD 和 HDD 类型,可根据实际需求选择,不同实例规格支持的本地盘类型及其详细介绍参见:本地盘

节点标签自定义配置节点标签,后续初始化本地盘,组 VG 时用于筛选节点,例如:csi-local: "i2-2xlarge"

步骤三:初始化本地盘

初始化环节,需要根据实际需求组 VolumeGroup(VG),目前支持使用 CRD 自定义组 VolumeGroup(VG)。csi-local 组件安装成功后,将自动创建本地存储相关 CRD,根据实际需求创建 CR 即可。

alt

本场景以 ecs.i2.2xlarge 机型为例,存在一块 3.5T 的 SSD 盘 /dev/nvme0n1,并已经为该机型节点打上标签 csi-local: "i2-2xlarge"

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,单击 工作负载 > 对象浏览器
  5. 单击 NodeLocalStorageInitConfig 名称,前往 CRD 详情页。
  6. 单击 使用 Yaml 新建 ,在配置页面选择 自定义 类型并输入已经准备好的 Yaml,完成后单击 确定

alt

本场景使用的 Yaml 如下,实际使用场景可根据实际需求更新配置。

apiVersion: csi.volcengine.com/v1alpha1
kind: NodeLocalStorageInitConfig
metadata:
  name: csi-local
spec:
  globalConfig:        # 全局默认节点配置。
    listConfig:
      devices: {}
      mountPoints: {}
      vgs: {}
    resourceToBeInited: {}
    spdkConfig: {}
  nodesConfig:         # 按 Label 筛选的节点池级别配置。
    - selector:        # 筛选规则。
        matchLabels:
          csi-local: "i2-2xlarge"     # 筛选节点的 Lable。
      listConfig:                     # 可被 csi-local 分配的存储设备列表。
        mountPoints: {}
        vgs:                    # LVM(共享盘)黑白名单,此处的共享盘名称指 VolumeGroup 名称。
          include:
            - csi-local-pool-[0-9]+
      resourceToBeInited:      # 设备初始化列表。
        vgs:                   # LVM(共享盘)初始化。
          - devices:           # 将块设备 /dev/nvme0n1 初始化为名为 csi-local-pool-0 的 VolumeGroup。注意:若当节点上包含同名 VG,则 csi-local 不做操作。
              - /dev/nvme0n1
            name: csi-local-pool-0
      spdkConfig: {}
  1. 等待 1 分钟左右,参考如下命令查看对应节点的 nls CR,能够查询到 VG 信息表示初始化成功。
❯ kubectl get nls 192.168.2.6 -oyaml

apiVersion: csi.volcengine.com/v1alpha1
kind: NodeLocalStorage
metadata:
  creationTimestamp: "2024-07-17T08:52:03Z"
  generation: 1
  name: 192.168.2.6
  resourceVersion: "30819"
  uid: 129012df-d9b2-41f1-bb5f-0d86fc15baf3
spec:
  listConfig:
    devices:
      include:
      - /dev/vdc
    mountPoints: {}
    vgs:
      include:
      - csi-local-pool-[0-9]+
  nodeName: 192.168.2.6
  resourceToBeInited:
    vgs:
    - devices:
      - /dev/nvme0n1
      name: csi-local-pool-0
  spdkConfig: {}
status:
  filteredStorageInfo:
    updateStatusInfo:
      lastUpdateTime: "2024-07-17T09:51:24Z"
      updateStatus: accepted
    volumeGroups:
    - csi-local-pool-0
  nodeStorageInfo:
    volumeGroups:                      # VolumeGroup 初始化成功,可查看 VG 相关信息。
    - allocatable: 3840753532928
      available: 3840753532928
      condition: DiskReady
      name: csi-local-pool-0
      physicalVolumes:
      - /dev/nvme0n1
      total: 3840753532928

步骤四:创建本地存储动态存储卷

目前支持动态制备方式使用本地存储,系统已经预置存储类,根据实际需求选用即可。

预置存储类说明
csi-local-device-hddHDD 独立盘预置的存储类,文件存储类型为 ext4。
csi-local-device-ssdSSD 独立盘预置的存储类,文件存储类型为 ext4。
csi-local-lvmLVM 共享盘预置的存储类,文件存储类型为 ext4。
csi-local-lvm-xfsLVM 共享盘预置的存储类,文件存储类型为 xfs。
  1. 创建 PVC 的 YAML 文件。示例文件csi-local-pvc.yaml代码如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-local-pvc        # PVC 名称。
spec:
  accessModes:               # 访问模式,ReadWriteOnce 表示单点读写。
  - ReadWriteOnce    
  resources:
    requests:
      storage: 20Gi                   # 声明应用存储使用量,可修改 PVC 中的 storage 进行扩容。
  storageClassName: csi-local-lvm     # 预置的存储类名称,可根据实际需求选择。
  1. 执行以下命令,创建 PVC。
    kubectl create -f csi-local-pvc.yaml
    
  2. 执行以下命令,查看 PVC 声明的动态卷是否创建成功。
    kubectl get pvc
    
    预期输出结果如下:
    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   
    csi-local-pvc    Pending  pvc-6e8c646b-e3e9-4d02-836e-3b66********   20Gi       RWX            csi-local-lvm      
    

步骤五:使用本地存储动态存储卷

本场景以创建 Pod 为例,介绍如何使用 LVM 类型的本地存储动态存储卷。

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 选择 工作负载 > 容器组
  4. 单击 使用 YAML 创建,在配置页面选择 Pod 类型并输入已经准备好的 Yaml,完成后单击 确定

Yaml 示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: csi-local-pod
spec:
  containers:
    - name: csi-local-pod
      image: nginx:latest
      command:
        - "/bin/bash"
        - "-c"
        - set -euo pipefail; while true; do echo $(hostname) $(date) >> /var/lib/www/$(hostname); sleep 1; done
      volumeMounts:
        - mountPath: /var/lib/www
          name: webroot
  volumes:
    - name: webroot
      persistentVolumeClaim:
        claimName: csi-local-pvc     # 已经创建的 PVC 名称。

后续操作

  • Pod 运行成功后,可前往节点上运行 lsblk、lvs,显示 lv 已被创建并被挂载。
root@iv-yda1sl1tdscva4fdr6uj:~# lsblk
NAME                                   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda                                    254:0    0   40G  0 disk 
├─vda1                                 254:1    0  190M  0 part /boot/efi
└─vda2                                 254:2    0 39.8G  0 part /
vdb                                    254:16   0  100G  0 disk /mnt/vdb
nvme0n1                                259:0    0  3.5T  0 disk 
└─csi--local--pool--0-local--98219686--4575--4a7f--9103--4eed93369454
                                       253:0    0    5G  0 lvm  /mnt/vdb/kubelet/pods/40a9e082-d84f-4395-a563-0c108261c81e/volumes/kubernetes.io~csi/local-98219686-4575-4a7f-9103-4eed93369454/mount

root@iv-yda1sl1tdscva4fdr6uj:~# lvs
  LV                                         VG               Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  local-98219686-4575-4a7f-9103-4eed93369454 csi-local-pool-0 -wi-ao---- 5.00g
  • 删除 Pod 触发 Pod 重建后,可执行 exec 命令进入新建 Pod,查看旧 Pod 中的数据是否依然存在。
❯ kubectl exec -it csi-local-pod cat //var/lib/www/csi-local-pod
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
csi-local-pod Thu Jul 18 03:31:25 UTC 2024
csi-local-pod Thu Jul 18 03:31:26 UTC 2024
csi-local-pod Thu Jul 18 03:31:27 UTC 2024
csi-local-pod Thu Jul 18 03:31:28 UTC 2024
csi-local-pod Thu Jul 18 03:31:29 UTC 2024
csi-local-pod Thu Jul 18 03:31:30 UTC 2024
csi-local-pod Thu Jul 18 03:31:31 UTC 2024
csi-local-pod Thu Jul 18 03:31:32 UTC 2024
csi-local-pod Thu Jul 18 03:31:33 UTC 2024
csi-local-pod Thu Jul 18 03:31:34 UTC 2024
csi-local-pod Thu Jul 18 03:31:35 UTC 2024
csi-local-pod Thu Jul 18 03:31:36 UTC 2024
  • 删除 Pod 并删除 PVC、lsblk、lvs,执行以下命令,确认底层 LV 被回收。
❯ kubectl delete -f lvm-pod.yaml
pod "csi-local-pod" deleted
❯ kubectl delete -f lvm-pvc.yaml
persistentvolumeclaim "csi-local-pvc" deleted

root@iv-yda1sl1tdscva4fdr6uj:~# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda     254:0    0   40G  0 disk 
├─vda1  254:1    0  190M  0 part /boot/efi
└─vda2  254:2    0 39.8G  0 part /
vdb     254:16   0  100G  0 disk /mnt/vdb
nvme0n1 259:0    0  3.5T  0 disk 
root@iv-yda1sl1tdscva4fdr6uj:~# lvs
root@iv-yda1sl1tdscva4fdr6uj:~#