云原生分布式存储系统:Longhorn 初体验

Longhorn

本文将介绍云原生分布式存储系统 Longhorn,包括其核心概念、架构原理,以及如何在 Kubernetes 集群中部署和使用。

1. 概述

1.1 Longhorn 简介

Longhorn 是一个开源的、云原生的分布式块存储系统,专为 Kubernetes 环境设计。它最初由 Rancher Labs 开发,现已成为云原生计算基金会(CNCF)的孵化项目。

主要特点:

  • 轻量级部署,易于安装和使用
  • 分布式架构,支持数据高可用
  • 云原生设计,完美集成 Kubernetes
  • 支持快照、备份和恢复
  • 提供友好的 Web UI 管理界面

1.2 适用场景

Longhorn 适用于以下场景:

  • 轻量级生产环境:相比 Ceph 等重量级方案更易部署和维护
  • 高可用需求:相比单点 NFS 提供更好的可靠性
  • 中小规模集群:在存储性能和运维复杂度之间取得平衡

2. 核心架构

2.1 整体架构

Longhorn Arch

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
    • 安装 bashcurlfindmntgrepawkblkidlsblk 等命令
    • 开启 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 successfullynfs 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
kubectl get sc

输出示例:

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 界面

Longhorn 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. 参考资料

0%