3. 存储卷生命周期管理:创建卷、挂载卷、扩容卷、删除卷、卷克隆与快照

在 Longhorn 中,存储卷(Volume)是核心操作单元。本章将系统讲解卷从创建到销毁的完整生命周期,涵盖创建、挂载、扩容、删除、克隆与快照六大关键操作。每个操作都对应明确的 API 或 UI 步骤,并涉及底层引擎与副本的协同机制。

3.1 卷生命周期全景图

下图展示了 Longhorn 卷从创建到删除的完整状态流转,以及克隆与快照在生命周期中的位置。

Longhorn 卷生命周期状态流转图 Longhorn 卷生命周期状态流转 创建卷 挂载卷 使用中 扩容卷 创建快照 卷克隆 删除卷 资源回收 说明: 快照和克隆可在卷使用中或挂载状态下执行,不影响业务 I/O。删除卷前需先卸载,否则操作将被拒绝。

3.2 创建卷

创建卷是生命周期的起点。Longhorn 支持通过 UI、CLI(longhornctl)或 Kubernetes PVC 方式创建卷。创建时需指定以下关键参数:

参数 说明 默认值 推荐值
名称 卷的唯一标识,Kubernetes 中对应 PVC 名称 — 符合 DNS-1123 规范
大小 卷的容量,支持 GiB/TiB 10 GiB 根据工作负载预估
副本数 数据冗余副本数量 3 生产环境 ≥ 3
数据局部性 优先将副本调度到 Pod 所在节点 disabled best-effort
前端 块设备暴露方式:blockdev / iSCSI blockdev blockdev
加密 是否启用 LUKS 加密 false 按安全要求
最佳实践:创建卷时建议将副本数设置为 3,并启用数据局部性(best-effort),以减少跨节点网络延迟。对于数据库等有状态应用,建议提前规划卷大小,避免频繁扩容。

3.2.1 通过 PVC 创建卷(Kubernetes 方式)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-longhorn-volume
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 50Gi
---
# 创建后 Longhorn 自动生成对应卷
# kubectl apply -f pvc.yaml

3.3 挂载卷

挂载卷是将 Longhorn 卷暴露为块设备或文件系统,供 Pod 或虚拟机使用。挂载流程涉及 Longhorn 引擎、副本和前端驱动。

3.3.1 挂载流程

  1. 引擎启动:Longhorn 在目标节点上启动卷引擎(tgt 或 nbd)。
  2. 副本连接:引擎与所有健康副本建立 gRPC 连接,同步元数据。
  3. 前端暴露:引擎通过 blockdev 或 iSCSI 将卷暴露为本地块设备(如 /dev/longhorn/vol-name)。
  4. 文件系统挂载:若卷包含文件系统,Pod 内执行 mount 操作。
关键指标:挂载时间通常 < 2 秒(3 副本,无重建)。若挂载超时(默认 30 秒),请检查副本健康状态和网络连通性。

3.3.2 挂载状态检查

# 查看卷挂载状态
longhornctl volume list
# 输出示例:
# NAME              STATE      ROBUSTNESS  SIZE   NODE
# my-volume         attached  healthy     50Gi   worker-1

# 查看引擎进程
ls -la /dev/longhorn/
# 输出:my-volume -> /dev/nbd0

3.4 扩容卷

Longhorn 支持在线扩容(Online Expansion),即在不卸载卷、不中断 I/O 的情况下增加卷容量。扩容操作分为两步:

  1. Longhorn 层面扩容:修改卷大小,引擎通知副本扩展底层存储文件。
  2. 文件系统层面扩容:在 Pod 内或宿主机上执行 resize2fs 或 xfs_growfs。
注意:扩容操作仅支持增加容量,不支持缩容。缩容可能导致数据损坏。扩容前请确保目标节点有足够的磁盘空间。

3.4.1 扩容操作示例

# 通过 UI 或 CLI 扩容
longhornctl volume expand my-volume --size 100Gi

# 文件系统扩容(在 Pod 内执行)
# 对于 ext4:
resize2fs /dev/longhorn/my-volume
# 对于 xfs:
xfs_growfs /mount/point

3.5 删除卷

删除卷是生命周期终结操作。Longhorn 在删除前会进行安全校验,防止误删正在使用的卷。

3.5.1 删除前置条件

条件 说明 检查命令
卷已卸载 卷不能处于 attached 状态 longhornctl volume get my-volume | grep State
无关联 PVC Kubernetes PVC 需先删除 kubectl get pvc my-pvc
无活跃快照链 删除卷会同时删除所有快照 longhornctl snapshot list my-volume

3.5.2 删除操作

# 删除卷(UI 或 CLI)
longhornctl volume delete my-volume

# 删除后,Longhorn 自动清理:
# - 所有副本数据
# - 引擎进程
# - 快照链
# - 回收磁盘空间

3.6 卷克隆

卷克隆是基于现有卷创建一份完全独立的数据副本。克隆操作使用快照技术,不复制全部数据,而是通过快照链实现写时复制(Copy-on-Write)。

3.6.1 克隆流程

Longhorn 卷克隆流程 卷克隆流程:基于快照的写时复制 源卷 (含数据 + 快照链) 创建快照 (瞬时快照) 克隆卷 (独立副本) 克隆特性: 1. 克隆卷与源卷完全独立,修改克隆卷不影响源卷。 2. 克隆基于快照实现,初始不复制数据,仅复制元数据。 3. 克隆卷可单独挂载、扩容、创建快照,拥有完整生命周期。

3.6.2 克隆操作示例

# 通过 CLI 克隆卷
longhornctl volume clone my-volume --name my-volume-clone

# 克隆完成后,查看克隆卷
longhornctl volume get my-volume-clone
# 输出:State: detached, Size: 50Gi, CloneOf: my-volume
使用场景:克隆适用于快速创建测试环境、数据迁移、应用版本分支等场景。克隆操作不会影响源卷性能,因为写时复制仅在克隆卷写入新数据时触发。

3.7 快照

快照是卷在某个时间点的只读副本。Longhorn 快照基于 LVM 类似机制,支持增量快照链,每个快照仅存储与前一个快照的差异数据。

3.7.1 快照链结构

快照名称 大小 创建时间 说明
snap-001 2.3 GiB 2025-03-01 10:00 初始快照
snap-002 1.1 GiB 2025-03-02 14:30 增量快照
snap-003 0.8 GiB 2025-03-03 09:15 增量快照
volume-head — 当前 活跃写入层

3.7.2 快照操作命令

# 创建快照
longhornctl snapshot create my-volume --name pre-upgrade-snap

# 列出快照
longhornctl snapshot list my-volume

# 回滚到指定快照
longhornctl snapshot revert my-volume --snapshot pre-upgrade-snap

# 删除快照
longhornctl snapshot delete my-volume --snapshot pre-upgrade-snap

# 清理多余快照(保留最近 5 个)
longhornctl snapshot purge my-volume --keep 5
回滚风险:快照回滚会丢失回滚点之后的所有数据变更。回滚操作会重建卷引擎,导致短暂 I/O 中断(约 1-3 秒)。生产环境回滚前请确认已备份当前数据。

3.8 生命周期操作对比

操作 是否影响 I/O 执行时间 数据风险 回滚能力
创建卷 无 秒级 无 N/A
挂载卷 短暂中断(< 2s) 秒级 低 卸载重挂
扩容卷 无(在线) 秒级 低(仅增不减) 不支持缩容
删除卷 需先卸载 秒级 高(数据永久丢失) 需提前备份
卷克隆 无 秒级 无 克隆卷独立
快照 无 毫秒级 低 支持回滚

3.9 故障排查要点

  • 创建失败:检查磁盘空间、节点标签、调度策略。使用 longhornctl volume describe 查看错误事件。
  • 挂载超时:检查引擎日志(kubectl logs longhorn-engine-xxx),确认副本是否健康。
  • 扩容后文件系统未识别:手动执行 resize2fs 或 xfs_growfs,确认卷已挂载。
  • 删除被拒绝:卷仍处于 attached 状态,先卸载再删除。
  • 克隆卷无法挂载:克隆卷默认 detached,需先挂载到目标节点。
  • 快照回滚后数据异常:检查回滚点是否正确,快照链是否完整。
自动化流水线集成建议:在 CI/CD 流水线中,建议将卷创建、挂载、快照操作封装为幂等脚本,并在流水线开始和结束时分别创建快照,用于快速回滚测试环境。删除卷操作应加入人工确认步骤,防止误删生产数据。