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

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

说明

邀测·申请试用】本地存储相关的 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 集群。
  • 本地存储并非高可用存储卷,只适用于一些临时数据的保存及应用自带高可用的场景。

操作步骤

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

使用本地存储需要依赖 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 类型,可根据实际需求选择,不同实例规格支持的本地盘类型及其详细介绍参见:本地盘

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

步骤三:初始化本地盘

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

alt

本场景以 ecs.i2.2xlarge 机型为例,已经挂载 EBS 云盘到 /dev/vdc,并已经为该机型节点打上标签 csi-local: "i2-2xlarge"

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

本场景使用的 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 分配的存储设备列表。
        devices:
          include:                   # include 正则。
            - /dev/vdc               # 可被分配用于独占的盘。
        mountPoints: {}
      spdkConfig: {}
  1. 等待 1 分钟左右,参考如下命令查看对应节点的 nls CR,能够查询到独立盘信息表示初始化成功。
❯ 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:
    deviceInfo:                     # 初始化成功后,可查看划分的独立盘。
    - condition: DiskReady
      mediaType: ssd
      name: /dev/nvme0n1
      readOnly: false
      total: 3840755982336
    - condition: DiskReady
      mediaType: hdd
      name: /dev/vda1
      readOnly: false
      total: 199229440
    phase: Running
    state:
      lastHeartbeatTime: "2024-07-17T09:51:24Z"
      status: "True"
      type: DiskReady

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

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

预置存储类说明
csi-local-device-hddHDD 独立盘预置的存储类,文件存储类型为 ext4。
csi-local-device-ssdSSD 独立盘预置的存储类,文件存储类型为 ext4。
csi-local-lvmLVM 共享盘预置的存储类,文件存储类型为 ext4。
csi-local-lvm-xfsLVM 共享盘预置的存储类,文件存储类型为 xfs。

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

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

Yaml 示例如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-device
spec:
  selector:
    matchLabels:
      app: nginx-device
  podManagementPolicy: Parallel
  serviceName: "nginx-device"
  replicas: 1
  volumeClaimTemplates:
  - metadata:
      name: html
    spec:
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-local-device-hdd     # 预置的存储类名称,可根据实际需求选择。
      resources:
        requests:
          storage: 5Gi
  template:
    metadata:
      labels:
        app: nginx-device
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: "/data"
          name: html
        command:
        - sh
        - "-c"
        - |
            while true; do
              echo $(hostname) $(date) >> /data/test.txt;
              sleep 10s
            done;

后续操作

  • 删除 Pod 触发 Pod 重建后,可执行 exec 命令进入新建 Pod,查看旧 Pod 中的数据是否依然存在。
❯ kubectl delete pod nginx-device-0
pod "nginx-device-0" deleted

❯ kubectl exec -it nginx-device-0 cat /data/test.txt
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
nginx-device-0 Thu Jul 18 06:34:51 UTC 2024
nginx-device-0 Thu Jul 18 06:35:01 UTC 2024
nginx-device-0 Thu Jul 18 06:35:11 UTC 2024
nginx-device-0 Thu Jul 18 06:35:21 UTC 2024
nginx-device-0 Thu Jul 18 06:35:31 UTC 2024
nginx-device-0 Thu Jul 18 06:35:41 UTC 2024
nginx-device-0 Thu Jul 18 06:35:51 UTC 2024
nginx-device-0 Thu Jul 18 06:36:01 UTC 2024
nginx-device-0 Thu Jul 18 06:36:11 UTC 2024
  • 删除 StatefulSet 并删除 PVC,此时,独占盘 vdc 将被回收并格式化,文件系统将被擦除。
root@iv-yda1sl1tdscva4fdr6uj:~# mount /dev/vdc /tmp2
mount: /tmp2: wrong fs type, bad option, bad superblock on /dev/vdc, missing codepage or helper program, or other error.