
本文将介绍云原生分布式存储系统 Longhorn,包括其核心概念、架构原理,以及如何在 Kubernetes 集群中部署和使用。
1. 概述
1.1 Longhorn 简介
Longhorn 是一个开源的、云原生的分布式块存储系统,专为 Kubernetes 环境设计。它最初由 Rancher Labs 开发,现已成为云原生计算基金会(CNCF)的孵化项目。
主要特点:
- 轻量级部署,易于安装和使用
- 分布式架构,支持数据高可用
- 云原生设计,完美集成 Kubernetes
- 支持快照、备份和恢复
- 提供友好的 Web UI 管理界面
1.2 适用场景
Longhorn 适用于以下场景:
- 轻量级生产环境:相比 Ceph 等重量级方案更易部署和维护
- 高可用需求:相比单点 NFS 提供更好的可靠性
- 中小规模集群:在存储性能和运维复杂度之间取得平衡
2. 核心架构
2.1 整体架构

Longhorn 的核心设计理念是为每个 Volume 创建独立的 Engine 进行管理,Engine 负责将 Volume 复制到多个节点,以实现高可用存储。
为什么为每个 Volume 创建一个独立的 Engine?
这样可以保证当某个 Engine 出现问题时,其他 Volume 不受影响,实现了故障隔离。
2.2 核心组件
Longhorn 主要包含以下核心组件:
控制平面组件:
- longhorn-manager:核心控制器(DaemonSet),运行在每个节点,负责卷的创建、删除、调度等管理工作
- longhorn-ui:Web 管理界面,提供可视化的存储管理功能
数据平面组件:
- instance-manager:每个节点运行一个,管理该节点上所有的 Engine 和 Replica 实例
- engine-image:Longhorn 引擎的可执行镜像
CSI 组件(Kubernetes 官方):
- csi-provisioner:负责动态创建 PV
- csi-attacher:负责将卷附加到节点
- csi-resizer:负责卷的扩容
- csi-snapshotter:负责快照功能
- csi-plugin:CSI 驱动插件(DaemonSet),每个节点运行一个
2.3 数据存储与高可用
数据存放位置:Longhorn 使用集群节点的本地磁盘(默认 /var/lib/longhorn
)组成分布式存储池,数据副本分布在这些节点的磁盘上。
1
2
3
| root@node1:/var/lib/longhorn/replicas# ls
pvc-19d50ca0-780d-4073-bb72-36a7ffe9e3e2-1084ec0e
pvc-4f0bf5ea-0dc8-49be-8a3f-559f95416092-4c99b141
|
高可用原理:
- 默认为每个卷创建 3 个副本(可配置)
- Longhorn Manager 自动将副本调度到不同节点,防止单点故障
- 当节点或磁盘故障导致副本失效时,自动在健康节点上重建副本
3. 环境准备
3.1 系统要求
安装 Longhorn 前需要确保环境满足以下要求:
完整要求参考:https://longhorn.io/docs/1.7.3/deploy/install/#installation-requirements
- Kubernetes >= 1.21
- 所有节点需要:
- 安装并运行
open-iscsi
- 安装 NFSv4 client
- 主机文件系统使用 ext4 或 XFS
- 安装
bash
、curl
、findmnt
、grep
、awk
、blkid
、lsblk
等命令 - 开启 Mount propagation
3.2 依赖安装说明
Longhorn 需要以下依赖:
1) open-iscsi
- 用途:提供 iSCSI 协议支持,Longhorn 通过 iSCSI 将卷附加到节点
- 安装:
apt-get install open-iscsi
(Ubuntu/Debian)
2) NFS 客户端
- 用途:Longhorn 的备份功能需要 NFSv4/v4.1/v4.2,RWX 卷需要 NFSv4.1
- 安装:
apt-get install nfs-common
(Ubuntu/Debian)
3) Mount Propagation
- 用途:允许容器挂载的卷共享给同一 Pod 或节点的其他容器
- Kubernetes 默认已开启,无需配置
注意:第4章会介绍使用 DaemonSet 自动安装这些依赖的方式(推荐),这里仅作说明。如需手动安装,参考 官方文档
4. 部署安装
4.1 环境初始化
使用 DaemonSet 自动安装依赖(推荐)
官方提供了 DaemonSet 方式自动在所有节点安装依赖,无需手动登录每个节点操作:
1
2
3
| kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.9.1/deploy/prerequisite/longhorn-iscsi-installation.yaml
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.9.1/deploy/prerequisite/longhorn-nfs-installation.yaml
|
检查安装状态
使用以下脚本检查初始化是否成功:
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
| #!/bin/bash
echo "正在检查 Longhorn 安装 Pod 的日志..."
echo "=================================="
# 检查 iscsi-installation
echo "检查 ISCSI 安装:"
pods=$(kubectl -n longhorn-system get pods -l app=longhorn-iscsi-installation -o name)
for pod in $pods; do
if kubectl -n longhorn-system logs $pod -c iscsi-installation | grep -q "install successfully"; then
echo "✅ $pod: ISCSI 初始化成功"
else
echo "❌ $pod: ISCSI 初始化未成功或日志未找到成功信息"
fi
done
echo "----------------------------------"
# 检查 nfs-installation
echo "检查 NFS 安装:"
pods=$(kubectl -n longhorn-system get pods -l app=longhorn-nfs-installation -o name)
for pod in $pods; do
if kubectl -n longhorn-system logs $pod -c nfs-installation | grep -q "install successfully"; then
echo "✅ $pod: NFS 初始化成功"
else
echo "❌ $pod: NFS 初始化未成功或日志未找到成功信息"
fi
done
echo "=================================="
echo "检查完成。"
|
日志中输出 iscsi install successfully
或 nfs install successfully
表示安装成功。
4.2 使用 Helm 安装 Longhorn
推荐使用 Helm 进行安装:
1
2
3
4
5
6
7
8
9
| # 添加 Helm 仓库
helm repo add longhorn https://charts.longhorn.io
helm repo update
# 安装 Longhorn
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--version 1.7.3
|
注意:1.8.2 和 1.9.1 版本需要 Kubernetes 1.25+,1.7.3 只需要 1.21+
4.3 验证安装
1) 检查 Pod 状态
1
| kubectl -n longhorn-system get pod
|
正常情况下,所有 Pod 应处于 Running 状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| NAME READY STATUS RESTARTS AGE
csi-attacher-6bc8956d47-67fp6 1/1 Running 0 52m
csi-attacher-6bc8956d47-nb869 1/1 Running 0 52m
csi-attacher-6bc8956d47-tnchc 1/1 Running 0 52m
csi-provisioner-b65c98945-5knc2 1/1 Running 0 52m
csi-provisioner-b65c98945-897p7 1/1 Running 0 52m
csi-provisioner-b65c98945-q9pf5 1/1 Running 0 52m
csi-resizer-7cd74679f-7wn4v 1/1 Running 0 52m
csi-resizer-7cd74679f-p2m2h 1/1 Running 0 52m
csi-resizer-7cd74679f-qkdl6 1/1 Running 0 52m
csi-snapshotter-74db7b474-6n2tm 1/1 Running 0 52m
csi-snapshotter-74db7b474-cwbjd 1/1 Running 0 52m
csi-snapshotter-74db7b474-cx5fs 1/1 Running 0 52m
engine-image-ei-d91f5974-7xlhz 1/1 Running 0 53m
instance-manager-290ed8a6055485f167480d21dec82fb9 1/1 Running 0 52m
longhorn-csi-plugin-94xjf 3/3 Running 1 52m
longhorn-driver-deployer-6fc5d44f84-nmqdl 1/1 Running 0 53m
longhorn-manager-rpkbn 2/2 Running 0 53m
longhorn-ui-5b45479667-8dmb2 1/1 Running 0 53m
|
5. Demo
5.1 创建 PVC 并使用
部署完成后,默认会创建两个 StorageClass:
输出示例:
1
2
3
| NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
longhorn (default) driver.longhorn.io Delete Immediate true 53m
longhorn-static driver.longhorn.io Delete Immediate true 53m
|
1) 创建 PVC
使用 Longhorn 存储类创建 PVC:
1
2
3
4
5
6
7
8
9
10
11
| apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 5Gi
|
2) 创建 Pod 使用 PVC
创建一个 Pod 挂载使用该 PVC:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| apiVersion: v1
kind: Pod
metadata:
name: test-longhorn
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: longhorn-vol
mountPath: /data
volumes:
- name: longhorn-vol
persistentVolumeClaim:
claimName: longhorn-pvc
|
部署后可以进入 Pod 验证挂载:
1
2
3
4
5
6
7
8
9
| # 进入 Pod
kubectl exec -it test-longhorn -- bash
# 查看挂载点
df -h | grep /data
# 写入测试数据
echo "Hello Longhorn" > /data/test.txt
cat /data/test.txt
|
5.2 访问 Web UI
Longhorn 提供了 Web UI 用于管理和监控。
修改 Service 为 NodePort 类型
默认情况下,longhorn-frontend
Service 是 ClusterIP 类型,需要修改为 NodePort:
1
| kubectl -n longhorn-system patch svc longhorn-frontend -p '{"spec":{"type":"NodePort"}}'
|
查看分配的端口:
1
| kubectl -n longhorn-system get svc longhorn-frontend
|
输出示例:
1
2
| NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
longhorn-frontend NodePort 10.96.123.456 <none> 80:30123/TCP 1h
|
通过任意节点 IP + NodePort 访问 Web UI:http://<node-ip>:30123
Web UI 界面

在 Web UI 中可以:
- 查看和管理卷(Volume)
- 查看节点和磁盘状态
- 创建快照和备份
- 监控存储使用情况
6. 小结
本文全面介绍了 Longhorn 这款云原生分布式存储系统,从架构原理到实际部署使用,涵盖了以下内容:
- 核心架构:采用微服务架构,每个卷独立运行 Engine 和 Replica,实现故障隔离;详细说明了各核心组件的作用
- 环境准备:系统要求和依赖说明(open-iscsi、NFS 客户端等)
- 部署安装:通过 DaemonSet 自动安装依赖,使用 Helm 快速部署 Longhorn
- 使用配置:创建 PVC、配置副本数、PVC 扩容、访问 Web UI 等实际操作
- 常见问题:Pod 启动失败、数据库初始化、节点故障恢复、卸载清理等常见问题的解决方案
存储方案选型建议
在 Kubernetes 环境中,不同场景适合不同的存储方案:
测试/开发环境 → NFS
- ✅ 部署最简单,一台 NFS Server 即可
- ✅ 配置方便,无需额外组件
- ❌ 单点故障风险,可靠性较低
- ❌ 性能一般,不适合生产环境
大型生产环境 → Ceph
- ✅ 高性能、高可用、高扩展性
- ✅ 功能强大,支持对象存储、块存储、文件存储
- ❌ 架构复杂,运维成本高
- ❌ 资源占用大,需要专业团队维护
- ❌ 对于小规模集群过于"重量级"
中小规模生产环境 → Longhorn
- ✅ 比 Ceph 轻量级,部署运维简单
- ✅ 比 NFS 可靠,支持副本和高可用
- ✅ 云原生设计,与 Kubernetes 深度集成
- ✅ Web UI 友好,易于管理和监控
- ⚠️ 性能不如 Ceph,但满足大多数场景需求
总结:如果你的生产环境规模不大(几十个节点以内),又希望在存储可靠性和运维复杂度之间取得平衡,Longhorn 是最佳选择。它既保证了生产级的可靠性,又避免了 Ceph 的复杂度,是"刚刚好"的分布式存储方案。
7. 参考资料