3. 环境准备:Kubernetes集群要求、节点规划、操作系统与内核参数调优
Longhorn 作为 Kubernetes 原生的分布式块存储系统,其稳定性和性能高度依赖底层基础设施的配置。本章将详细阐述部署 Longhorn 前必须完成的环境准备工作,包括集群版本要求、节点资源规划、操作系统选型以及关键的内核参数调优(iSCSI、NFS、文件系统)。
3.1 Kubernetes 集群版本与组件要求
Longhorn 对 Kubernetes 集群有明确的版本依赖。在生产环境中,务必使用经过官方验证的稳定版本,以避免因 API 变更或功能缺失导致的兼容性问题。
| 组件 | 最低版本 | 推荐版本 | 备注 |
|---|---|---|---|
| Kubernetes | v1.21 | v1.28+ | 需启用 CSIDriver 和 VolumeSnapshot 特性门控 |
| Docker / containerd | 19.03+ | containerd 1.6+ | 推荐使用 containerd 作为容器运行时 |
| Helm | v3.8 | v3.14+ | 用于自动化部署与回滚 |
| kubectl | v1.21 | 与集群版本一致 | 管理集群资源 |
⚠️ 版本兼容性警告: 切勿在 Kubernetes v1.24 以下版本中尝试使用 Longhorn v1.6+,因为新版本已移除对旧版 CSI 规范的支持。升级集群前,请务必查阅 Longhorn 官方 Release Notes 中的版本兼容性矩阵。
3.2 节点规划与资源建议
Longhorn 采用无中心节点的对等架构,每个存储节点都运行一个 longhorn-engine 实例。合理的节点规划是保障数据高可用和性能隔离的基础。
3.2.1 节点角色与标签
- 控制面节点(Control Plane): 运行 Longhorn Manager(API Server)和 UI。建议至少 3 个节点用于高可用。
- 存储节点(Storage Node): 运行 Longhorn Engine 和 Instance Manager。所有提供本地磁盘的 Worker 节点都应打上
node.longhorn.io/create-default-disk=true标签。 - 专用存储节点(可选): 对于高 IOPS 场景,建议使用独立节点并打上
node.longhorn.io/only-storage-node=true标签,避免与计算 Pod 争抢资源。
3.2.2 硬件资源最低要求
| 资源类型 | 最小配置 | 生产推荐 |
|---|---|---|
| CPU | 2 核 | 8 核+ |
| 内存 | 4 GB | 32 GB+ |
| 系统盘 | 40 GB (SSD) | 200 GB (NVMe) |
| 数据盘 | 100 GB (SSD) | 1 TB+ (NVMe/企业级 SSD) |
| 网络带宽 | 1 Gbps | 10 Gbps+ (推荐 RoCE/RDMA) |
💡 规划建议: 数据盘建议使用独立的块设备(如
/dev/sdb),不要与系统盘共用。Longhorn 会自动发现并管理这些磁盘,但需要确保磁盘上无分区表或文件系统。
3.3 操作系统与内核参数调优
操作系统层面的调优是 Longhorn 性能的基石。主要涉及 iSCSI 发起端、NFS 客户端以及文件系统挂载参数。
3.3.1 操作系统选型
Longhorn 官方支持以下 Linux 发行版,建议优先选择 LTS 版本:
- Ubuntu: 22.04 LTS / 24.04 LTS(推荐,社区支持最好)
- Debian: 12 (Bookworm)
- RHEL / Rocky Linux: 9.x
- openSUSE Leap: 15.5+
3.3.2 内核模块加载
Longhorn 依赖 iSCSI 和 NFS 内核模块。请确保以下模块已加载:
# 加载 iSCSI 相关模块
modprobe iscsi_tcp
modprobe ib_iser # 如果使用 RDMA
# 加载 NFS 模块
modprobe nfs
modprobe nfsd
# 持久化配置(写入 /etc/modules-load.d/longhorn.conf)
cat <<EOF > /etc/modules-load.d/longhorn.conf
iscsi_tcp
nfs
nfsd
EOF
3.3.3 关键内核参数调整
以下参数直接影响 Longhorn 的数据传输效率和稳定性。请在所有存储节点上执行:
# 调整 iSCSI 超时与重试参数
cat <<EOF >> /etc/sysctl.d/99-longhorn.conf
# iSCSI 参数
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 8
# NFS 参数(提升并发性能)
sunrpc.tcp_slot_table_entries = 128
sunrpc.udp_slot_table_entries = 128
# 文件系统与内存
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.swappiness = 10
# 网络缓冲区(针对 10GbE 网络)
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
EOF
# 立即生效
sysctl --system
🔧 参数说明:
tcp_keepalive_*:防止 iSCSI 连接因长时间空闲而被中间防火墙断开。tcp_slot_table_entries:增加 NFS 并发 RPC 槽位数,提升多线程读写性能。dirty_ratio / dirty_background_ratio:控制脏页回写策略,避免突发 IO 导致延迟抖动。swappiness=10:减少 swap 使用,优先使用物理内存,降低长尾延迟。
3.4 文件系统与挂载选项
Longhorn 对底层文件系统有特定要求。推荐使用 ext4 或 XFS,并启用特定的挂载选项以提升性能和数据安全性。
3.4.1 文件系统格式化
# 使用 ext4(推荐,兼容性最好)
mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb
# 使用 XFS(适合大文件顺序读写)
mkfs.xfs -f -m reflink=0 /dev/sdb
3.4.2 挂载选项
在 /etc/fstab 中配置数据盘挂载,建议使用以下选项:
# ext4 挂载示例
/dev/sdb /var/lib/longhorn ext4 defaults,noatime,nodiratime,data=ordered,barrier=1 0 2
# XFS 挂载示例
/dev/sdb /var/lib/longhorn xfs defaults,noatime,nodiratime,allocsize=1m 0 2
- noatime / nodiratime: 禁止更新访问时间,减少元数据写入,提升随机读写性能。
- data=ordered: ext4 的默认模式,保证数据先于元数据落盘,防止崩溃后文件系统不一致。
- barrier=1: 确保写屏障启用,防止电源故障导致的数据损坏。
- allocsize=1m: XFS 预分配大小,减少文件碎片,适合 Longhorn 的卷文件。
3.5 环境准备总览图
下图展示了从操作系统层到 Kubernetes 集群层的完整环境准备链路:
3.6 验证清单
在继续 Helm 部署之前,请逐项确认以下环境准备条件:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| Kubernetes 版本 | kubectl version --short |
Server Version ≥ v1.21 |
| iSCSI 模块 | lsmod | grep iscsi_tcp |
模块已加载 |
| NFS 模块 | lsmod | grep nfs |
模块已加载 |
| 内核参数 | sysctl net.ipv4.tcp_keepalive_time |
值为 120 |
| 数据盘挂载 | mount | grep /var/lib/longhorn |
显示 noatime, data=ordered |
| 节点标签 | kubectl get nodes --show-labels |
存储节点包含 create-default-disk=true |
✅ 自动化验证脚本: 建议将上述检查项写入 Shell 脚本,在每台节点上执行。如果任何一项检查失败,请先修复再继续部署,否则后续的 Helm 安装可能因环境问题导致回滚。