跳转到内容

Longhorn 分布式块存储

30 道题
分类
存储
题目数
30 道
已阅读 0 / 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 / DetachCSI 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 卷挂载生命周期。

写入路径细节

  1. 应用向 /dev/longhorn/pvc-xxx 写入数据。
  2. iSCSI Initiator 将写请求封装为 iSCSI PDU,通过 TCP 发送给 Engine 的 iSCSI Target。
  3. Engine 收到写入后,将数据写入自身的 Frontend I/O buffer,然后并行向所有健康 Replica 发送写入请求。
  4. 根据 Write Tolerance 策略(默认 Quorum),Engine 等待足够数量 Replica 确认后返回写入成功。
  5. Replica 将数据写入本地 Sparse File(链式快照结构),并更新 Metadata。

读取路径细节

  1. 应用从块设备读取数据。
  2. iSCSI Initiator 将读请求转发给 Engine。
  3. Engine 从任意一个健康的 Replica 读取(默认轮询),直接返回,无 Quorum 判断。
3 Longhorn 的 Replica 副本机制与 Quorum 是如何工作的?

答案:

Longhorn 采用多副本同步写入机制,通过 Quorum(法定人数) 保证数据一致性和可用性。每个 Volume 可配置多个 Replica(默认 3),Engine 负责在写入时将数据同步分发给所有 Replica。

副本数量与容错能力

Replica 数量容忍故障数写入 Quorum(默认)最小健康副本
1011
2022
3122
4122
5233

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 故障转移流程

  1. 故障检测:Longhorn Manager 监测 Engine 进程状态,节点宕机或 Engine 崩溃后,Manager 在设定的超时(默认 10s)内确认 Engine 不可用。
  2. 选择新节点:Scheduler 根据 Replica 分布选择最佳节点启动新 Engine。优先选择已有健康 Replica 的节点以减少网络跳数。
  3. 启动新 Engine:通过 Instance Manager 在新节点上启动 Engine 进程,Engine 重新连接所有健康 Replica。
  4. iSCSI 重连:CSI Node Plugin 通过 iSCSI 重新连接新 Engine,应用 I/O 恢复(短暂阻塞后恢复)。

Engine 高可用的关键参数

参数默认值说明
engine-start-timeout180sEngine 启动超时
timeout-between-replica-data-retrieval2sEngine 连接 Replica 超时
auto-salvageenabled启用自动故障恢复
concurrent-automatic-engine-upgrade1并发 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

链式快照工作原理

  1. 初始状态:Volume 创建时生成一个空的 Volume-Head 文件,所有写入进入此文件。
  2. 创建快照:创建 Snapshot 时,当前 Volume-Head 被冻结并转化为快照文件(如 volume-snap-001.img),同时新建一个空的 Volume-Head 承接后续写入。
  3. 继续写入:新的写入进入新的 Volume-Head。旧快照文件中的块如果被修改,新数据写入 Volume-Head 而不修改快照文件(CoW 语义)。
  4. 读取数据:读取时从 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 CompatibleAWS S3、MinIO、Ceph RGWs3://bucket@region/
NFSNFSv4 服务器nfs://server:/path/
CIFSWindows 共享cifs://server/share/
Azure Blob StorageAzure Storage Accountazblob://container/

Backup 工作流程

  1. 创建 Snapshot:用户或 Recurring Job 创建 Volume Snapshot。
  2. 创建 Backup CRD:Longhorn Manager 创建 Backup CR 对象。
  3. Engine 执行备份:Engine 读取指定 Snapshot 的数据块(跨所有 Replica 的 Snapshot Chain 差异数据)。
  4. 去重与压缩:Engine 将数据块(默认 2MB block size)去重后压缩,上传至 Backupstore。
  5. 更新元数据:备份完成后,将 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 工作原理

  1. 在主集群:创建 Backup(Snapshot → Backup),数据存储到共享的 Backupstore(如 S3/MinIO)。
  2. 在灾备集群:创建 DR Volume,指向同一 Backupstore 和 Backup 记录。
  3. 增量同步:DR Volume 持续从 Backupstore 拉取最新的增量备份数据,保持快照链与主集群同步。
  4. 故障切换:主集群不可用时,执行 Activate 操作将 DR Volume 转为正常 Volume,创建 Engine 和 Replica,挂载到 Pod。

DR Volume 状态机

状态含义
StandbyDR Volume 持续同步中,不可挂载
Activating正在激活为正常 Volume
Active已激活,可正常读写
Inactive未创建或已删除

激活过程

  1. Manager 停止增量同步。
  2. 从最新的 Backup 创建 Replica。
  3. 创建 Engine 并关联 Replica。
  4. 挂载 Volume 到请求的 Pod。
  5. 应用数据恢复到最新备份点。

关键限制

  • 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 ControllerDeployment(1 Replica)Provision / Delete Volume、Create / Delete Snapshot、Volume 扩容
CSI Node PluginDaemonSetNodeStage / 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/&lt;volume-name&gt;"]

    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-enginelonghorn-replica 容器直接管理。该方式存在以下问题:

  • Manager Pod 重启会级联重启所有 Engine 和 Replica 进程。
  • Manager 升级期间 Engine 进程受影响。
  • 进程管理职责与编排逻辑耦合。

Instance Manager 的两个实例

每个节点运行两种 Instance Manager:

类型管理的进程Pod 标签
Instance Manager Engine(instance-manager-e-xxxEngine 进程longhorn.io/instance-manager-type: engine
Instance Manager Replica(instance-manager-r-xxxReplica 进程longhorn.io/instance-manager-type: replica

进程生命周期管理

  1. 进程创建:Longhorn Manager 通过 gRPC 调用 Instance Manager 的 ProcessCreate 接口,传入进程二进制路径和参数。Instance Manager fork 子进程。
  2. 健康检查:Instance Manager 定期对子进程进行 gRPC 健康探测(ProcessGet 接口),并将状态上报给 Longhorn Manager。
  3. 进程重启:子进程崩溃后,Instance Manager 可配置自动重启策略,重启失败则上报异常状态。
  4. 进程删除: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 选择位置时考虑以下因素:

  1. Disk 空间充足:排除空间不足(考虑 storageReserved 和 storageMaximum)的磁盘。
  2. Disk 标签匹配:匹配 Volume 的 Disk Selector 标签。
  3. Node 标签匹配:匹配 Volume 的 Node Selector 标签。
  4. 反亲和性:同一 Volume 的多个 Replica 默认不调度到同一节点。
  5. 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-AffinityReplicaSoftAntiAffinitydisabled允许在同节点放置多个 Replica
Data LocalityDataLocalitydisabledReplica 尽量与 Engine 在同一节点
Auto BalanceReplicaAutoBalancedisabled自动平衡各节点的 Replica 数量

Replica Auto Balance 三种模式

模式行为
disabled不自动平衡
least-effort仅在创建新 Volume 或添加新节点时尝试平衡,不迁移已有 Replica
best-effort定期检查 Replica 分布,必要时迁移 Replica 以达到平衡

Data Locality 数据本地性

模式行为
disabledReplica 不考虑 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 块设备层和文件系统层。

扩容流程

  1. 修改 PVC Spec:用户或控制器修改 PVC 的 spec.resources.requests.storage 增大容量。
  2. CSI Controller 响应:external-resizer 检测到 PVC 变更,调用 CSI Controller 的 ControllerExpandVolume
  3. Longhorn Manager 扩容 Volume:Manager 更新 Volume CRD 的 spec.size,并通知 Engine 进程调整块设备大小。
  4. Engine 更新 iSCSI Target:Engine 更新 iSCSI Target 的 LUN 大小。
  5. CSI Node Plugin 扩容块设备:Node Plugin 重新扫描 iSCSI 设备并更新块设备大小。
  6. 文件系统扩容: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 工作流程

  1. 选择源 Snapshot:指定源 Volume 的某个 Snapshot 作为克隆源。
  2. 创建 Clone Volume:Longhorn Manager 创建新的 Volume CRD,其 Snapshot Chain 指向源 Snapshot 作为基础层。
  3. 创建 Replica:新 Replica 的 Sparse File 链基址指向源 Snapshot 的数据文件。
  4. 共享数据:Clone Volume 和源 Volume 的旧 Snapshot 共享底层数据块,新写入分别进入各自的 Volume-Head。
  5. 独立性: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/&lt;volume-name&gt;"]
    BlockDev --> Engine["Longhorn Engine (iSCSI)"]
    Engine --> Replica1["Replica"]
    Engine --> Replica2["Replica"]
    Engine --> Replica3["Replica"]

Share Manager 工作原理

  1. Volume 创建:Volume 按正常流程创建(Engine + Replica)。
  2. Share Manager 启动:当 Volume 被以 RWX 模式请求时,Longhorn Manager 创建 Share Manager Pod。
  3. NFS 导出:Share Manager 内的 NFS Ganesha 服务器将块设备格式化为文件系统(如 ext4/xfs)并通过 NFSv4 导出。
  4. Pod 挂载:CSI Node Plugin 在 Pod 所在节点执行 NFS mount 而非 iSCSI 登录。
  5. 数据路径: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": ""
  }  

实现原理

  1. Multus CNI 集成:Longhorn 依赖 Multus CNI 为 Instance Manager Pod 分配额外的网络接口。
  2. Instance Manager 双栈:Instance Manager Pod 拥有管理网络 IP 和存储网络 IP 两个地址。
  3. Engine/Replica 绑定:Engine 和 Replica 进程启动时绑定到存储网络 IP,内部同步流量走存储网络。
  4. iSCSI 不变:iSCSI 前端流量仍走默认网络,保证 Pod 连接兼容。

关键参数

参数说明
storage-network启用存储网络,指定 Multus 网络名称或 kube-system 下的默认网络
csi.attacher-replica-countCSI Attacher 副本数
disable-revision-counter禁用 Revision Counter(存储网络不稳定时可能引发冲突)
17 Longhorn 的监控与 Prometheus 集成如何配置?

答案:

Longhorn 内置 Prometheus 指标暴露端点,通过 ServiceMonitor 或 PodMonitor 与 Prometheus Operator 集成,提供 Volume、Node、Disk、Engine、Replica 等维度的全方位监控指标。

指标暴露来源

组件Metrics 端口指标内容
Longhorn Manager9500Volume 状态、Node 状态、备份状态、调度统计
Instance Manager8500Engine/Replica 进程状态、资源使用
Engine无独立端口(通过 Instance Manager)I/O 吞吐、IOPS、延迟、副本状态

关键 Prometheus 指标

指标名类型说明
longhorn_volume_actual_size_bytesGaugeVolume 实际占用空间
longhorn_volume_capacity_bytesGaugeVolume 容量
longhorn_volume_read_iopsCounter读 IOPS
longhorn_volume_write_iopsCounter写 IOPS
longhorn_volume_read_latencyHistogram读延迟分布
longhorn_volume_write_latencyHistogram写延迟分布
longhorn_volume_robustnessGaugeVolume 健壮性(Healthy/Degraded/Faulted)
longhorn_node_statusGauge节点状态
longhorn_disk_capacity_bytesGauge磁盘容量

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 状态为 FaultedCritical
磁盘使用率超过 80%Warning
磁盘使用率超过 90%Critical
节点不可用超过 5 分钟Warning
18 Longhorn 的故障恢复机制是怎样的?

答案:

Longhorn 支持多层次的故障恢复机制,核心包括 Replica Rebuild(副本重建)和 Volume Degraded Recovery(卷降级恢复),实现从节点故障、磁盘故障、Replica 数据不一致等场景自动恢复。

Replica Rebuild(副本重建)

当 Replica 因节点宕机、网络故障或磁盘故障变为不可用时,Engine 检测到 Replica 数量低于配置值后触发 Rebuild:

  1. 故障检测:Engine 定期向所有 Replica 发送心跳,超时未响应标记为 Failed。
  2. 调度新 Replica:Longhorn Manager Scheduler 选择健康节点,创建新 Replica。
  3. 数据同步:Engine 从健康 Replica 读取数据块,写入新 Replica。同步过程中新 Replica 状态为 Rebuilding。
  4. 完成同步:所有数据块同步完成后,新 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 VolumeActivate DR Volume

故障恢复参数

参数默认值说明
replica-replenishment-wait-interval600sReplica 补充等待间隔
concurrent-replica-rebuild-per-node-limit5每节点并发 Rebuild 数
stale-replica-timeout30m过时 Replica 超时(超时后清理)
auto-salvageenabled启用 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}}'
  1. 禁止新调度allowScheduling: false 禁止新 Replica 调度到此节点。
  2. 标记驱逐evictionRequested: true 触发驱逐流程。
  3. Replica 迁移:Longhorn Manager 为节点上的每个 Replica 在其他节点创建新副本,数据同步完成后删除旧副本。
  4. Engine 迁移:如果 Engine 在此节点,Manager 自动将 Engine 迁移到其他节点。
  5. 完成确认:所有 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 监听节点 Eviction API,自动执行 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 v1Longhorn 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/longhornReplica 数据存储路径
defaultSettings.backupTarget(空)默认备份目标(S3/NFS URL)
defaultSettings.backupTargetCredentialSecret(空)备份目标凭据 Secret
defaultSettings.createDefaultDiskLabeledNodestrue自动为添加标签的节点创建默认磁盘
defaultSettings.defaultDataLocalitydisabled默认数据本地性策略
defaultSettings.defaultReplicaCount3默认副本数量
defaultSettings.replicaAutoBalancedisabled副本自动均衡策略
defaultSettings.storageOverProvisioningPercentage200存储超配百分比
defaultSettings.storageMinimalAvailablePercentage10最小可用空间百分比
defaultSettings.upgradeCheckertrue自动检查升级
defaultSettings.autoSalvagetrue自动修复故障 Volume
defaultSettings.disableSchedulingOnCordonedNodetruecordon 节点禁用调度
defaultSettings.replicaSoftAntiAffinityfalse软反亲和性
defaultSettings.taintToleration(空)节点容忍设置
defaultSettings.guaranteedInstanceManagerCPU12Instance Manager 保证 CPU(百分比,100=1 核)
persistence.defaultClasstrue设置为默认 StorageClass
persistence.defaultFsTypeext4默认文件系统类型
ingress.enabledfalse启用 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 在线升级流程

  1. Manager 升级完成:新版本 Manager 运行后,检测到 Engine 版本低于目标版本。
  2. 创建新 Engine:Manager 自动创建新版本 Engine 进程(使用新二进制)。
  3. 切换连接:新 Engine 连接所有 Replica,通过快照链校验一致性。
  4. iSCSI 切换:iSCSI Target 从旧 Engine 切换到新 Engine。切换过程短暂 I/O 阻塞(毫秒级),应用层可感知为短暂磁盘延迟波动。
  5. 清理旧 Engine:确认新 Engine 正常工作后,删除旧 Engine 进程。

升级关键参数

参数默认值说明
concurrent-automatic-engine-upgrade1并发 Engine 升级数
upgrade-checkerenabled启用自动升级版本检查
auto-upgrade-engineenabled升级 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 生态中的分布式块存储方案,但在架构复杂度、运维门槛、性能特征和应用场景上有显著差异。

核心对比

维度LonghornCeph RBD
架构模型每个 Volume 一个 Engine 进程(微控制器模型)集中式 MON + OSD 守护进程
安装复杂度Helm 一键部署,5 分钟内可用需要精心规划 OSD/OSD 盘布局,安装复杂
资源开销轻量,每个 Engine ~100MB RAM较重,每 OSD 需要 ~4GB RAM
最小规模3 节点3 节点(生产环境建议 5+ 节点)
数据分布Replica 基于快照链的 Sparse FileCRUSH 算法伪随机分布
副本机制固定副本数(每个 Volume N 个 Replica)Pool 级 Replication 或 Erasure Coding
快照链式快照,即时创建,需 PurgeRBD Snapshot,支持分层 Clone
备份原生支持 S3/NFS 备份RBD Mirror(块级别异地同步)或 RBD Export
性能中等(v1 ~50K IOPS),v2 SPDK 大幅提升高性能(~100K+ IOPS 单卷)
多集群DR Volume + BackupstoreRBD Mirror(异步/同步)
UI内置 Web UICeph Dashboard(功能有限)
社区背景CNCF Sandbox,由 SUSE/Rancher 主导Ceph Foundation(Linux Foundation),Red Hat 主导
适用规模中小规模集群(< 50 节点)大规模集群(50-2000+ 节点)

选型建议

场景推荐方案原因
小规模、轻运维Longhorn安装简单、UI 直观、学习曲线低
大规模、高性能Ceph RBD成熟稳定、社区大、CRUSH 算法数据分布优
多云/混合云Longhorn轻量、对基础设施要求低
深度定制Ceph RBDCRUSH Map 精细控制、EC 策略灵活
DevOps 团队LonghornKubernetes 原生、YAML 驱动、开箱即用
25 Longhorn 与 OpenEBS 对比有哪些差异?

答案:

Longhorn 与 OpenEBS 同为 CNCF 项目中的容器原生存储(Container Native Storage,CNS)方案,均以轻量、Kubernetes 原生为设计目标,但在存储引擎、快照机制和运维模型上存在差异。

核心对比

维度LonghornOpenEBS (cStor / Jiva / Mayastor)
存储引擎Longhorn Engine(iSCSI),v2 引入 SPDKJiva(iSCSI)、cStor(基于 ZFS)、Mayastor(NVMe-oF/SPDK)
副本机制Chain Snapshot + Sparse FileJiva:Sparse File 同步;cStor:ZFS send/recv;Mayastor:SPDK Nexus
快照原生链式快照Jiva:依赖 DM-Snapshot;cStor:ZFS Snapshot
备份原生 S3/NFS 备份通过 Velero 或 Restic 间接备份
副本数量1-5Jiva:1-5;cStor:1-5;Mayastor:可配置
性能v1:中等;v2(SPDK):高Jiva:低;cStor:中;Mayastor:极高
安装Helm 一键安装多种引擎可选,安装复杂度各异
运维工具Web UI + CLI(kubectl)kubectl + openebsctl
CNCF 成熟度SandboxSandbox
适用场景通用 Kubernetes 存储不同引擎适配不同场景(本地盘 / ZFS / NVMe 高性能)

引擎选型对比

特性Longhorn v1OpenEBS JivaOpenEBS cStorOpenEBS Mayastor
存储协议iSCSIiSCSIiSCSINVMe-oF
底层存储Sparse FileSparse FileZFS ZVOLSPDK 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 中运行。

核心对比

维度LonghornRook 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% 存储空间)
数据完整性无内部 ChecksumCeph 内部 Checksum(Scrub)
备份原生的 S3/NFS 备份RBD Mirror + RGW Multi-site
升级体验简单(Helm upgrade)复杂(需同步升级 Operator + Ceph 版本)
社区CNCF Sandbox,SUSE 主导CNCF Graduated,Red Hat/IBM 主导
学习曲线高(需要 Ceph 专业知识)
生产成熟度中小规模成熟大规模成熟

存储类型覆盖

存储需求LonghornRook Ceph
块存储(RWO)支持支持(RBD)
共享文件存储(RWX)支持(NFS Ganesha)支持(CephFS)
对象存储(S3)不支持支持(RGW)

选型建议

场景推荐方案原因
纯块存储需求Longhorn更简单、资源开销更低
需要块 + 文件 + 对象多种存储Rook Ceph一套集群满足多种存储需求
大规模生产环境(100+ 节点)Rook CephCRUSH 数据分布、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

限制说明

限制说明
无内置 QuotaLonghorn 不提供内置存储 Quota 机制,需依赖 Kubernetes ResourceQuota
单 Backup Target全局仅支持一个 Backup Target Setting(多租户需通过命名空间粒度拆分 PVC)
无网络加密副本间同步不实现应用层加密,敏感环境建议配合 WireGuard 或 IPsec
28 Longhorn 的备份加密如何配置?

答案:

Longhorn 支持对备份数据进行 AES-256-GCM 加密,加密在 Engine 层执行,备份存储中保存的为密文数据块,解密密钥通过 Kubernetes Secret 管理。

加密工作流程

  1. 创建加密密钥 Secret:配置 CRYPTO_KEY_VALUE 为加密密钥。
  2. 配置 Backup Target Credential:在 Backup Target Secret 中引用加密密钥。
  3. Engine 加密:执行 Backup 时,Engine 使用密钥对每个 2MB 数据块进行 AES-256-GCM 加密,生成密文块上传。
  4. 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 卡在 AttachingiSCSI 连接失败、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 PendingStorageClass 不存在、无可用磁盘空间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 服务

副本配置

配置项生产建议值原因
defaultReplicaCount3容忍 1 个副本故障
replicaAutoBalancebest-effortleast-effort自动均衡负载
dataLocalitydisabled(默认)或 best-effort平衡性能与高可用
replicaSoftAntiAffinityfalse防止同节点故障导致多副本丢失
staleReplicaTimeout30-60 分钟给故障恢复留足够时间

备份策略

配置项建议值说明
backupTargetS3 Compatible(MinIO/AWS S3)或 NFS与集群物理隔离的 Backupstore
backupTargetCredentialSecret配置凭据 Secret使用 IAM Role 或 Access Key
定时备份 Job每日增量 + 每周全量通过 Recurring Job 配置
保留策略7 天每日 + 4 周每周平衡恢复窗口与存储成本
备份加密启用 CRYPTO_KEY_VALUE保护备份数据安全

性能调优

配置项建议值说明
guaranteedInstanceManagerCPU25(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
变更记录记录每次配置变更和升级操作

容量规划

维度建议
storageOverProvisioningPercentage200%(允许 2 倍超配),监控实际使用率及时扩容
storageMinimalAvailablePercentage10-15%(保留警戒空间)
单 Volume 大小上限建议不超过 10TiB
单节点 Replica 数量上限建议不超过 50 个 Replica
备份存储容量预留集群存储容量的 150% 以上的备份空间

灾难恢复演练

演练项频率说明
单 Volume 恢复每月从最新 Backup 恢复随机 Volume
全集群恢复每季度模拟全集群故障,从 Backupstore 恢复
DR Volume 激活每季度在灾备集群激活 DR Volume 验证数据完整性
备份完整性校验每月恢复备份并执行文件系统 fsck