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 集群层的完整环境准备链路:

Longhorn 环境准备总览 1. 操作系统层 • 发行版:Ubuntu 22.04 / Rocky Linux 9 • 内核模块:iscsi_tcp, nfs, nfsd • 内核参数:tcp_keepalive, dirty_ratio, swappiness 2. 文件系统与磁盘层 • 文件系统:ext4 (推荐) 或 XFS • 挂载选项:noatime, nodiratime, data=ordered, barrier=1 3. Kubernetes 集群层 • 版本:v1.28+,启用 CSI 与 VolumeSnapshot • 节点标签:node.longhorn.io/create-default-disk=true 4. Longhorn Helm 部署 Helm install / upgrade --atomic --timeout

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 安装可能因环境问题导致回滚。