3. 存储卷生命周期管理:创建卷、挂载卷、扩容卷、删除卷、卷克隆与快照
在 Longhorn 中,存储卷(Volume)是核心操作单元。本章将系统讲解卷从创建到销毁的完整生命周期,涵盖创建、挂载、扩容、删除、克隆与快照六大关键操作。每个操作都对应明确的 API 或 UI 步骤,并涉及底层引擎与副本的协同机制。
3.1 卷生命周期全景图
下图展示了 Longhorn 卷从创建到删除的完整状态流转,以及克隆与快照在生命周期中的位置。
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 挂载流程
- 引擎启动:Longhorn 在目标节点上启动卷引擎(tgt 或 nbd)。
- 副本连接:引擎与所有健康副本建立 gRPC 连接,同步元数据。
- 前端暴露:引擎通过 blockdev 或 iSCSI 将卷暴露为本地块设备(如
/dev/longhorn/vol-name)。 - 文件系统挂载:若卷包含文件系统,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 的情况下增加卷容量。扩容操作分为两步:
- Longhorn 层面扩容:修改卷大小,引擎通知副本扩展底层存储文件。
- 文件系统层面扩容:在 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 克隆流程
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 流水线中,建议将卷创建、挂载、快照操作封装为幂等脚本,并在流水线开始和结束时分别创建快照,用于快速回滚测试环境。删除卷操作应加入人工确认步骤,防止误删生产数据。