容器服务支持通过 CSI 使用本地存储,本文为您介绍如何使用独占盘类型的本地存储动态存储卷。
说明
【邀测·申请试用】本地存储相关的 csi-local 组件 和 存储感知调度 功能目前均处于邀测阶段,如需使用,请提交申请。
/var/lib/containerd
和 /var/lib/kubelet
。避免使用本地盘挂载到容器、镜像存储目录,否则,将不适用本地存储使用场景。v1.24.15-vke.34
及以上版本的 1.24 集群、v1.26.10-vke.22
及以上版本的 1.26 集群、v1.28.3-vke.16
及以上版本的 1.28 集群。使用本地存储需要依赖 3 个组件,请参考以下顺序依次安装和配置。
警告
snapshot-controller
和 csi-local
组件。scheduler-plugin
组件右侧 配置 按钮,在配置弹窗中勾选存储感知调度配置项的 本地存储。配置项 | 说明 |
---|---|
存储感知调度 | 目前支持本地存储,默认关闭,勾选即表示开启本地存储的存储感知调度功能,开启后可根据节点所具有的存储资源进行调度。 说明 需要安装相应存储 CSI 组件才可以生效,本场景已经安装 |
创建挂载本地盘的节点池或使用已有节点池,并配置节点池相关信息。本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建节点池、创建托管节点池。
配置项 | 说明 |
---|---|
数据盘 | 容器、镜像存储目录 警告 避免使用本地盘挂载到容器、镜像存储目录,否则,将不适用本地存储使用场景。 |
其他数据盘 | |
节点标签 | 自定义配置节点标签,后续初始化本地盘,划分独立盘时用于筛选节点,例如:csi-local: "i2-2xlarge" 。 |
初始化环节,需要根据实际需求划分独立盘,目前支持使用 CRD 自定义划分独立盘。csi-local 组件安装成功后,将自动创建本地存储相关 CRD,根据实际需求创建 CR 即可。
本场景以 ecs.i2.2xlarge 机型为例,已经挂载 EBS 云盘到 /dev/vdc
,并已经为该机型节点打上标签 csi-local: "i2-2xlarge"
。
本场景使用的 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: {}
❯ 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-hdd | HDD 独立盘预置的存储类,文件存储类型为 ext4。 |
csi-local-device-ssd | SSD 独立盘预置的存储类,文件存储类型为 ext4。 |
csi-local-lvm | LVM 共享盘预置的存储类,文件存储类型为 ext4。 |
csi-local-lvm-xfs | LVM 共享盘预置的存储类,文件存储类型为 xfs。 |
本场景以创建 StatefulSet Pod 为例,介绍如何使用独占盘类型的本地存储动态存储卷。
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;
❯ 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
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.