全文开始
在Kubernetes上运行数据库、消息队列等有状态应用时,我们总会面临一个灵魂拷问:当Pod在节点间迁移或节点故障时,如何保证数据不丢失,并快速恢复服务?原生K8s的卷管理提供了基础能力,但在生产环境中,我们往往需要企业级的存储特性:如跨节点的数据高可用、秒级创建的数据快照,以及可编排的备份恢复策略。
Longhorn应运而生,它是一款轻量级、功能强大且完全开源的云原生分布式块存储系统。它直接运行在你的K8s集群内,将每个节点的本地硬盘聚合起来,为集群提供如同公有云“云硬盘”般的网络块存储服务。其最大的魅力在于极简的设计哲学:通过为每个卷启动一个专属的存储控制器(Controller)和数据副本引擎(Engine),实现了细粒度的管理和故障隔离。
本文将带你深入部署和配置Longhorn,为你集群中的有状态应用,筑起一道可靠的数据防线。
为什么用 Longhorn
Longhorn作为云原生存储方案,核心优点如下:
- 极简的云原生集成:作为K8s原生应用,安装即是Operator,通过CSI驱动无缝集成,管理逻辑与K8s完全一致。
- 极致的高可用与容错:每个存储卷(Volume)独立控制器(Controller)与副本引擎(Engine),实现故障的细粒度隔离与秒级自动故障转移。
- 强大的数据运维能力:支持秒级创建一致性快照、基于快照的链式增量备份,并可一键将备份恢复到新卷或异地集群。
- 轻量级与可视化:无外部中间件依赖,资源占用小;提供清晰直观的Web UI,使分布式存储的监控和管理一目了然。
- 开源与企业级特性:100%开源,具备多副本、数据压缩等企业级功能,是构建on-premise私有云存储栈的可靠选择。
总结:Longhorn以K8s原生的方式,为有状态应用提供了操作简便、稳定可靠、功能全面的持久化存储解决方案。
数据盘准备
# 准备一块独立的硬盘挂在到 /var/lib/longhornmkfs.ext4 /dev/sdbmkdir/var/lib/longhorn# 设置自动挂载echo'/dev/sdb /var/lib/longhorn ext4 defaults 0 0'>>/etc/fstab systemctl daemon-reloadmount-a安装依赖
该组建依赖iscsi
yuminstall-y dump iscsi-initiator-utils systemctlenableiscsid --now systemctl status iscsid安装 Longhorn
这里只展示了部分yaml文件,完整的yaml文件有三千多行,建议文末下载资料包,里面有完整可用的longhorn.yaml文件
---# Builtin: "helm template" does not respect --create-namespaceapiVersion:v1kind:Namespacemetadata:name:longhorn-system---# Source: longhorn/templates/priorityclass.yamlapiVersion:scheduling.k8s.io/v1kind:PriorityClassmetadata:name:"longhorn-critical"labels:app.kubernetes.io/name:longhornapp.kubernetes.io/instance:longhornapp.kubernetes.io/version:v1.9.1description:"Ensure Longhorn pods have the highest priority to prevent any unexpected eviction by the Kubernetes scheduler under node pressure"globalDefault:falsepreemptionPolicy:PreemptLowerPriorityvalue:1000000000---# Source: longhorn/templates/serviceaccount.yamlapiVersion:v1kind:ServiceAccountmetadata:name:longhorn-service-accountnamespace:longhorn-systemlabels:app.kubernetes.io/name:longhornapp.kubernetes.io/instance:longhornapp.kubernetes.io/version:v1.9.1---# Source: longhorn/templates/serviceaccount.yamlapiVersion:v1kind:ServiceAccountmetadata:name:longhorn-ui-service-accountnamespace:longhorn-systemlabels:app.kubernetes.io/name:longhornapp.kubernetes.io/instance:longhornapp.kubernetes.io/version:v1.9.1---# Source: longhorn/templates/serviceaccount.yamlapiVersion:v1kind:ServiceAccountmetadata:name:longhorn-support-bundlenamespace:longhorn-systemlabels:app.kubernetes.io/name:longhornapp.kubernetes.io/instance:longhornapp.kubernetes.io/version:v1.9.1创建应用
# 1. 先导入镜像,镜像在资源包里面有,总共有三个nerd load -i longhorn_images_1.tar nerd load -i longhorn_images_2.tar nerd load -i longhorn_images_3.tar# 2. 将镜像导入到私有镜像仓库或者每个worker节点都导入这三部分镜像# 3. 创建应用kubectl apply -f longhorn.yaml等待所有的pod创建完毕,在服务中可以看到一个服务名为longhorn-frontend的服务,给该服务手动添加一个外部IP地址(externalIPs),外部IP地址可以是k8s任意一个节点的IP地址,然后浏览器访问该IP地址即可。
全文结束
当你在Longhorn的简洁UI中,看到第一个持久卷(PV)成功创建、并顺利挂载到Pod时,就意味着你的K8s集群获得了一项至关重要的原生能力:对数据生命周期的自主控制权。
Longhorn的成功部署,不仅仅是安装了一个存储驱动。它标志着你的集群从“仅能运行无状态应用”进阶到“可稳健承载核心有状态服务”的新阶段。它提供的可视化操作、精细化的监控和基于快照的备份流,将存储运维从黑盒变成了白盒,极大地降低了数据管理的风险和复杂度。
至此,你已为集群装上了可靠的“云硬盘”。接下来,便是以数据安全为基石,去设计和部署那些真正承载业务价值的核心应用了。
实践之后:你计划使用Longhorn为哪个有状态应用(如MySQL、Redis等)提供存储?在结合特定应用时,你调整了哪些关键的存储参数?欢迎在评论区分享你的场景与配置心得。
资料领取
关注微信公众号云原生运维之道,找到原文:https://mp.weixin.qq.com/s/5i9D9kbleHHI3j_zK7-ybw
或者加 v:qiaoyebufan,备注 “领取k8s资料”。