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
| longhornctl --kubeconfig ~/.kube/config \ --image harbor.warnerchen.com/rancher/mirrored-longhornio-longhorn-cli:v1.12.1 \ check preflight
|
如果缺少依赖,也可以通过 longhornctl 进行安装:
1 2 3 4
| 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 相关设备设置 blacklist:https://longhorn.io/kb/troubleshooting-volume-with-multipath/
使用独立磁盘挂载 /var/lib/longhorn:
1 2 3 4 5 6 7
| 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
# 不自动创建 /var/lib/longhorn 类型的默认磁盘,后续手动添加磁盘 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 14
|
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
|
RWO 类型的 Volume
Longhorn RWO 的核心是工作负载所在节点直接将 Longhorn Volume 作为块设备挂载,并依赖 iSCSI:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Pod A / Node 1 │ │ 普通文件读写 ▼ ext4 / XFS 文件系统 │ ▼ Longhorn CSI 挂载点 │ ▼ iSCSI Block Device │ ▼ Longhorn Engine,运行在 Node 1 的 Instance Manager 中 │ ├── 同步写入 → Replica 1 ├── 同步写入 → Replica 2 └── 同步写入 → Replica 3
|
可以看到,Engine 运行在 Pod 所在节点的 Instance Manager 中:

在 Pod 所在节点可以看到对应的块设备 /dev/sdc 以及 iSCSI 连接信息,其中 10.42.179.63 为 Pod 所在节点的 Instance Manager Pod IP:

RWX 类型的 Volume
Longhorn 的 RWX 并不是让多个节点直接连接同一个块设备,而是启动一个 Share Manager Pod 提供 NFS Server 服务,Pod 通过 NFS Client 挂载 Volume 使用:
1 2 3 4 5 6 7 8
| Longhorn Volume │ ▼ Share Manager Pod (NFS Server) │ ├── Pod A / Node 1 (NFS Client) ├── Pod B / Node 2 (NFS Client) └── Pod C / Node 3 (NFS Client)
|
默认情况下,NFS Client 通过 Share Manager 的 Service 进行连接,因此依赖 CoreDNS。
如果要使用真实 IP 地址,则需要配置 Storage Network,具体配置参考:https://warnerchen.github.io/2025/11/28/Longhorn-%E9%85%8D%E7%BD%AE-Storage-Network/
创建 RWX 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
| cat <<EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: app-rwx-pvc namespace: default spec: accessModes: - ReadWriteMany volumeMode: Filesystem storageClassName: longhorn-v1-ssd resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: app-rwx namespace: default spec: replicas: 3 selector: matchLabels: app: app-rwx template: metadata: labels: app: app-rwx spec: containers: - name: nginx image: harbor.warnerchen.com/library/nginx:mainline volumeMounts: - name: shared-data mountPath: /data volumes: - name: shared-data persistentVolumeClaim: claimName: app-rwx-pvc EOF
|
创建后可以看到 Share Manager 的 Pod 和 Service。通过 mount 查看挂载信息,可以看到 Volume 是通过 ClusterIP 进行挂载的:

除了普通类型的 RWX Volume 外,Longhorn 还提供 Migratable RWX,这种类型仅适用于 KubeVirt VM 的热迁移,不适合作为普通共享文件系统使用。