TopoLVM介绍及实践
LVM在Kubernetes下的最佳实践方案–TopoLVM。
1. 简介
TopoLVM 是一种基于 LVM(Logical Volume Manager)的 CSI(Container Storage Interface)插件,专为 Kubernetes 环境设计,旨在提供拓扑感知的逻辑卷管理。它允许用户在特定节点上创建逻辑卷,并利用 LVM 的灵活性和高效性来管理 Kubernetes 集群中的存储资源。
TopoLVM 的主要特点包括:
-
拓扑感知: 支持在特定节点上创建逻辑卷,可以避免跨节点的数据移动,提升性能。
-
动态卷管理: 支持动态卷创建、删除和调整大小。
-
存储资源优化: 使用 LVM 的特性,可以实现对物理存储资源的更细粒度的管理和优化。
-
按需申请:以 PVC+StorageClass 的模式来提供服务,做到 PV 动态创建。而要实现这点,容量感知是关键,因为若调度到空间不足的节点上很明显是不合理的。最好能结合 PVC 申请的容量+Node 上的剩余容量,综合选择最优的节点来做绑定。
符合的 CSI 版本:1.5.0 。支持的平台有:
-
Kubernetes版本:1.28,1.29,1.30
-
节点系统:使用LVM2(*1)的linux系统,特别是在ubuntu上进行了测试。
-
CPU架构: x86(*2), arm64(*3), ppc64le(*3), s390x(*4)
-
文件系统:ext4, xfs, btrfs测试版(*5)
-
lvm版本:2.02.163 或更高(增加了 JSON 输出支持)
标记说明:
*1 如果你使用官方的 Docker 镜像并使用 xfs 文件系统,主机的 Linux 内核必须是 v4.9 或更高版本,支持 rmapbt 和 reflink。
*2 一级支持。官方提供 Docker 镜像,并通过 CI 测试了所有功能。
*3 二级支持。官方提供 Docker 镜像,但未通过 CI 测试。
*4 三级支持。没有提供 Docker 镜像,也没有通过 CI 测试,但构建了二进制文件。
*5 截至 v0.31.0,btrfs 仍处于测试阶段。可以在生产环境中使用,但我们的用户还没有广泛使用它。
Docker 镜像可以在 ghcr.io 上获取。
2. 架构
TopoLVM 基于 CSI,因此其架构遵循 Kubernetes CSI 开发者文档中描述的架构。
TopoLVM 组件包括:
- topolvm-controller:CSI 控制器服务。
- topolvm-scheduler:TopoLVM 的调度器扩展程序。
- topolvm-node:CSI 节点服务。
- lvmd:用于管理 LVM 卷的 gRPC 服务。
3. 前提条件
TopoLVM 运行的所有节点上都必须创建一个卷组。Helm Chart 中定义的默认卷组名称是 myvg1
。在要使用TopoLVM的Kubernetes集群的所有节点中创建名为myvg1
的VG。
# 我这里以新添加的sdb创建一个名为myvg1的VG
root@master1:~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
root@master1:~# vgcreate myvg1 /dev/sdb
Volume group "myvg1" successfully created
root@master1:~# vgs
VG #PV #LV #SN Attr VSize VFree
myvg1 1 0 0 wz--n- <30.00g <30.00g
ubuntu-vg 1 1 0 wz--n- <38.00g 0
3. 安装
官方提供了一个 Helm Chart 用于在 Kubernetes 上安装 TopoLVM。该 Chart 依赖于 cert-manager,如果你没有安装 cert-manager,你可以使用 Helm Chart 安装它。本文实践使用helm chart在Kubernetes上安装TopoLVM。
- 添加helm仓库
helm repo add topolvm https://topolvm.github.io/topolvm
helm repo update
- 创建配置命名空间
TopoLVM使用webhooks,为了是webhooks正常工作,在目标namespace创建label。推荐使用专用的命名空间
kubectl create ns topolvm-system
kubectl label namespace topolvm-system topolvm.io/webhook=ignore
kubectl label namespace kube-system topolvm.io/webhook=ignore
说明
此处设置标签 topolvm.io/webhook=ignore 是为了防止在 topolvm-system 和 kube-system 命名空间中创建 Pod 和 PVC 时触发 TopoLVM 的变更 Webhook。这些 Webhook 依赖于 topolvm-controller。因此,为避免在 TopoLVM 启动过程中导致其卡住,Webhooks 不应在启动过程中被激活。
- 安装chart
以名字topolvm
作为release name
安装:
helm install --namespace=topolvm-system topolvm topolvm/topolvm
如果同cert-manager一起安装,使用下面的命令:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${VERSION}/cert-manager.crds.yaml
helm install --namespace=topolvm-system topolvm topolvm/topolvm --set cert-manager.enabled=true
helm install --namespace=topolvm-system topolvm topolvm/topolvm
说明:
如果同cert-manager一起安装,确保先安装cert-manager然后安装topolvm。
- 检查安装
# 检查相关pod
root@master1:~# kubectl get pod -n topolvm-system
NAME READY STATUS RESTARTS AGE
topolvm-controller-5486c49d49-wk2bx 5/5 Running 0 2m9s
topolvm-controller-5486c49d49-x8rc2 5/5 Running 0 2m9s
topolvm-lvmd-0-5lb24 1/1 Running 0 2m9s
topolvm-lvmd-0-6vbpd 1/1 Running 0 2m9s
topolvm-lvmd-0-7bp6s 1/1 Running 0 2m10s
topolvm-lvmd-0-hjfsk 1/1 Running 0 2m9s
topolvm-node-p88vh 3/3 Running 1 (60s ago) 2m9s
topolvm-node-qkqw9 3/3 Running 1 (87s ago) 2m10s
topolvm-node-whgdt 3/3 Running 0 2m9s
topolvm-node-xngft 3/3 Running 0 2m9s
# 检查sc
root@master1:~# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
topolvm-provisioner topolvm.io Delete WaitForFirstConsumer true 3m19s
如果vg是自定义的,可以修改chart参数:
root@master1:~/topolvm# helm pull topolvm/topolvm --untar
root@master1:~/topolvm# ls
topolvm
root@master1:~/topolvm# vi topolvm/
CHANGELOG.md Chart.lock charts/ Chart.yaml .helmignore README.md README.md.gotmpl templates/ values.yaml
root@master1:~/topolvm# vi topolvm/values.yaml
...
# lvmd service
lvmd:
# lvmd.managed -- If true, set up lvmd service with DaemonSet.
managed: true
# lvmd.socketName -- Specify socketName.
socketName: /run/topolvm/lvmd.sock
# lvmd.deviceClasses -- Specify the device-class settings.
deviceClasses:
- name: ssd
volume-group: myvg1 # vg名字
default: true
spare-gb: 10 # 确保vg可用空间大于10G,也可以自定义修改
root@master1:~/topolvm# helm install --namespace=topolvm-system topolvm .
4. 业务使用topolvm创建的pv
安装TopoLVM后即可以创建PersistentVolumes (PV) ,默认创建了名为 topolvm-provisioner
的StorageClass。
创建一个pod和pvc,pod挂载pv到容器中的/data目录:
kubectl apply -f - <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: topolvm-provisioner
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: pause
image: registry.k8s.io/pause
volumeMounts:
- mountPath: /data
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: my-pvc
EOF
查看资源创建情况:
root@master1:~# kubectl get pod
my-pod 1/1 Running 0 24m
root@master1:~# kubectl get pvc
my-pvc Bound pvc-0c374084-f93a-46ec-b409-0104ad68df96 1Gi RWO topolvm-provisioner 30m
root@master1:~# kubectl get pv | grep pvc-0c374084-f93a-46ec-b409-0104ad68df96
pvc-0c374084-f93a-46ec-b409-0104ad68df96 1Gi RWO Delete Bound default/my-pvc topolvm-provisioner 18m
成功创建pvc和pod,且pv成功挂载到pod中。
5. 参考资料
-
官方仓库:https://github.com/topolvm/topolvm
-
快速实践:https://github.com/topolvm/topolvm/blob/main/docs/getting-started.md