Longhorn 分布式块存储
30 道题- 分类
- 存储
- 题目数
- 30 道
1 Longhorn 的核心架构是怎样的?
答案:
Longhorn 由五个核心组件构成分层架构:Longhorn Manager(控制平面)、Longhorn Engine(存储控制器/数据平面)、Replica(数据副本)、Instance Manager(进程生命周期管理)和 CSI Driver(Kubernetes 存储接口实现)。
组件职责与关系
| 组件 | 角色 | 部署形态 |
|---|---|---|
| Longhorn Manager | 控制平面核心,作为 DaemonSet 运行,负责 CRD 编排、卷生命周期管理、调度决策、UI API | 每个节点一个 Pod |
| Longhorn Engine | 数据平面存储控制器,实现 iSCSI Target,管理 I/O 处理、副本同步、快照 | 每个卷一个 Engine 进程 |
| Replica | 数据副本,存储实际数据块,基于 Linux Sparse File 存储 | 每个卷的每个副本一个进程 |
| Instance Manager | 管理 Engine 和 Replica 进程的生命周期,抽象进程管理 | 每个节点一个 DaemonSet Pod |
| CSI Driver | 实现 CSI 规范,负责卷的 Provision / Attach / Mount / Detach | CSI Controller(Deployment)+ CSI Node Plugin(DaemonSet) |
架构数据流
graph TD
subgraph K8s["Kubernetes"]
CSI["PVC → StorageClass → Longhorn CSI Driver"]
end
K8s -->|"gRPC"| Manager
subgraph Manager["Longhorn Manager (DaemonSet)"]
Scheduler["Scheduler"]
CRD["CRD Watch"]
Webhook["Webhook"]
end
Manager -->|"进程管理"| InstanceMgr
subgraph InstanceMgr["Instance Manager (DaemonSet)"]
Engine["Engine Process"]
Replica["Replica Process(s)"]
end
核心职责分界
- Longhorn Manager:不做数据 I/O,只做控制和编排。监听 Volume / Engine / Replica 等 CRD,通过 Instance Manager API 下发创建/删除进程的指令。
- Instance Manager:不包含业务逻辑,仅负责 Engine/Replica 进程的 fork、健康检查和重启。Engine 和 Replica 进程通过 gRPC 与 Instance Manager 通信。
- Engine:承担所有数据路径职责,包括 read/write I/O、副本间数据同步、snapshot 管理、与外部备份目标通信。
- Replica:仅负责本地数据存储和响应 Engine 的读写请求,不参与 I/O 路由决策。
2 Longhorn Volume 的读写路径是怎样的?iSCSI 协议起什么作用?
答案:
Longhorn Volume 的 I/O 路径采用 iSCSI 块设备协议实现从 Pod 所在节点到 Engine 所在节点的远程挂载,Engine 再通过内部 TCP 协议将写操作同步到所有 Replica。
完整读写路径
graph TD
Pod["Pod(应用程序)"]
BlockDev["/dev/longhorn/<volume-name>(块设备)"]
Initiator["iSCSI Initiator(open-iscsi)<br/>在 Pod 所在节点上"]
Target["iSCSI Target(tgt / LIO)<br/>在 Engine 进程中<br/>(iSCSI 协议,TCP 3260)"]
Engine["Longhorn Engine(存储控制器)"]
Replica["Replica 1, Replica 2, Replica 3<br/>各节点上的 Sparse File"]
Pod --> BlockDev
BlockDev --> Initiator
Initiator -->|"iSCSI 协议,TCP 3260"| Target
Target --> Engine
Engine -->|"写操作:并行写入所有 Replica"| Replica
iSCSI 协议的作用
Longhorn Engine 内置 iSCSI Target 实现(基于 tgt 或 LIO),对外暴露为 iSCSI 设备。Pod 所在节点的 iSCSI Initiator(open-iscsi)通过 TCP 3260 端口连接 Engine,将远端块设备映射为本地 /dev/longhorn/<volume-name> 设备。
iSCSI 在此处的核心价值:
- 跨节点块设备挂载:Pod 和 Engine 可以位于不同节点,iSCSI 作为标准 SAN 协议实现远程块设备访问。
- 标准内核支持:Linux 内核原生支持 iSCSI Initiator,无需额外内核模块。
- 与 Kubernetes 兼容:CSI Node Plugin 调用
iscsiadm完成登录和挂载,完全符合 Kubernetes 卷挂载生命周期。
写入路径细节
- 应用向
/dev/longhorn/pvc-xxx写入数据。 - iSCSI Initiator 将写请求封装为 iSCSI PDU,通过 TCP 发送给 Engine 的 iSCSI Target。
- Engine 收到写入后,将数据写入自身的 Frontend I/O buffer,然后并行向所有健康 Replica 发送写入请求。
- 根据 Write Tolerance 策略(默认 Quorum),Engine 等待足够数量 Replica 确认后返回写入成功。
- Replica 将数据写入本地 Sparse File(链式快照结构),并更新 Metadata。
读取路径细节
- 应用从块设备读取数据。
- iSCSI Initiator 将读请求转发给 Engine。
- Engine 从任意一个健康的 Replica 读取(默认轮询),直接返回,无 Quorum 判断。
3 Longhorn 的 Replica 副本机制与 Quorum 是如何工作的?
答案:
Longhorn 采用多副本同步写入机制,通过 Quorum(法定人数) 保证数据一致性和可用性。每个 Volume 可配置多个 Replica(默认 3),Engine 负责在写入时将数据同步分发给所有 Replica。
副本数量与容错能力
| Replica 数量 | 容忍故障数 | 写入 Quorum(默认) | 最小健康副本 |
|---|---|---|---|
| 1 | 0 | 1 | 1 |
| 2 | 0 | 2 | 2 |
| 3 | 1 | 2 | 2 |
| 4 | 1 | 2 | 2 |
| 5 | 2 | 3 | 3 |
Quorum 机制
Longhorn 使用多数派写入确认策略:
- 默认写入 Quorum =
floor(n/2) + 1(n 为 Replica 数量)。 - Engine 发送写入请求到所有 Replica,等待至少 Quorum 数量的 Replica 确认成功后才向上层返回写入成功。
- 未确认成功的 Replica 标记为 Out-of-Sync,触发 Rebuild 过程。
- 读取只需 1 个 Replica 响应即可,无需 Quorum。
副本状态转换
| 状态 | 含义 | 触发条件 |
|---|---|---|
| Healthy | 正常同步状态 | 初始创建或 Rebuild 完成 |
| Degraded | 降级状态(至少 1 个副本不可用) | Replica 所在节点故障/网络中断 |
| Failed | 副本不可恢复 | 长时间失联或数据损坏 |
| Rebuilding | 正在重建 | 新副本加入或旧副本恢复 |
副本同步模式
- 同步写入:Engine 等待全部 Quorum 确认,保证写入一致性。
- Rebuild 同步:当副本失联后重新加入时,Engine 自动触发增量 Rebuild,仅同步差异快照链。Rebuild 期间 Volume 仍可正常读写,性能可能受影响。
- 快照链一致性:每个 Replica 独立维护快照链(Snapshot Chain),Engine 通过比较快照 ID 确定差量范围。
4 Longhorn Engine 的高可用设计是什么?
答案:
Longhorn Engine 作为每个 Volume 的存储控制器,其高可用依赖 进程级自动故障转移 机制。当 Engine 进程所在节点故障时,Longhorn Manager 自动将 Engine 迁移到健康节点并重新挂载,整个恢复过程对 Pod I/O 透明。
Engine 故障转移流程
- 故障检测:Longhorn Manager 监测 Engine 进程状态,节点宕机或 Engine 崩溃后,Manager 在设定的超时(默认 10s)内确认 Engine 不可用。
- 选择新节点:Scheduler 根据 Replica 分布选择最佳节点启动新 Engine。优先选择已有健康 Replica 的节点以减少网络跳数。
- 启动新 Engine:通过 Instance Manager 在新节点上启动 Engine 进程,Engine 重新连接所有健康 Replica。
- iSCSI 重连:CSI Node Plugin 通过 iSCSI 重新连接新 Engine,应用 I/O 恢复(短暂阻塞后恢复)。
Engine 高可用的关键参数
| 参数 | 默认值 | 说明 |
|---|---|---|
engine-start-timeout | 180s | Engine 启动超时 |
timeout-between-replica-data-retrieval | 2s | Engine 连接 Replica 超时 |
auto-salvage | enabled | 启用自动故障恢复 |
concurrent-automatic-engine-upgrade | 1 | 并发 Engine 升级数 |
设计特点
- Engine 本身是无状态的(状态在 Replica 中),故障转移无数据迁移开销。
- Engine 进程轻量,恢复快速(秒级)。
- 与 Replica 连接恢复后自动校验快照链一致性,确定是否需要 Rebuild。
5 Longhorn 的 Snapshot 快照原理是什么?增量快照如何实现?
答案:
Longhorn 使用 链式快照(Snapshot Chain) 模型,基于 Copy-on-Write(CoW)策略实现。每个 Volume 的快照组成一个链,每个快照仅存储自上一个快照以来的增量数据。
快照存储结构
graph TD
Head["Volume-Head(当前写入)"]
Snap3["Snapshot-003(Δ3)"]
Snap2["Snapshot-002(Δ2)"]
Snap1["Snapshot-001(Δ1)"]
Empty["Volume-Head 初始状态(空)"]
Head --> Snap3
Snap3 --> Snap2
Snap2 --> Snap1
Snap1 --> Empty
链式快照工作原理
- 初始状态:Volume 创建时生成一个空的 Volume-Head 文件,所有写入进入此文件。
- 创建快照:创建 Snapshot 时,当前 Volume-Head 被冻结并转化为快照文件(如
volume-snap-001.img),同时新建一个空的 Volume-Head 承接后续写入。 - 继续写入:新的写入进入新的 Volume-Head。旧快照文件中的块如果被修改,新数据写入 Volume-Head 而不修改快照文件(CoW 语义)。
- 读取数据:读取时从 Volume-Head 开始逐层向下查找,找到第一个包含该块数据的快照层返回。
增量快照特性
- 空间效率:每个快照仅包含差异数据,不复制完整 Volume。
- 即时创建:快照创建是 O(1) 操作,仅冻结 Head 和创建新 Head。
- 即时删除:删除快照时将其数据块合并到下一层。
- Purge 操作:删除最后一个快照时需要将快照数据合并回 Volume-Head,此为后台异步操作。
Replica 快照一致性
Engine 保证所有 Replica 在同一快照点的一致性。创建快照时,Engine 暂停 I/O,向所有 Replica 发送快照创建指令,所有 Replica 成功后在 Engine 侧记录快照完成。若某个 Replica 创建失败,Engine 标记该 Replica 为 Out-of-Sync 并触发 Rebuild。
6 Longhorn 的 Backup 机制如何工作?支持哪些外部备份目标?
答案:
Longhorn 支持将 Volume 快照备份到外部对象存储,实现异地容灾。Backup 由 Engine 进程驱动,直接从 Replica 读取数据并通过 Backupstore Driver 写入远程存储。
支持的外部备份目标
| 类型 | 示例 | 配置方式 |
|---|---|---|
| S3 Compatible | AWS S3、MinIO、Ceph RGW | s3://bucket@region/ |
| NFS | NFSv4 服务器 | nfs://server:/path/ |
| CIFS | Windows 共享 | cifs://server/share/ |
| Azure Blob Storage | Azure Storage Account | azblob://container/ |
Backup 工作流程
- 创建 Snapshot:用户或 Recurring Job 创建 Volume Snapshot。
- 创建 Backup CRD:Longhorn Manager 创建 Backup CR 对象。
- Engine 执行备份:Engine 读取指定 Snapshot 的数据块(跨所有 Replica 的 Snapshot Chain 差异数据)。
- 去重与压缩:Engine 将数据块(默认 2MB block size)去重后压缩,上传至 Backupstore。
- 更新元数据:备份完成后,将 Volume 元数据(Volume 大小、快照链信息等)写入 Backupstore 的
volume.cfg文件。
Backupstore 存储结构
backupstore/
├── backups/
│ └── backup_<backup-id>.cfg
├── volumes/
│ └── <volume-name>/
│ ├── volume.cfg
│ └── blocks/
│ └── <block-id>.blk
└── locks/
备份增量机制
- 全量备份:首次备份上传 Volume 全部数据块。
- 增量备份:后续备份仅上传自上次备份以来的新增/变更数据块(通过比较旧 Snapshot Chain 和新 Snapshot Chain 的差异)。
- 块级去重:Engine 对每个 2MB 数据块计算哈希,已存在的块不再上传。
7 Longhorn 的 Disaster Recovery Volume 如何实现跨集群灾备?
答案:
Disaster Recovery Volume(DR Volume)是 Longhorn 实现跨集群灾备的核心机制。DR Volume 在主集群故障时激活为正常 Volume,数据从 Backupstore 中增量同步恢复。
DR Volume 工作原理
- 在主集群:创建 Backup(Snapshot → Backup),数据存储到共享的 Backupstore(如 S3/MinIO)。
- 在灾备集群:创建 DR Volume,指向同一 Backupstore 和 Backup 记录。
- 增量同步:DR Volume 持续从 Backupstore 拉取最新的增量备份数据,保持快照链与主集群同步。
- 故障切换:主集群不可用时,执行
Activate操作将 DR Volume 转为正常 Volume,创建 Engine 和 Replica,挂载到 Pod。
DR Volume 状态机
| 状态 | 含义 |
|---|---|
Standby | DR Volume 持续同步中,不可挂载 |
Activating | 正在激活为正常 Volume |
Active | 已激活,可正常读写 |
Inactive | 未创建或已删除 |
激活过程
- Manager 停止增量同步。
- 从最新的 Backup 创建 Replica。
- 创建 Engine 并关联 Replica。
- 挂载 Volume 到请求的 Pod。
- 应用数据恢复到最新备份点。
关键限制
- DR Volume 不实时同步数据,RPO 等于最近一次 Backup 间隔。
- 激活操作为单向不可逆,激活后无法回退到 Standby 状态。
- 建议结合 Recurring Job 设置合理的备份间隔以达到目标 RPO。
8 Longhorn CSI Driver 的工作流程是什么?
答案:
Longhorn CSI Driver 实现 Kubernetes CSI 规范 v1.x,负责 PVC → PV 的完整生命周期管理。架构分为 CSI Controller(控制面)和 CSI Node Plugin(数据面)两部分。
CSI 组件架构
| 组件 | 类型 | 职责 |
|---|---|---|
| CSI Controller | Deployment(1 Replica) | Provision / Delete Volume、Create / Delete Snapshot、Volume 扩容 |
| CSI Node Plugin | DaemonSet | NodeStage / NodePublish / NodeUnpublish Volume、iSCSI 连接管理 |
| CSI Sidecar Containers | 辅助容器 | external-provisioner、external-resizer、external-snapshotter、node-driver-registrar、livenessprobe |
PVC 创建完整流程
graph TD
S1["1. PVC 提交 → external-provisioner 调用 CSI Controller CreateVolume"]
S2["2. CSI Controller → Longhorn Manager API 创建 Volume CRD"]
S3["3. Longhorn Manager Scheduler 选择节点 → 创建 Replica CRD"]
S4["4. Instance Manager 启动 Replica 进程"]
S5["5. Longhorn Manager 创建 Engine CRD → Instance Manager 启动 Engine"]
S6["6. Engine 连接 Replica → Volume 状态变为 Healthy"]
S7["7. Pod 调度到某节点 → kubelet 发起 NodeStageVolume / NodePublishVolume"]
S8["8. CSI Node Plugin 执行 iscsiadm 登录 → 挂载块设备 → bind mount 到 Pod"]
S9["9. Pod 启动,读写 /dev/longhorn/<volume-name>"]
S1 --> S2
S2 --> S3
S3 --> S4
S4 --> S5
S5 --> S6
S6 --> S7
S7 --> S8
S8 --> S9
CSI 关键操作说明
- CreateVolume:通过 Longhorn Manager gRPC API 创建 Volume 及关联的 Engine/Replica 资源。
- NodeStageVolume:触发 iSCSI 登录,将块设备映射到节点全局设备路径(
/dev/longhorn/<volume-name>)。 - NodePublishVolume:将全局设备路径 bind mount 到 Pod 的 volume mount 路径。
- NodeUnpublishVolume:解绑 bind mount。
- NodeUnstageVolume:执行 iSCSI 登出。
- DeleteVolume:删除 Volume 及相关联的 Engine、Replica 资源。
9 Longhorn Instance Manager 的职责是什么?如何控制副本生命周期?
答案:
Instance Manager 是 Longhorn v1.0.0 引入的进程生命周期管理组件,以 DaemonSet 形式在每个节点上运行,负责 Engine 和 Replica 进程的创建、健康监控和重启。
架构背景
在引入 Instance Manager 之前,Engine 和 Replica 进程由 Longhorn Manager 的 longhorn-engine 和 longhorn-replica 容器直接管理。该方式存在以下问题:
- Manager Pod 重启会级联重启所有 Engine 和 Replica 进程。
- Manager 升级期间 Engine 进程受影响。
- 进程管理职责与编排逻辑耦合。
Instance Manager 的两个实例
每个节点运行两种 Instance Manager:
| 类型 | 管理的进程 | Pod 标签 |
|---|---|---|
Instance Manager Engine(instance-manager-e-xxx) | Engine 进程 | longhorn.io/instance-manager-type: engine |
Instance Manager Replica(instance-manager-r-xxx) | Replica 进程 | longhorn.io/instance-manager-type: replica |
进程生命周期管理
- 进程创建:Longhorn Manager 通过 gRPC 调用 Instance Manager 的
ProcessCreate接口,传入进程二进制路径和参数。Instance Manager fork 子进程。 - 健康检查:Instance Manager 定期对子进程进行 gRPC 健康探测(
ProcessGet接口),并将状态上报给 Longhorn Manager。 - 进程重启:子进程崩溃后,Instance Manager 可配置自动重启策略,重启失败则上报异常状态。
- 进程删除:Longhorn Manager 调用
ProcessDelete接口,Instance Manager 发送 SIGTERM 后等待退出,超时发送 SIGKILL。
进程管理优势
- 隔离性:Manager 升级/重启不影响已运行的 Engine/Replica 进程。
- 统一接口:通过 gRPC 标准接口管理进程,屏蔽底层 PID namespace 差异。
- 资源控制:Instance Manager 可对子进程施加 cgroup 限制,控制 CPU 和内存使用。
10 Longhorn 如何管理 Node 和 Disk?
答案:
Longhorn 将 Kubernetes 节点映射为 Node CRD,每个 Node 可配置多个 Disk(物理存储路径),通过调度器和标签机制控制 Replica 的放置策略。
Node CRD 核心字段
| 字段 | 说明 |
|---|---|
allowScheduling | 是否允许在此节点调度新 Replica |
evictionRequested | 是否请求从此节点驱逐所有 Replica |
tags | 节点标签,用于 Replica 调度亲和性 |
disks | 节点上的存储磁盘配置列表 |
Disk 管理
每个 Disk 对应节点上的一个挂载路径:
Node: worker-1
├── Disk: default (/var/lib/longhorn/)
│ ├── storageReserved: 30% ← 预留空间不用于调度
│ ├── storageMaximum: 200Gi ← 调度上限
│ └── tags: ["ssd", "fast"]
└── Disk: archive (/mnt/archive/)
├── storageReserved: 10%
├── storageMaximum: 1Ti
└── tags: ["hdd", "archive"]
Disk 调度策略
Longhorn Scheduler 在为 Replica 选择位置时考虑以下因素:
- Disk 空间充足:排除空间不足(考虑 storageReserved 和 storageMaximum)的磁盘。
- Disk 标签匹配:匹配 Volume 的 Disk Selector 标签。
- Node 标签匹配:匹配 Volume 的 Node Selector 标签。
- 反亲和性:同一 Volume 的多个 Replica 默认不调度到同一节点。
- Data Locality:根据 Data Locality 策略决定是否将 Replica 调度到 Engine 所在节点。
磁盘状态监控
Longhorn Manager 持续监控每个 Disk 的状态:
| 磁盘状态 | 含义 |
|---|---|
ready | 磁盘正常可用 |
unschedulable | 磁盘空间不足或管理员禁用了调度 |
notReady | 磁盘不可用(挂载点异常等) |
11 Longhorn 的 Replica Scheduling 策略是怎样的?
答案:
Longhorn 实现了一套多维度 Replica 调度策略,包括自动均衡(Replica Auto Balance)、数据本地性(Data Locality)和反亲和性调度,确保数据分布合理且性能最优。
调度策略分类
| 策略 | 配置项 | 默认值 | 说明 |
|---|---|---|---|
| 反亲和性 | 硬编码 | enabled | 同一 Volume 的 Replica 不在同一节点 |
| Soft Anti-Affinity | ReplicaSoftAntiAffinity | disabled | 允许在同节点放置多个 Replica |
| Data Locality | DataLocality | disabled | Replica 尽量与 Engine 在同一节点 |
| Auto Balance | ReplicaAutoBalance | disabled | 自动平衡各节点的 Replica 数量 |
Replica Auto Balance 三种模式
| 模式 | 行为 |
|---|---|
disabled | 不自动平衡 |
least-effort | 仅在创建新 Volume 或添加新节点时尝试平衡,不迁移已有 Replica |
best-effort | 定期检查 Replica 分布,必要时迁移 Replica 以达到平衡 |
Data Locality 数据本地性
| 模式 | 行为 |
|---|---|
disabled | Replica 不考虑 Engine 位置 |
best-effort | 尝试将一个 Replica 与 Engine 放置在同一节点,无法满足不阻塞调度 |
strict-local | 必须有一个 Replica 与 Engine 在同一节点,否则不创建 Volume |
调度优先级
1. Node/Disk 标签匹配(Selector)
2. 反亲和性检查(Replica Soft/Hard Anti-Affinity)
3. Data Locality 策略
4. 磁盘空间充足性
5. Replica Auto Balance 策略
6. 负载排序(选空闲空间最大/负载最小的节点)
标签选择器示例
apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
name: demo-volume
spec:
numberOfReplicas: 3
dataLocality: best-effort
replicaAutoBalance: best-effort
nodeSelector:
- zone: "zone-a"
diskSelector:
- ssd
12 Longhorn 的 Recurring Job 如何配置定时快照和备份?
答案:
Recurring Job 是 Longhorn 内置的定时任务机制,支持按 Cron 表达式定时执行 Snapshot、Backup、Snapshot Cleanup 和 Filesystem Trim 等操作。Recurring Job 通过 CRD 定义,可关联到单个 Volume 或 Volume Group。
支持的 Job 类型
| Job 类型 | 操作 | 说明 |
|---|---|---|
snapshot | 创建 Volume 快照 | 即时快照,用于本地恢复 |
backup | 创建快照并备份到 Backupstore | 快照 + 自动上传到 S3/NFS 等 |
snapshot-cleanup | 清理过期快照 | 按保留策略删除旧快照 |
filesystem-trim | 文件系统 Trim | 回收文件系统中未使用的块 |
Recurring Job CRD 示例
apiVersion: longhorn.io/v1beta2
kind: RecurringJob
metadata:
name: daily-backup
spec:
cron: "0 2 * * *"
task: "backup"
groups: []
labels: {}
retain: 7 # 保留最近 7 个备份
concurrency: 1 # 同一 Volume 最多同时执行 1 个此类型的 Job
parameters:
fullBackupInterval: 7 # 每 7 次增量备份后做一次全量备份
Volume 关联 Recurring Job
apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
name: demo-volume
spec:
recurringJobSelector:
matchLabels:
backup-policy: daily
保留策略
retain字段控制保留的快照/备份数量。- 超出数量的旧快照自动删除(先删除最旧的)。
- 快照清理按 Volume 粒度执行,不跨 Volume 计算。
并发控制
concurrency控制同一 Volume 上同一类型 Job 的最大并发数。- 设置为
1时,如果前一个 Job 仍在执行,新触发的 Job 被跳过。 - 不同 Volume 之间的 Job 并发不受此限制。
13 Longhorn 如何实现在线 Volume 扩容?
答案:
Longhorn 支持对已挂载的 Volume 进行在线扩容(Online Expansion),无需停止 Pod 或卸载 Volume。扩容涉及两层:Longhorn Volume 块设备层和文件系统层。
扩容流程
- 修改 PVC Spec:用户或控制器修改 PVC 的
spec.resources.requests.storage增大容量。 - CSI Controller 响应:external-resizer 检测到 PVC 变更,调用 CSI Controller 的
ControllerExpandVolume。 - Longhorn Manager 扩容 Volume:Manager 更新 Volume CRD 的
spec.size,并通知 Engine 进程调整块设备大小。 - Engine 更新 iSCSI Target:Engine 更新 iSCSI Target 的 LUN 大小。
- CSI Node Plugin 扩容块设备:Node Plugin 重新扫描 iSCSI 设备并更新块设备大小。
- 文件系统扩容:Node Plugin 调用文件系统特定工具(
resize2fs/xfs_growfs)扩展文件系统到新大小。
扩容约束
| 约束 | 说明 |
|---|---|
| 仅支持扩大 | Volume 不支持缩小(shrink) |
| 仅支持在线扩容 | 通过 CSI 标准在线扩容(Online Expansion) |
| 文件系统依赖 | ext4 和 xfs 均支持在线扩容 |
| PVC 存储类支持 | StorageClass 需设置 allowVolumeExpansion: true |
StorageClass 配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "3"
staleReplicaTimeout: "30"
fromBackup: ""
fsType: "ext4"
扩容注意事项
- 扩容过程对上层 I/O 透明,不影响 Pod 正常运行。
- Volume 扩容后,Replica 对应 Sparse File 的大小会自动扩容。
- 扩容不会自动触发快照或备份,建议扩容后立即创建快照。
14 Longhorn 的卷克隆(Volume Clone)如何实现?
答案:
Longhorn 支持从现有 Volume 的 Snapshot 创建克隆(Clone),克隆操作在 Snapshot 层面执行,生成一个独立的 Volume,与源 Volume 共享底层数据块。
Clone 工作流程
- 选择源 Snapshot:指定源 Volume 的某个 Snapshot 作为克隆源。
- 创建 Clone Volume:Longhorn Manager 创建新的 Volume CRD,其 Snapshot Chain 指向源 Snapshot 作为基础层。
- 创建 Replica:新 Replica 的 Sparse File 链基址指向源 Snapshot 的数据文件。
- 共享数据:Clone Volume 和源 Volume 的旧 Snapshot 共享底层数据块,新写入分别进入各自的 Volume-Head。
- 独立性:Clone 创建后可独立写入、创建快照、备份,与源 Volume 完全解耦。
Clone 特性
| 特性 | 说明 |
|---|---|
| 即时创建 | Clone 无需复制数据,创建瞬间完成 |
| CoW 写入 | 修改旧 Snapshot 数据时触发 Copy-on-Write,仅写入 Clone 自己的层 |
| 独立生命周期 | Clone 的增删改不影响源 Volume |
| 链式克隆 | 可以从 Clone 的 Snapshot 再次创建 Clone |
Clone CRD 示例
apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
name: clone-volume
spec:
fromBackup: ""
numberOfReplicas: 3
dataSource: |
kind: Volume
name: source-volume
snapshot: snapshot-001
典型应用场景
- 开发/测试环境:从生产数据快照克隆出测试数据。
- 数据恢复验证:克隆备份数据以验证可恢复性。
- 数据分析:为分析任务提供生产数据的只读副本。
15 Longhorn 如何支持 RWX(ReadWriteMany)访问模式?
答案:
Longhorn 通过内置的 Share Manager 组件实现 RWX(ReadWriteMany)访问模式。Share Manager 在每个 Volume 的 Engine 所在节点运行一个 NFS Ganesha 服务器,将块设备通过 NFSv4 协议导出为可多节点同时挂载的文件系统。
RWX 访问模式的架构差异
| 访问模式 | 底层协议 | 共享方式 | 典型场景 |
|---|---|---|---|
| RWO(ReadWriteOnce) | iSCSI 块设备 | 单 Pod 独占 | 数据库、有状态应用 |
| RWX(ReadWriteMany) | NFSv4(通过 Share Manager) | 多 Pod 共享 | 共享存储、CI/CD Workspace |
Share Manager 架构
graph TD
PodA["Pod-A (Node-1)<br/>NFS Client"]
PodB["Pod-B (Node-2)<br/>NFS Client"]
PodC["Pod-C (Node-3)<br/>NFS Client"]
PodA --> Ganesha["NFS Ganesha Server<br/>(Share Manager Pod)"]
PodB --> Ganesha
PodC --> Ganesha
Ganesha --> BlockDev["/dev/longhorn/<volume-name>"]
BlockDev --> Engine["Longhorn Engine (iSCSI)"]
Engine --> Replica1["Replica"]
Engine --> Replica2["Replica"]
Engine --> Replica3["Replica"]
Share Manager 工作原理
- Volume 创建:Volume 按正常流程创建(Engine + Replica)。
- Share Manager 启动:当 Volume 被以 RWX 模式请求时,Longhorn Manager 创建 Share Manager Pod。
- NFS 导出:Share Manager 内的 NFS Ganesha 服务器将块设备格式化为文件系统(如 ext4/xfs)并通过 NFSv4 导出。
- Pod 挂载:CSI Node Plugin 在 Pod 所在节点执行 NFS mount 而非 iSCSI 登录。
- 数据路径:Pod → NFS Client → NFS Ganesha → 块设备 → Engine → Replica。
RWX Volume 配置示例
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: shared-data
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: 10Gi
限制与权衡
| 限制 | 说明 |
|---|---|
| NFS 性能开销 | NFS 层引入额外延迟和吞吐开销 |
| 单点瓶颈 | Share Manager 是单实例(无故障转移) |
| 文件锁 | NFSv4 提供文件锁,但性能不如 RWO 的块设备锁 |
| StorageClass 参数 | 需配置 share: "true" 或 NFS RWX 相关参数 |
16 Longhorn 的存储网络隔离如何配置?
答案:
Longhorn 支持 Storage Network 功能,将 Engine 与 Replica 之间的数据流量隔离到专用网络接口,与 Kubernetes 管理流量和 iSCSI 前端流量分离,避免存储 I/O 争抢应用网络带宽。
存储网络架构
graph TD
Net1["Kubernetes 管理网络<br/>(API Server, CSI 通信, Manager 管控)"]
Net2["iSCSI 前端网络<br/>(Pod ↔ Engine iSCSI Target)"]
Net3["Storage 专用网络 (data engine)<br/>(Engine ↔ Replica 数据同步)"]
Net1 --- Net2 --- Net3
配置方式
通过 Setting CRD 配置 Storage Network:
apiVersion: longhorn.io/v1beta2
kind: Setting
metadata:
name: storage-network
value: |
{
"multusNicName": "storage-net",
"ipRanges": ["10.10.0.0/24"],
"excludeSubnets": [],
"nfsOptions": ""
}
实现原理
- Multus CNI 集成:Longhorn 依赖 Multus CNI 为 Instance Manager Pod 分配额外的网络接口。
- Instance Manager 双栈:Instance Manager Pod 拥有管理网络 IP 和存储网络 IP 两个地址。
- Engine/Replica 绑定:Engine 和 Replica 进程启动时绑定到存储网络 IP,内部同步流量走存储网络。
- iSCSI 不变:iSCSI 前端流量仍走默认网络,保证 Pod 连接兼容。
关键参数
| 参数 | 说明 |
|---|---|
storage-network | 启用存储网络,指定 Multus 网络名称或 kube-system 下的默认网络 |
csi.attacher-replica-count | CSI Attacher 副本数 |
disable-revision-counter | 禁用 Revision Counter(存储网络不稳定时可能引发冲突) |
17 Longhorn 的监控与 Prometheus 集成如何配置?
答案:
Longhorn 内置 Prometheus 指标暴露端点,通过 ServiceMonitor 或 PodMonitor 与 Prometheus Operator 集成,提供 Volume、Node、Disk、Engine、Replica 等维度的全方位监控指标。
指标暴露来源
| 组件 | Metrics 端口 | 指标内容 |
|---|---|---|
| Longhorn Manager | 9500 | Volume 状态、Node 状态、备份状态、调度统计 |
| Instance Manager | 8500 | Engine/Replica 进程状态、资源使用 |
| Engine | 无独立端口(通过 Instance Manager) | I/O 吞吐、IOPS、延迟、副本状态 |
关键 Prometheus 指标
| 指标名 | 类型 | 说明 |
|---|---|---|
longhorn_volume_actual_size_bytes | Gauge | Volume 实际占用空间 |
longhorn_volume_capacity_bytes | Gauge | Volume 容量 |
longhorn_volume_read_iops | Counter | 读 IOPS |
longhorn_volume_write_iops | Counter | 写 IOPS |
longhorn_volume_read_latency | Histogram | 读延迟分布 |
longhorn_volume_write_latency | Histogram | 写延迟分布 |
longhorn_volume_robustness | Gauge | Volume 健壮性(Healthy/Degraded/Faulted) |
longhorn_node_status | Gauge | 节点状态 |
longhorn_disk_capacity_bytes | Gauge | 磁盘容量 |
ServiceMonitor 配置
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: longhorn-prometheus-servicemonitor
namespace: longhorn-system
labels:
name: longhorn-prometheus-servicemonitor
spec:
selector:
matchLabels:
app: longhorn-manager
endpoints:
- port: manager
path: /metrics
interval: 30s
Grafana Dashboard
Longhorn 提供预置的 Grafana Dashboard:
- Longhorn Overview:集群级概览(总容量、Volume 数量、节点状态)。
- Longhorn Volume:单 Volume 详细指标(IOPS、延迟、吞吐、副本状态)。
- Longhorn Node:节点级存储资源使用。
告警规则建议
| 告警条件 | 严重级别 |
|---|---|
| Volume 状态为 Degraded 超过 5 分钟 | Warning |
| Volume 状态为 Faulted | Critical |
| 磁盘使用率超过 80% | Warning |
| 磁盘使用率超过 90% | Critical |
| 节点不可用超过 5 分钟 | Warning |
18 Longhorn 的故障恢复机制是怎样的?
答案:
Longhorn 支持多层次的故障恢复机制,核心包括 Replica Rebuild(副本重建)和 Volume Degraded Recovery(卷降级恢复),实现从节点故障、磁盘故障、Replica 数据不一致等场景自动恢复。
Replica Rebuild(副本重建)
当 Replica 因节点宕机、网络故障或磁盘故障变为不可用时,Engine 检测到 Replica 数量低于配置值后触发 Rebuild:
- 故障检测:Engine 定期向所有 Replica 发送心跳,超时未响应标记为 Failed。
- 调度新 Replica:Longhorn Manager Scheduler 选择健康节点,创建新 Replica。
- 数据同步:Engine 从健康 Replica 读取数据块,写入新 Replica。同步过程中新 Replica 状态为 Rebuilding。
- 完成同步:所有数据块同步完成后,新 Replica 转为 Healthy,Volume 恢复正常。
Rebuild 特性
| 特性 | 说明 |
|---|---|
| 在线重建 | Rebuild 期间 Volume 仍可正常读写 |
| 增量同步 | 仅同步快照链差异数据 |
| 多副本建 | 可同时重建多个副本 |
| 自动触发 | 无需人工干预 |
Degraded 状态处理
Volume 处于 Degraded 状态时(至少 1 个 Replica 不健康):
- 读操作:Engine 从健康 Replica 读取。
- 写操作:Engine 仅写入健康 Replica,容忍剩余健康副本数 >= Quorum。
- 自动恢复:Manager 自动调度新的 Replica 启动 Rebuild。
手动恢复场景
| 场景 | 操作 |
|---|---|
| 所有 Replica 丢失但 Volume-Head 可读 | Volume Attachment Recovery Policy |
| Backupstore 中的备份 | Restore from Backup |
| DR Volume | Activate DR Volume |
故障恢复参数
| 参数 | 默认值 | 说明 |
|---|---|---|
replica-replenishment-wait-interval | 600s | Replica 补充等待间隔 |
concurrent-replica-rebuild-per-node-limit | 5 | 每节点并发 Rebuild 数 |
stale-replica-timeout | 30m | 过时 Replica 超时(超时后清理) |
auto-salvage | enabled | 启用 Volume 自动修复 |
19 Longhorn 的节点驱逐与维护操作如何执行?
答案:
Longhorn 提供 Node Drain(节点驱逐)和 Disk Eviction(磁盘驱逐)功能,支持有计划地将存储工作负载从节点或磁盘迁移走,实现节点维护或磁盘退役。
Node Drain 流程
# 1. 标记节点不可调度
kubectl cordon <node-name>
# 2. 设置 Longhorn Node 驱逐
kubectl -n longhorn-system patch node <node-name> \
--type='merge' \
-p '{"spec":{"allowScheduling": false, "evictionRequested": true}}'
- 禁止新调度:
allowScheduling: false禁止新 Replica 调度到此节点。 - 标记驱逐:
evictionRequested: true触发驱逐流程。 - Replica 迁移:Longhorn Manager 为节点上的每个 Replica 在其他节点创建新副本,数据同步完成后删除旧副本。
- Engine 迁移:如果 Engine 在此节点,Manager 自动将 Engine 迁移到其他节点。
- 完成确认:所有 Replica 和 Engine 迁出后,节点可安全维护。
Disk Eviction 流程
kubectl -n longhorn-system edit node <node-name>
# 删除对应 disk 配置或设置 allowScheduling: false
磁盘级别的驱逐:
- 删除 Disk 配置后,Manager 自动将磁盘上的 Replica 迁移到同节点其他磁盘或不同节点。
- 仅影响被驱逐磁盘上的 Replica,同节点其他磁盘不受影响。
Kubernetes Node Drain 集成
Longhorn 支持 Kubernetes 原生的 kubectl drain 命令:
- Longhorn Manager 监听节点
EvictionAPI,自动执行 Replica 迁移。 - 节点上所有 Replica 迁移完成后,Pod 驱逐才继续执行。
维护完成后恢复
kubectl -n longhorn-system patch node <node-name> \
--type='merge' \
-p '{"spec":{"allowScheduling": true, "evictionRequested": false}}'
kubectl uncordon <node-name>
维护操作建议
| 建议 | 说明 |
|---|---|
| 提前检查空间 | 确保其他节点有足够的磁盘空间容纳迁移的 Replica |
| Replica Count | 维护前临时增加到 4 或 5 副本,降低迁移压力 |
| 监控 Rebuild 进度 | 通过 Longhorn UI 或 kubectl get replicas 确认迁移进度 |
| 维护窗口 | 建议在低负载窗口执行,减少 Rebuild 对 I/O 性能的影响 |
20 Longhorn v2 新架构带来了哪些变化?
答案:
Longhorn v2(v1.5.x 开始逐步引入,v1.6.x/v1.7.x 逐步完善)引入了 SPDK(Storage Performance Development Kit)存储引擎和 Instance Manager 重构,在性能和架构上实现了显著飞跃。
v1 vs v2 架构对比
| 维度 | Longhorn v1 | Longhorn v2 |
|---|---|---|
| 存储引擎 | Linux Kernel(tgt/LIO iSCSI) | SPDK(用户态 NVMe-oF 和 iSCSI) |
| I/O 路径 | 内核态 iSCSI → Engine → Replica | 用户态 SPDK 直通 |
| 性能 | ~50K IOPS(单卷) | ~200K+ IOPS(单卷) |
| 延迟 | ~200-500us | ~50-100us |
| Instance Manager | 每个节点 e/r 两个 Pod | 统一 SPDK Instance Manager |
| 数据保护 | 仅副本冗余 | 副本冗余 + SPDK RAID/EC |
SPDK 存储引擎
SPDK 是 Intel 开源的用户态高性能存储开发套件,核心优势:
- 用户态 I/O:绕过 Linux 内核 I/O 栈,使用用户态轮询驱动(UIO/VFIO),消除内核上下文切换开销。
- NVMe-oF:支持 NVMe over Fabrics(NVMe-oF/TCP),替代 iSCSI 协议,提供更高带宽和更低延迟。
- 无锁设计:基于线程本地存储和无锁数据结构,最大化 CPU 亲和性。
Instance Manager v2 重构
- 统一进程模型:不再区分 Engine Instance Manager 和 Replica Instance Manager,统一为一个 SPDK Application。
- 内存管理优化:使用 HugePages(大页内存)减少 TLB miss。
- CPU 亲和性:可将 Engine/Replica 绑定到特定 CPU 核心。
升级路径
Longhorn 设计为 v1 和 v2 共存:
- 已有 v1 Volume 继续使用 v1 Engine。
- 新建 Volume 可选择 v2 Data Engine。
- 支持在线将 Volume 从 v1 Engine 迁移到 v2 Engine。
v2 Data Engine 配置
apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
name: spdk-volume
spec:
dataEngine: "v2" # 指定使用 v2 引擎
numberOfReplicas: 3
backendStoreDriver: "v2"
21 Longhorn 的性能优化有哪些关键策略?
答案:
Longhorn 的性能优化涉及副本配置、数据本地性、存储网络隔离、底层磁盘选择和内核参数调优等多个维度。
Replica Count 策略
| Replica 数量 | 写性能影响 | 读性能影响 | 建议场景 |
|---|---|---|---|
| 1 | 最佳(无同步开销) | 最佳 | 开发/测试、可容忍数据丢失 |
| 2 | 中等 | 不受影响 | 需要冗余但预算有限 |
| 3 | 标准 | 不受影响 | 生产环境推荐 |
- 每次写入需要等待 Quorum 数量 Replica 确认,Replica 越多写入延迟越高。
- 读取只需 1 个 Replica 响应,Replica 数量不影响读性能。
Data Locality 优化
| Data Locality 模式 | 性能特征 | 适用场景 |
|---|---|---|
disabled | 默认行为,Engine 与 Pod 可能不同节点 | 通用场景 |
best-effort | 减少 iSCSI 跨节点跳转延迟(~0.1-0.3ms) | 延迟敏感应用 |
strict-local | 零网络延迟(本地 I/O) | 极致性能要求 |
Storage Network 隔离
启用 Storage Network 后,Engine 和 Replica 之间的同步流量走专用网络接口:
- 消除存储流量对应用网络带宽的争抢。
- 建议使用 10Gbps 或更高带宽的专用网卡。
- 配合 Jumbo Frame(MTU 9000)进一步提升吞吐。
磁盘和文件系统选择
| 因素 | 建议 |
|---|---|
| 磁盘类型 | NVMe SSD > SATA SSD > HDD |
| 文件系统 | ext4(通用)/ xfs(高并发写) |
| 挂载选项 | noatime,nodiratime 减少元数据写入 |
| 磁盘队列深度 | 适当增大 /sys/block/<dev>/queue/nr_requests |
内核参数调优
# I/O Scheduler 设置为 none(NVMe)或 noop
echo none > /sys/block/nvme0n1/queue/scheduler
# 增大内核网络缓冲区
sysctl -w net.core.rmem_max=134217728
sysctl -w net.core.wmem_max=134217728
# 增大 TCP 缓冲区(影响 iSCSI 和 Replica 同步)
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"
性能测试参考数据
| 配置 | 随机读 IOPS | 随机写 IOPS | 延迟 (avg) |
|---|---|---|---|
| 1 Replica, local NVMe | ~80K | ~50K | ~150us |
| 3 Replica, 10GbE | ~80K | ~30K | ~250us |
| 3 Replica, 1GbE | ~78K | ~15K | ~500us |
22 Longhorn 的 Helm 安装与核心配置参数有哪些?
答案:
Longhorn 通过 Helm Chart 部署在 longhorn-system 命名空间下,安装过程包括 CRD 注册、Manager / Instance Manager / CSI Driver 等组件部署以及 StorageClass 创建。
安装命令
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set defaultSettings.defaultDataPath="/var/lib/longhorn" \
--set defaultSettings.backupTarget="s3://mybucket@us-east-1/"
核心配置参数
| 参数 | 默认值 | 说明 |
|---|---|---|
defaultSettings.defaultDataPath | /var/lib/longhorn | Replica 数据存储路径 |
defaultSettings.backupTarget | (空) | 默认备份目标(S3/NFS URL) |
defaultSettings.backupTargetCredentialSecret | (空) | 备份目标凭据 Secret |
defaultSettings.createDefaultDiskLabeledNodes | true | 自动为添加标签的节点创建默认磁盘 |
defaultSettings.defaultDataLocality | disabled | 默认数据本地性策略 |
defaultSettings.defaultReplicaCount | 3 | 默认副本数量 |
defaultSettings.replicaAutoBalance | disabled | 副本自动均衡策略 |
defaultSettings.storageOverProvisioningPercentage | 200 | 存储超配百分比 |
defaultSettings.storageMinimalAvailablePercentage | 10 | 最小可用空间百分比 |
defaultSettings.upgradeChecker | true | 自动检查升级 |
defaultSettings.autoSalvage | true | 自动修复故障 Volume |
defaultSettings.disableSchedulingOnCordonedNode | true | cordon 节点禁用调度 |
defaultSettings.replicaSoftAntiAffinity | false | 软反亲和性 |
defaultSettings.taintToleration | (空) | 节点容忍设置 |
defaultSettings.guaranteedInstanceManagerCPU | 12 | Instance Manager 保证 CPU(百分比,100=1 核) |
persistence.defaultClass | true | 设置为默认 StorageClass |
persistence.defaultFsType | ext4 | 默认文件系统类型 |
ingress.enabled | false | 启用 Ingress 暴露 Longhorn UI |
安装前置条件
| 条件 | 要求 |
|---|---|
| Kubernetes 版本 | >= 1.21 |
| open-iscsi | 所有节点安装 open-iscsi 包 |
| NFSv4 Client(RWX) | 所有节点安装 nfs-common/nfs-utils |
| Multus CNI(Storage Network) | 可选,用于存储网络隔离 |
| 节点磁盘 | 每个节点至少预留 50Gi 空间 |
安装后验证
# 检查所有 Pod 运行状态
kubectl -n longhorn-system get pods
# 访问 Longhorn UI
kubectl -n longhorn-system port-forward svc/longhorn-frontend 8080:80
# 确认 StorageClass
kubectl get storageclass longhorn
23 Longhorn 的升级策略是怎样的?
答案:
Longhorn 支持在线滚动升级(Live Upgrade),升级过程不中断 Volume I/O。升级引擎(Engine)和 Manager 分别独立执行,版本兼容性由 Longhorn 内部版本协议保证。
升级顺序
graph TD
S1["1. Longhorn Manager(DaemonSet)"]
S2["2. Longhorn CRD 版本迁移"]
S3["3. Longhorn Instance Manager(v1)/ SPDK Instance Manager(v2)"]
S4["4. Longhorn Engine(每个 Volume 独立升级)"]
S5["5. Longhorn CSI Driver(Deployment + DaemonSet)"]
S6["6. Longhorn UI"]
S1 --> S2
S2 --> S3
S3 --> S4
S4 --> S5
S5 --> S6
Engine 在线升级流程
- Manager 升级完成:新版本 Manager 运行后,检测到 Engine 版本低于目标版本。
- 创建新 Engine:Manager 自动创建新版本 Engine 进程(使用新二进制)。
- 切换连接:新 Engine 连接所有 Replica,通过快照链校验一致性。
- iSCSI 切换:iSCSI Target 从旧 Engine 切换到新 Engine。切换过程短暂 I/O 阻塞(毫秒级),应用层可感知为短暂磁盘延迟波动。
- 清理旧 Engine:确认新 Engine 正常工作后,删除旧 Engine 进程。
升级关键参数
| 参数 | 默认值 | 说明 |
|---|---|---|
concurrent-automatic-engine-upgrade | 1 | 并发 Engine 升级数 |
upgrade-checker | enabled | 启用自动升级版本检查 |
auto-upgrade-engine | enabled | 升级 Manager 后自动升级 Engine |
升级注意事项
| 注意点 | 说明 |
|---|---|
| 版本跳级 | 不建议跳过多个大版本升级(如 v1.4.x → v1.7.x),应逐个大版本升级 |
| 备份先行 | 升级前必须对所有关键 Volume 执行完整备份 |
| 低谷窗口 | 在低 I/O 负载窗口执行升级,减少切换抖动 |
| 单节点升级 | Manager 作为 DaemonSet 逐个节点升级,已管理节点不影响运行引擎 |
| CRD 版本 | 新版本可能引入新 API 版本,需提前确认 CRD 兼容性 |
Helm 升级命令
helm repo update
helm upgrade longhorn longhorn/longhorn \
--namespace longhorn-system \
--version <target-version> \
--reuse-values
24 Longhorn 与 Ceph RBD 对比有哪些差异?
答案:
Longhorn 和 Ceph RBD 均为 Kubernetes 生态中的分布式块存储方案,但在架构复杂度、运维门槛、性能特征和应用场景上有显著差异。
核心对比
| 维度 | Longhorn | Ceph RBD |
|---|---|---|
| 架构模型 | 每个 Volume 一个 Engine 进程(微控制器模型) | 集中式 MON + OSD 守护进程 |
| 安装复杂度 | Helm 一键部署,5 分钟内可用 | 需要精心规划 OSD/OSD 盘布局,安装复杂 |
| 资源开销 | 轻量,每个 Engine ~100MB RAM | 较重,每 OSD 需要 ~4GB RAM |
| 最小规模 | 3 节点 | 3 节点(生产环境建议 5+ 节点) |
| 数据分布 | Replica 基于快照链的 Sparse File | CRUSH 算法伪随机分布 |
| 副本机制 | 固定副本数(每个 Volume N 个 Replica) | Pool 级 Replication 或 Erasure Coding |
| 快照 | 链式快照,即时创建,需 Purge | RBD Snapshot,支持分层 Clone |
| 备份 | 原生支持 S3/NFS 备份 | RBD Mirror(块级别异地同步)或 RBD Export |
| 性能 | 中等(v1 ~50K IOPS),v2 SPDK 大幅提升 | 高性能(~100K+ IOPS 单卷) |
| 多集群 | DR Volume + Backupstore | RBD Mirror(异步/同步) |
| UI | 内置 Web UI | Ceph Dashboard(功能有限) |
| 社区背景 | CNCF Sandbox,由 SUSE/Rancher 主导 | Ceph Foundation(Linux Foundation),Red Hat 主导 |
| 适用规模 | 中小规模集群(< 50 节点) | 大规模集群(50-2000+ 节点) |
选型建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 小规模、轻运维 | Longhorn | 安装简单、UI 直观、学习曲线低 |
| 大规模、高性能 | Ceph RBD | 成熟稳定、社区大、CRUSH 算法数据分布优 |
| 多云/混合云 | Longhorn | 轻量、对基础设施要求低 |
| 深度定制 | Ceph RBD | CRUSH Map 精细控制、EC 策略灵活 |
| DevOps 团队 | Longhorn | Kubernetes 原生、YAML 驱动、开箱即用 |
25 Longhorn 与 OpenEBS 对比有哪些差异?
答案:
Longhorn 与 OpenEBS 同为 CNCF 项目中的容器原生存储(Container Native Storage,CNS)方案,均以轻量、Kubernetes 原生为设计目标,但在存储引擎、快照机制和运维模型上存在差异。
核心对比
| 维度 | Longhorn | OpenEBS (cStor / Jiva / Mayastor) |
|---|---|---|
| 存储引擎 | Longhorn Engine(iSCSI),v2 引入 SPDK | Jiva(iSCSI)、cStor(基于 ZFS)、Mayastor(NVMe-oF/SPDK) |
| 副本机制 | Chain Snapshot + Sparse File | Jiva:Sparse File 同步;cStor:ZFS send/recv;Mayastor:SPDK Nexus |
| 快照 | 原生链式快照 | Jiva:依赖 DM-Snapshot;cStor:ZFS Snapshot |
| 备份 | 原生 S3/NFS 备份 | 通过 Velero 或 Restic 间接备份 |
| 副本数量 | 1-5 | Jiva:1-5;cStor:1-5;Mayastor:可配置 |
| 性能 | v1:中等;v2(SPDK):高 | Jiva:低;cStor:中;Mayastor:极高 |
| 安装 | Helm 一键安装 | 多种引擎可选,安装复杂度各异 |
| 运维工具 | Web UI + CLI(kubectl) | kubectl + openebsctl |
| CNCF 成熟度 | Sandbox | Sandbox |
| 适用场景 | 通用 Kubernetes 存储 | 不同引擎适配不同场景(本地盘 / ZFS / NVMe 高性能) |
引擎选型对比
| 特性 | Longhorn v1 | OpenEBS Jiva | OpenEBS cStor | OpenEBS Mayastor |
|---|---|---|---|---|
| 存储协议 | iSCSI | iSCSI | iSCSI | NVMe-oF |
| 底层存储 | Sparse File | Sparse File | ZFS ZVOL | SPDK Blobstore |
| 数据完整性 | 无校验 | 无校验 | ZFS Checksum | 计划中 |
| 压缩/去重 | 不支持 | 不支持 | ZFS 原生 | 不支持 |
| 资源开销 | 低 | 低 | 中 | 高 |
选型建议
| 场景 | 推荐方案 |
|---|---|
| 快速上手、统一方案 | Longhorn |
| 需要 ZFS 的数据完整性/压缩 | OpenEBS cStor |
| 极致 NVMe 性能 | OpenEBS Mayastor |
| 需要原生备份功能 | Longhorn |
| 轻量本地存储(单副本) | OpenEBS Local PV |
26 Longhorn 与 Rook Ceph 对比有哪些差异?
答案:
Longhorn 和 Rook Ceph 两种对比实质上是"轻量容器原生存储 vs. Kubernetes Operator 管理的传统分布式存储"的对比。Rook 是 Ceph 的 Kubernetes Operator,让 Ceph 以云原生方式在 Kubernetes 中运行。
核心对比
| 维度 | Longhorn | Rook Ceph |
|---|---|---|
| 本质 | 原生 Kubernetes 块存储 | Kubernetes Operator + Ceph 集群 |
| 架构复杂度 | 低(5 个组件) | 高(MON/OSD/MDS/RGW + Operator) |
| 最小部署 | 3 节点 | 3 节点 |
| 资源需求 | 低(Manager ~500MB,Engine ~100MB/Volume) | 高(MON ~1GB,OSD ~4GB/磁盘) |
| 存储类型 | 仅块存储(+ NFS RWX) | 块存储(RBD)+ 文件存储(CephFS)+ 对象存储(RGW) |
| 性能 | 中等(v1)/ 高(v2 SPDK) | 高(CRUSH 并行 I/O) |
| 快照/克隆 | 链式快照 + 即时克隆 | RBD Snapshot + Layered Clone |
| EC(纠删码) | 不支持 | 支持 EC Pool(节省 ~50% 存储空间) |
| 数据完整性 | 无内部 Checksum | Ceph 内部 Checksum(Scrub) |
| 备份 | 原生的 S3/NFS 备份 | RBD Mirror + RGW Multi-site |
| 升级体验 | 简单(Helm upgrade) | 复杂(需同步升级 Operator + Ceph 版本) |
| 社区 | CNCF Sandbox,SUSE 主导 | CNCF Graduated,Red Hat/IBM 主导 |
| 学习曲线 | 低 | 高(需要 Ceph 专业知识) |
| 生产成熟度 | 中小规模成熟 | 大规模成熟 |
存储类型覆盖
| 存储需求 | Longhorn | Rook Ceph |
|---|---|---|
| 块存储(RWO) | 支持 | 支持(RBD) |
| 共享文件存储(RWX) | 支持(NFS Ganesha) | 支持(CephFS) |
| 对象存储(S3) | 不支持 | 支持(RGW) |
选型建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 纯块存储需求 | Longhorn | 更简单、资源开销更低 |
| 需要块 + 文件 + 对象多种存储 | Rook Ceph | 一套集群满足多种存储需求 |
| 大规模生产环境(100+ 节点) | Rook Ceph | CRUSH 数据分布、EC 编码、内部完整性校验 |
| DevOps 团队、快速迭代 | Longhorn | 开箱即用、运维极简、UI 友好 |
| 存储空间敏感 | Rook Ceph | 支持 Erasure Coding 节省存储空间 |
27 Longhorn 如何实现多租户与项目隔离?
答案:
Longhorn 通过 Kubernetes 命名空间隔离、RBAC 权限控制、Backup Target 租户隔离和 Longhorn UI 多命名空间支持,实现多租户环境下的存储资源隔离。
隔离维度
| 维度 | 实现方式 |
|---|---|
| 命名空间隔离 | Volume 创建在 PVC 所在命名空间的 Volume CRD |
| RBAC 权限 | Kubernetes RBAC 限制用户对 Volume CRD 的操作 |
| 备份目标隔离 | 不同租户配置不同 Backup Target |
| 磁盘/节点标签 | 通过 Node/Disk Selector 实现物理隔离 |
| Longhorn UI | 通过 --namespace 限制 UI 可管理的命名空间范围 |
物理存储隔离
通过 Node/Disk 标签将不同租户的 Volume 调度到不同物理存储:
# 租户 A 的 PVC 只使用 tenant-a 标签的磁盘
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tenant-a-data
spec:
storageClassName: longhorn-tenant-a
resources:
requests:
storage: 10Gi
# 对应 StorageClass 配置 Disk Selector
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-tenant-a
provisioner: driver.longhorn.io
parameters:
numberOfReplicas: "3"
diskSelector: "tenant-a"
备份目标隔离
每个租户配置独立的 Backup Target,数据物理隔离:
# 租户 A 的备份目标
apiVersion: longhorn.io/v1beta2
kind: Setting
metadata:
name: backup-target
value: "s3://tenant-a-backup@region/"
# 租户 A 的凭据
apiVersion: v1
kind: Secret
metadata:
name: tenant-a-backup-secret
namespace: tenant-a
data:
AWS_ACCESS_KEY_ID: <base64>
AWS_SECRET_ACCESS_KEY: <base64>
RBAC 权限模型
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: longhorn-tenant-a
namespace: tenant-a
rules:
- apiGroups: ["longhorn.io"]
resources: ["volumes", "engines", "replicas"]
verbs: ["get", "list", "create", "delete"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: longhorn-tenant-a-binding
namespace: tenant-a
subjects:
- kind: Group
name: tenant-a-users
roleRef:
kind: Role
name: longhorn-tenant-a
apiGroup: rbac.authorization.k8s.io
限制说明
| 限制 | 说明 |
|---|---|
| 无内置 Quota | Longhorn 不提供内置存储 Quota 机制,需依赖 Kubernetes ResourceQuota |
| 单 Backup Target | 全局仅支持一个 Backup Target Setting(多租户需通过命名空间粒度拆分 PVC) |
| 无网络加密 | 副本间同步不实现应用层加密,敏感环境建议配合 WireGuard 或 IPsec |
28 Longhorn 的备份加密如何配置?
答案:
Longhorn 支持对备份数据进行 AES-256-GCM 加密,加密在 Engine 层执行,备份存储中保存的为密文数据块,解密密钥通过 Kubernetes Secret 管理。
加密工作流程
- 创建加密密钥 Secret:配置
CRYPTO_KEY_VALUE为加密密钥。 - 配置 Backup Target Credential:在 Backup Target Secret 中引用加密密钥。
- Engine 加密:执行 Backup 时,Engine 使用密钥对每个 2MB 数据块进行 AES-256-GCM 加密,生成密文块上传。
- Engine 解密:执行 Restore 时,Engine 使用同一密钥解密数据块,还原为明文后写入 Replica。
加密密钥 Secret 配置
apiVersion: v1
kind: Secret
metadata:
name: backup-secret
namespace: longhorn-system
data:
AWS_ACCESS_KEY_ID: <base64-encoded>
AWS_SECRET_ACCESS_KEY: <base64-encoded>
# 以下为加密专用字段
CRYPTO_KEY_VALUE: <base64-encoded-encryption-key> # 加密密钥(32 字节 Base64 编码)
CRYPTO_KEY_PROVIDER: "secret" # 密钥来源(当前仅支持 "secret")
CRYPTO_KEY_CIPHER: "AES-256-GCM" # 加密算法(当前仅支持 AES-256-GCM)
加密密钥生成
# 生成 32 字节随机密钥
openssl rand -base64 32
# 或使用 hex 密钥
openssl rand -hex 32
Backup Target 配置
apiVersion: longhorn.io/v1beta2
kind: Setting
metadata:
name: backup-target
value: "s3://my-secure-bucket@us-east-1/"
apiVersion: longhorn.io/v1beta2
kind: Setting
metadata:
name: backup-target-credential-secret
value: "backup-secret"
加密特性
| 特性 | 说明 |
|---|---|
| 加密位置 | Engine 进程(数据路径) |
| 加密算法 | AES-256-GCM(认证加密,防篡改) |
| 加密粒度 | 每个 2MB 数据块独立加密 |
| 密钥管理 | Kubernetes Secret(静态存储,需配合 etcd 加密) |
| 恢复要求 | 恢复时必须提供相同的加密密钥 |
| 性能开销 | 加密/解密增加 CPU 开销,约 5-15% 性能影响 |
密钥安全建议
| 建议 | 说明 |
|---|---|
| etcd 加密 | 启用 Kubernetes etcd Encryption at Rest 保护 Secret |
| 密钥轮换 | 定期更换加密密钥,新备份使用新密钥 |
| 旧密钥保留 | 保留历史密钥以恢复旧备份 |
| 密钥备份 | 密钥本身需安全备份,密钥丢失则备份数据不可恢复 |
29 Longhorn 常见故障如何排查?
答案:
Longhorn 故障排查遵循组件分层原则,从 Volume 状态到 Engine、Replica、Instance Manager、Node 逐层下钻定位根因。
常见故障速查表
| 症状 | 可能原因 | 排查命令 |
|---|---|---|
| Volume 卡在 Attaching | iSCSI 连接失败、Engine 未启动 | kubectl describe volume <vol>;检查 iscsiadm |
| Volume 状态 Degraded | 节点宕机、Replica 失联、磁盘空间不足 | kubectl get replicas -l longhornvolume=<vol> |
| 备份失败 | Backup Target 不可达、凭证错误 | kubectl describe backup <name> |
| 性能骤降 | Replica Rebuilding、磁盘 I/O 瓶颈、网络拥塞 | Longhorn UI → Volume Metrics |
| PVC Pending | StorageClass 不存在、无可用磁盘空间 | kubectl describe pvc <name> |
| Replica Rebuild 缓慢 | 网络带宽不足、并发 Rebuild 过多 | 查看 concurrent-replica-rebuild-per-node-limit |
| RWX Volume 不可用 | Share Manager Pod 崩溃、NFS 端口不通 | kubectl logs -l longhorn.io/component=share-manager |
标准排查流程
步骤 1:检查整体集群状态
kubectl -n longhorn-system get nodes.longhorn.io
kubectl -n longhorn-system get volumes.longhorn.io
kubectl -n longhorn-system get pods
步骤 2:检查故障 Volume 详情
# 查看 Volume 状态和关联资源
kubectl -n longhorn-system describe volume <volume-name>
# 查看 Replica 分布和状态
kubectl -n longhorn-system get replicas -l longhornvolume=<volume-name> -o wide
步骤 3:检查 Engine 日志
# 获取 Engine Instance Manager Pod
ENGINE_IM=$(kubectl -n longhorn-system get pod \
-l longhorn.io/instance-manager-type=engine \
-o jsonpath='{.items[0].metadata.name}')
# 查看 Engine 进程日志
kubectl -n longhorn-system logs $ENGINE_IM --tail=200
步骤 4:检查 iSCSI 连接状态
# 在 Pod 所在节点执行
iscsiadm -m session
lsblk | grep longhorn
常见问题修复
| 问题 | 修复操作 |
|---|---|
| Replica 卡在 Rebuilding | 删除失败 Replica,触发 Manager 自动重建 |
| Engine 崩溃不恢复 | 检查 Instance Manager 日志,必要时删除 Engine CRD 触发重建 |
| 磁盘空间不足 | 清理过期快照(Recurring Job snapshot-cleanup)或扩容磁盘 |
| iSCSI 登录持续重试 | 检查各节点 open-iscsi 服务状态:systemctl status iscsid |
| Manager 日志报 CrashLoopBackOff | 检查 etcd 连接、CRD 版本兼容性 |
| 备份卡在 InProgress | 检查 Backup Target 连通性、Secret 有效性 |
日志收集命令
# 收集 Longhorn 全部组件日志
kubectl -n longhorn-system logs -l app=longhorn-manager --tail=500 > manager.log
kubectl -n longhorn-system logs -l longhorn.io/component=instance-manager --tail=500 > instance-manager.log
kubectl -n longhorn-system logs -l longhorn.io/component=csi-plugin --tail=500 > csi.log
# 收集 Support Bundle(推荐)
kubectl -n longhorn-system exec -it deploy/longhorn-driver-deployer -- \
longhornctl install-manager \
&& longhornctl export-support-bundle --output support-bundle.zip
30 Longhorn 生产环境最佳实践有哪些?
答案:
部署规划
| 实践项 | 具体要求 |
|---|---|
| 节点数量 | 最少 3 个 Worker 节点,建议 4+ 节点便于滚动升级和维护 |
| 专用存储盘 | 为 Longhorn 分配独立磁盘/分区,使用 defaultDataPath 指定路径 |
| 磁盘类型 | 生产环境使用 SSD/NVMe,数据保留策略按冷热数据分层 |
| 网络要求 | 节点间 10Gbps 网络(至少 1Gbps),建议启用 Storage Network 隔离 |
| 操作系统 | 推荐 Ubuntu 20.04+、RHEL/CentOS 8+、SLE Micro / openSUSE |
| open-iscsi | 所有节点安装并启用 iscsid 服务 |
副本配置
| 配置项 | 生产建议值 | 原因 |
|---|---|---|
defaultReplicaCount | 3 | 容忍 1 个副本故障 |
replicaAutoBalance | best-effort 或 least-effort | 自动均衡负载 |
dataLocality | disabled(默认)或 best-effort | 平衡性能与高可用 |
replicaSoftAntiAffinity | false | 防止同节点故障导致多副本丢失 |
staleReplicaTimeout | 30-60 分钟 | 给故障恢复留足够时间 |
备份策略
| 配置项 | 建议值 | 说明 |
|---|---|---|
backupTarget | S3 Compatible(MinIO/AWS S3)或 NFS | 与集群物理隔离的 Backupstore |
backupTargetCredentialSecret | 配置凭据 Secret | 使用 IAM Role 或 Access Key |
| 定时备份 Job | 每日增量 + 每周全量 | 通过 Recurring Job 配置 |
| 保留策略 | 7 天每日 + 4 周每周 | 平衡恢复窗口与存储成本 |
| 备份加密 | 启用 CRYPTO_KEY_VALUE | 保护备份数据安全 |
性能调优
| 配置项 | 建议值 | 说明 |
|---|---|---|
guaranteedInstanceManagerCPU | 25(2.5 核) | 保证 Instance Manager 有足够 CPU |
| 磁盘挂载选项 | noatime,nodiratime | 减少元数据写入开销 |
| I/O Scheduler(NVMe) | none | 避免内核 I/O 调度开销 |
| I/O Scheduler(SSD) | mq-deadline | 低延迟调度 |
| Storage Network | 启用(需 10Gbps 网卡) | 隔离存储流量 |
| Data Engine v2(SPDK) | 对延迟敏感应用启用 | 显著降低延迟和提升 IOPS |
安全配置
| 配置项 | 建议 |
|---|---|
| Longhorn UI | 启用 Ingress + TLS + 认证(Auth Proxy 或 OIDC) |
| Backup 加密 | 必须启用 AES-256-GCM 备份加密 |
| etcd 加密 | 启用 Kubernetes Encryption at Rest 保护 Secret |
| RBAC | 严格限制 Longhorn CRD 的操作权限按命名空间隔离 |
| 网络策略 | 限制 iSCSI 端口 3260 和 Engine/Replica 通信端口的网络访问 |
监控与告警
| 监控项 | 告警阈值 | 说明 |
|---|---|---|
| Volume Degraded | > 5 分钟 | Volume 降级运行 |
| Volume Faulted | 立即告警 | 数据不可用 |
| 磁盘使用率 | > 80% Warning / > 90% Critical | 磁盘空间不足 |
| 备份失败 | 立即告警 | 备份失败影响 RPO |
| Replica Rebuilding | 持续监控 | Rebuild 影响性能 |
| Manager/DaemonSet 异常 | 立即告警 | 控制面故障 |
升级与维护
| 实践项 | 具体措施 |
|---|---|
| 升级前备份 | 所有关键 Volume 执行完整 Backup |
| 灰度升级 | 先在非生产集群验证,再生产集群执行 |
| 版本跟随 | 生产环境跟随最新稳定版(不落后超过 2 个 Minor 版本) |
| 维护窗口 | 节点维护前先执行 Node Drain + Disk Eviction |
| 变更记录 | 记录每次配置变更和升级操作 |
容量规划
| 维度 | 建议 |
|---|---|
storageOverProvisioningPercentage | 200%(允许 2 倍超配),监控实际使用率及时扩容 |
storageMinimalAvailablePercentage | 10-15%(保留警戒空间) |
| 单 Volume 大小上限 | 建议不超过 10TiB |
| 单节点 Replica 数量上限 | 建议不超过 50 个 Replica |
| 备份存储容量 | 预留集群存储容量的 150% 以上的备份空间 |
灾难恢复演练
| 演练项 | 频率 | 说明 |
|---|---|---|
| 单 Volume 恢复 | 每月 | 从最新 Backup 恢复随机 Volume |
| 全集群恢复 | 每季度 | 模拟全集群故障,从 Backupstore 恢复 |
| DR Volume 激活 | 每季度 | 在灾备集群激活 DR Volume 验证数据完整性 |
| 备份完整性校验 | 每月 | 恢复备份并执行文件系统 fsck |