Longhorn 实战:Kubernetes 分布式存储与备份恢复

一、为什么 Kubernetes 需要独立的分布式存储

Kubernetes 原生只负责调度与编排,Pod 本身是临时性的:一旦被驱逐或节点宕机,本地磁盘上的数据就会随之消失。对于 PostgreSQL、Redis、消息队列这类有状态服务,单靠 emptyDir 或节点本地盘完全不可靠。社区早期用 NFS、Ceph 等方案,但配置繁琐、运维门槛高,小团队很难长期维护。Longhorn 由 Rancher(SUSE)开源,把分布式块存储做成了开箱即用的轻量方案:一条 Helm 命令装好,应用只需像使用普通 PVC 一样申明 StorageClass,就能获得跨节点复制、自动故障转移、快照与备份能力。本文基于一个单机多节点的 K8s 环境(可参考 k3s 轻量部署),从零跑通 Longhorn 的部署、挂载、快照与备份全流程。

很多团队在刚接触 K8s 时会把数据库跑在宿主机目录挂载上,短期能跑通,但一旦节点下线、Pod 被重新调度到别的机器,数据就彻底丢失。真正的生产环境必须让存储与计算解耦:存储跟随卷走,而不是跟随节点走。这正是 Longhorn 要解决的核心问题。

二、Longhorn 与其他存储方案怎么选

在引入 Longhorn 之前,先想清楚它和常见方案的定位差异。下面的对比表能帮你快速判断:

方案运维复杂度可靠性适用规模
节点本地盘最低差(节点挂即丢)仅临时数据
NFS低中(单点依赖)小集群共享读
Ceph很高极高大型多租户
Rook(Ceph)高高中大型
Longhorn低高(多副本)中小到中型集群

可以看到,Longhorn 处在运维成本与可靠性之间的甜点区:比 Ceph 轻得多,又比 NFS 和本地盘可靠得多。它尤其适合 3 到 50 个节点、需要持久化但有状态服务不多的团队。

三、Longhorn 架构:微引擎加多副本

3.1 每个卷一个微引擎

与传统集中式存储不同,Longhorn 为每一个 Volume 启动一个轻量的存储引擎(engine)副本,运行在专用 Pod 里,只负责本卷的读写与复制。这种去中心化设计让性能随节点水平扩展,单点故障不会拖垮整个集群,也避免了传统存储控制器的性能瓶颈。

3.2 默认三副本,跨节点容错

Longhorn 默认把每个卷的数据切成多个副本(replica),默认 3 份,均匀分散在不同节点。当某个节点宕机,控制器会在存活节点上自动重建缺失副本,应用无感知。副本数可以在 StorageClass 里按业务重要性调整,关键数据可提高到 3 以上。

四、Helm 一键部署 Longhorn

添加官方仓库并安装到独立命名空间。Longhorn 由几个核心组件组成:longhorn-manager 负责编排与 API,longhorn-ui 提供可视化界面,longhorn-csi-plugin 则是 Kubernetes CSI 驱动,让 PVC 能真正挂进 Pod。

helm repo add longhorn https://charts.longhorn.io
helm repo update
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace

等待组件就绪:

kubectl -n longhorn-system get pods
# NAME                                      READY
# longhorn-manager-xxxxx                     1/1
# longhorn-ui-xxxxx                          1/1
# longhorn-csi-plugin-xxxxx                  1/1

部署完成后,通过 kubectl -n longhorn-system get svc 找到 longhorn-frontend 的 NodePort,或配合 Nginx 反向代理 暴露 UI,即可在浏览器中可视化查看卷、节点与副本状态。

五、创建 PVC 并挂载到应用

声明一个 5Gi 的卷,StorageClass 指定 longhorn:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 5Gi

在 Deployment 中引用该声明:

volumes:
  - name: data
    persistentVolumeClaim:
      claimName: mysql-data

Pod 调度到任意节点都能挂载到同一份数据,节点漂移不再丢数据。Longhorn 还支持在线扩容:把 PVC 的 storage 改大后,卷会在不中断业务的情况下扩展。对数据库类负载,这正是 PostgreSQL 慢查询优化 之外最该先解决的地基问题。

六、StorageClass 与回收策略

Longhorn 安装后会注册多个 StorageClass,核心区别在回收策略与副本数:

StorageClass回收策略默认副本适用场景
longhornDelete3临时测试、可重建数据
longhorn-staticRetain3生产关键数据
longhorn-witnessDelete1低价值日志

生产环境建议显式设置 storageClassName: longhorn-static,或将默认类打上 storageclass.kubernetes.io/is-default-class: "true",避免误删。Delete 策略在 PVC 删除时会连同底层卷一起清掉,Retain 则会保留卷,方便事故后手动恢复。

七、快照与备份:本地快照 vs 远程备份

Longhorn 提供两层数据保护,二者互补:

能力存储位置恢复粒度抗节点故障
快照 Snapshot集群内副本盘卷级/增量是
备份 Backup外部对象存储 S3卷级是(跨集群)

创建一份本地快照:

kubectl apply -f - <

要把备份落到远端,先在 Longhorn UI 配置 Backup Target 指向 MinIO 对象存储(兼容 S3 协议),之后每次备份都会以增量方式推送到桶里,实现真正的异地容灾。快照适合快速回滚,备份则能在整个集群损毁时从外部恢复。

八、实战:把 PostgreSQL 数据迁移到 Longhorn

假设已有一套跑在 PostgreSQL 上的业务,迁移只需三步:第一,用 pg_dump 导出;第二,建 Longhorn PVC 并挂载到新 Pod;第三,psql 导入。由于 Longhorn 卷跨节点可见,后续节点维护时数据库 Pod 可被调度到任意健康节点而不丢数据,配合 Velero 还能做集群级整机备份,形成快照、卷备份、集群备份三层防护。

九、高可用与故障自愈

当某节点宕机,Longhorn 控制器检测到副本不可达,会立即从剩余健康副本继续服务,并在其他节点重建缺失副本,直到恢复到目标副本数。整个过程对上层应用透明,无需人工介入。需要注意:重建副本会占用网络带宽与磁盘 IO,建议在低峰期或给 Longhorn 配置独立的存储网络,避免影响业务吞吐。

十、运维监控与容量规划

Longhorn 自带 Prometheus 指标(如 longhorn_volume_actual_size、longhorn_node_storage_available),可接入现有监控栈做容量预警;UI 中的节点磁盘压力面板能直观看到各节点剩余空间。经验法则是单节点预留 20% 以上余量,避免副本重建时空间不足导致重建失败。同时建议对 longhorn-manager 做资源 request/limit,防止它和业务的存储 IO 互相争抢。

十一、常见坑与调优

问题根因处理
卷一直 attaching多控制器争用确认 ReadWriteOnce、单 Pod 挂载
副本重建卡住节点磁盘满清理空间或扩盘后自动恢复
备份失败S3 凭据错误核对 Backup Target 的 AccessKey
性能偏低默认副本 3 跨网络同可用区节点、启用 stripe

十二、适用与不适用场景

Longhorn 虽好,但并非万能。它适合:单机到中型集群的有状态服务、需要低成本高可用的团队、希望用 UI 直观管理卷的场景。它不太适合:超大规模(数百节点)的多租户存储、对极端吞吐与低延迟有苛刻要求的场景(这类需求更该上 Ceph 或专业存储阵列)。选型时把业务规模与团队运维能力一起考虑,才能避免后续推倒重来。

十三、小结

Longhorn 用极低的运维成本,为 Kubernetes 补上了持久化、高可用、可备份三块短板。它与 k3s、Velero、MinIO 等组成一套完整的有状态基础设施栈。下一步可结合 GitHub Actions 把备份校验纳入 CI,让数据安全自动化闭环。对于绝大多数中小团队而言,Longhorn 是落地 K8s 持久化存储最省心的一站式答案。

上一篇 chezmoi 实战:用 Git 管理 dotfiles
下一篇 Testcontainers 实战:用 Docker 容器跑可靠的 Java 集成测试
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]