Longhorn v1 Data Engine 使用实践

Longhorn 是一款专为 Kubernetes 设计的云原生分布式存储系统,提供简单易用、高可靠性的持久化存储能力。

本文基于 Longhorn v1 Data Engine 进行实践。


环境信息

  • Longhorn:v1.12.1
  • Kubernetes:RKE2 v1.35.8+rke2r1
  • 集群规模:3 个节点
  • 节点规格:每个节点 4c8g

安装前准备

所有节点安装依赖项:

1
2
3
4
apt-get update
apt-get install -y open-iscsi nfs-common cryptsetup dmsetup
systemctl enable iscsid --now
modprobe iscsi_tcp

安装 longhornctl

1
2
3
4
5
6
LonghornVersion=v1.12.1
OS=linux
ARCH=amd64
curl -L https://github.com/longhorn/cli/releases/download/${LonghornVersion}/longhornctl-${OS}-${ARCH} -o longhornctl
chmod +x longhornctl
mv ./longhornctl /usr/local/bin/longhornctl

使用 longhornctl 进行预检:

1
2
3
4
# 执行后,会在每个节点运行 longhorn-preflight-checker-xxx Pod 进行预检
longhornctl --kubeconfig ~/.kube/config \
--image harbor.warnerchen.com/rancher/mirrored-longhornio-longhorn-cli:v1.12.1 \
check preflight

如果缺少依赖,也可以通过 longhornctl 进行安装:

1
2
3
4
# 执行后,会在集群的每个节点启动 longhorn-preflight-installer-xxx 的 Pod 安装依赖项
longhornctl --kubeconfig ~/.kube/config \
--image harbor.warnerchen.com/rancher/mirrored-longhornio-longhorn-cli:v1.12.1 \
install preflight

如果不使用 multipath,需要将其禁用:

1
systemctl disable multipathd multipathd.socket --now

如果需要使用 multipath,需要为 Longhorn 相关设备设置 blacklisthttps://longhorn.io/kb/troubleshooting-volume-with-multipath/

使用独立磁盘挂载 /var/lib/longhorn

1
2
3
4
5
6
7
# 假设新磁盘为 /dev/sdb
wipefs -n /dev/sdb
mkfs.ext4 /dev/sdb
mkdir -p /var/lib/longhorn
UUID=`blkid /dev/sdb | awk -F'"' '{ print $2 }'`
echo "UUID=$UUID /var/lib/longhorn ext4 defaults,noatime 0 2" >> /etc/fstab
mount -a

安装 Longhorn

准备 Helm Chart Values:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
cat <<EOF > longhorn-v1-data-engine-values.yaml
global:
imageRegistry: "harbor.warnerchen.com"

image:
longhorn:
engine:
repository: rancher/mirrored-longhornio-longhorn-engine
manager:
repository: rancher/mirrored-longhornio-longhorn-manager
ui:
repository: rancher/mirrored-longhornio-longhorn-ui
instanceManager:
repository: rancher/mirrored-longhornio-longhorn-instance-manager
shareManager:
repository: rancher/mirrored-longhornio-longhorn-share-manager
backingImageManager:
repository: rancher/mirrored-longhornio-backing-image-manager
supportBundleKit:
repository: rancher/mirrored-longhornio-support-bundle-kit
csi:
attacher:
repository: rancher/mirrored-longhornio-csi-attacher
provisioner:
repository: rancher/mirrored-longhornio-csi-provisioner
nodeDriverRegistrar:
repository: rancher/mirrored-longhornio-csi-node-driver-registrar
resizer:
repository: rancher/mirrored-longhornio-csi-resizer
snapshotter:
repository: rancher/mirrored-longhornio-csi-snapshotter
livenessProbe:
repository: rancher/mirrored-longhornio-livenessprobe

service:
ui:
type: NodePort

persistence:
# 后续测试手动创建用途明确的 StorageClass
createStorageClass: false
dataEngine: v1

defaultSettings:
# 默认使用 v1 Data Engine,不使用 v2
v1DataEngine: true
v2DataEngine: false

# 只在明确标记的节点上创建默认磁盘
createDefaultDiskLabeledNodes: true
EOF

安装 Longhorn:

1
2
3
4
5
6
7
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm upgrade --install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--version 1.12.1 \
-f longhorn-v1-data-engine-values.yaml

会部署以下组件:

组件 运行方式 作用
csi-attacher Deployment 监听 VolumeAttachment,负责 Volume Attach / Detach
csi-provisioner Deployment 根据 PVC 创建 Longhorn Volume
csi-resizer Deployment 处理 PVC 扩容请求
csi-snapshotter Deployment 创建和管理 Volume Snapshot
longhorn-csi-plugin DaemonSet Kubernetes CSI Node Plugin,负责 Volume mount / unmount
longhorn-manager DaemonSet Longhorn 核心服务,管理 Volume、Engine、Replica
engine-image DaemonSet 提供 Longhorn Engine 运行镜像
instance-manager DaemonSet 管理 Engine 和 Replica 进程生命周期
longhorn-driver-deployer Deployment 部署 CSI Driver 相关资源
longhorn-ui Deployment Longhorn Web 管理界面

常用功能


设置存储节点

由于设置了 defaultSettings.createDefaultDiskLabeledNodes: true,所以需要手动添加 Label 才能作为存储节点:

1
kubectl label node test-2 node.longhorn.io/create-default-disk=config

添加磁盘:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用之前挂载好的 /var/lib/longhorn,后续节点新增磁盘也是同样操作
kubectl annotate node test-2 \
node.longhorn.io/default-disks-config='[
{
"name":"var-lib-longhorn",
"path":"/var/lib/longhorn",
"allowScheduling":true,
"diskType": "filesystem",
# 预留的磁盘容量,为 0 则取 defaultSettings.storageMinimalAvailablePercentage 的值,默认预留 25%
"storageReserved": 0,
"tags": ["ssd"]
}
]'

通过 Longhorn UI 查看节点情况:


通过标签进行存储分层

如果集群中的存储节点挂载了不同类型的磁盘,可以通过节点 / 磁盘标签进行分类:


创建自定义 StorageClass

Longhorn 可以创建不同用处的 StorageClass。

例如分别创建基于 SSD 和 HDD 的 StorageClass:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-v1-ssd
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: Immediate
parameters:
dataEngine: "v1"
# 集群中三个节点都有 SSD 磁盘,可以将 Replica 设置为 3
numberOfReplicas: "3"
diskSelector: "ssd"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-v1-hdd
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: Immediate
parameters:
dataEngine: "v1"
# 集群中仅有一个节点有 HDD 磁盘,所以 Replica 设置为 1
numberOfReplicas: "1"
diskSelector: "hdd"
EOF

创建 PVC 和 Workload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-ssd-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-v1-ssd
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-ssd
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: app-ssd
template:
metadata:
labels:
app: app-ssd
spec:
containers:
- name: nginx
image: harbor.warnerchen.com/library/nginx:mainline
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-ssd-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-hdd-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-v1-hdd
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-hdd
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: app-hdd
template:
metadata:
labels:
app: app-hdd
spec:
containers:
- name: nginx
image: harbor.warnerchen.com/library/nginx:mainline
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-hdd-pvc
EOF

通过 UI 查看 Volume 状态:


重建 Replica

当 Volume 存在多个 Replica 的时候,可以通过删除重建其中的某个 Replica:


磁盘扩容

主要分为以下场景:

  • 如果 /var/lib/longhorn 本身做了 LVM,那么可以新增磁盘后直接扩容至对应的 LV。
  • 如果 /var/lib/longhorn 本身直接挂载某块磁盘或磁盘分区,新磁盘可以独立挂载,然后添加至 Longhorn:
1
2
3
第一块盘 → /var/lib/longhorn
第二块盘 → /var/lib/longhorn-xxx
第三块盘 → /var/lib/longhorn-yyy
Author

Warner Chen

Posted on

2026-09-20

Updated on

2026-09-21

Licensed under