3. Longhorn安装与配置:在Kubernetes上安装Longhorn、存储类(StorageClass)配置、默认设置调优

3.1 安装前环境检查与依赖

在Kubernetes集群上安装Longhorn之前,必须确认以下前置条件已满足。缺失任何一项都可能导致安装失败或运行时异常。

检查项 最低要求 推荐值 验证命令
Kubernetes版本 v1.21+ v1.27+ kubectl version --short
节点数量 3个(含1个master) 3个worker节点 kubectl get nodes
操作系统 Linux kernel 3.10+ Ubuntu 22.04 / Rocky Linux 9 uname -r
已安装工具 open-iscsi, nfs-common 同左 iscsiadm --version
文件系统 ext4 / xfs ext4 df -Th
CPU / 内存 每节点2核 / 4GB 每节点4核 / 8GB nproc; free -h
关键依赖安装(Ubuntu/Debian):
sudo apt-get update && sudo apt-get install -y open-iscsi nfs-common
安装后务必启动并启用iscsid服务:sudo systemctl enable --now iscsid

3.2 使用Helm安装Longhorn

推荐使用Helm chart进行安装,便于版本管理和参数覆盖。以下为生产级安装命令及核心参数说明。

# 添加Longhorn Helm仓库
helm repo add longhorn https://charts.longhorn.io
helm repo update

# 创建命名空间
kubectl create namespace longhorn-system

# 安装Longhorn(带生产调优参数)
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --set persistence.defaultClass=true \
  --set persistence.defaultClassReplicaCount=3 \
  --set defaultSettings.replicaSoftAntiAffinity=false \
  --set defaultSettings.storageOverProvisioningPercentage=200 \
  --set defaultSettings.storageMinimalAvailablePercentage=10 \
  --set defaultSettings.nodeDownPodDeletionPolicy=do-nothing \
  --set defaultSettings.allowRecurringJobWhileVolumeDetached=true \
  --set csi.kubeletRootDir=/var/lib/kubelet
生产环境注意:
csi.kubeletRootDir 必须与集群实际kubelet路径一致。若使用kubeadm默认安装,路径为 /var/lib/kubelet;若使用RKE或K3s,路径可能不同。路径错误将导致CSI组件无法挂载卷。

3.3 验证安装状态

安装完成后,通过以下命令确认所有Pod处于Running状态,并检查Longhorn Manager与UI是否正常。

# 检查Pod状态
kubectl -n longhorn-system get pod

# 预期输出示例(部分):
# NAME                                        READY   STATUS    RESTARTS
# longhorn-manager-xxxxx                      1/1     Running   0
# longhorn-ui-xxxxx                           1/1     Running   0
# longhorn-csi-plugin-xxxxx                   2/2     Running   0
# instance-manager-e-xxxxx                    1/1     Running   0
# instance-manager-r-xxxxx                    1/1     Running   0

# 查看StorageClass
kubectl get sc

# 预期输出:
# NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE
# longhorn (default)   driver.longhorn.io      Delete          Immediate

3.4 存储类(StorageClass)配置详解

Longhorn安装后自动创建名为 longhorn 的默认StorageClass。生产环境中通常需要根据工作负载类型创建多个自定义StorageClass。以下为三种典型场景的配置示例。

场景 副本数 数据局部性 磁盘选择器 适用负载
高性能SSD 2 best-effort ssd 数据库、缓存
大容量HDD 3 disabled hdd 日志、备份
关键业务 3 strict-local nvme 有状态中间件
# 示例:高性能SSD存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: longhorn-ssd
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "2"
  staleReplicaTimeout: "30"
  fromBackup: ""
  fsType: "ext4"
  dataLocality: "best-effort"
  diskSelector: "ssd"
  nodeSelector: "storage-role=fast"
  recurringJobSelector: '[{"name":"snap-daily","isGroup":false}]'
参数说明:
  • dataLocality:disabled(默认,副本可跨节点)、best-effort(尽量本地)、strict-local(强制本地,副本必须与Pod同节点)
  • diskSelector:匹配Longhorn节点磁盘的标签,需提前在Longhorn UI中为磁盘打标签
  • recurringJobSelector:关联自动快照/备份策略,支持按名称或组引用

3.5 默认设置调优

Longhorn的默认设置偏向通用场景,生产多集群环境必须针对性能、可用性和资源消耗进行调整。以下为关键设置项及其推荐值。

Longhorn 默认设置调优决策树 调优入口 副本与高可用 性能与资源 故障恢复策略 defaultReplicaCount: 3 replicaSoftAntiAffinity: false replicaZoneSoftAntiAffinity: true storageOverProvisioning: 200% storageMinimalAvailable: 10% concurrentBackupLimit: 5 nodeDownPodDeletionPolicy 值: do-nothing allowRecurringJobWhileDetached: true 调优建议 • 副本数3保证跨节点容灾,关闭软反亲和性确保副本严格分散 • 超配比例200%适合日志/开发环境,生产数据库建议降至100% • nodeDownPodDeletionPolicy设为do-nothing,避免节点临时故障导致卷被强制删除 • 启用allowRecurringJobWhileDetached,确保离线卷仍可执行备份

3.6 通过Longhorn UI进行设置调整

除Helm参数外,Longhorn UI提供图形化设置面板。以下为通过UI调整关键参数的步骤。

  1. 访问UI:kubectl -n longhorn-system port-forward svc/longhorn-frontend 8080:80,浏览器打开 http://localhost:8080
  2. 进入Setting页面:左侧导航栏点击 Setting
  3. 调整关键参数:
设置项 UI路径 生产推荐值 说明
Replica Auto Balance General → Replica Auto Balance best-effort 自动平衡副本分布,避免磁盘倾斜
Guaranteed Engine CPU General → Guaranteed Engine CPU 0.25 为每个引擎实例预留CPU,提升IO稳定性
V2 Data Engine General → V2 Data Engine false(默认) SPDK引擎,需内核支持vfio-pci,非必要不开启
Snapshot Max Count Snapshot → Snapshot Max Count 250 限制每个卷的快照数量,防止存储膨胀
多集群环境特别提醒:
在跨集群场景中,务必为每个集群的Longhorn设置不同的 clusterID(位于Setting → General → Cluster ID)。该ID用于区分备份目标中的卷归属,避免多集群共享同一备份存储时发生卷名冲突。

3.7 安装后验证与健康检查

完成安装与调优后,执行以下验证流程确保Longhorn集群正常工作。

# 1. 创建测试PVC
kubectl create namespace longhorn-test
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
  namespace: longhorn-test
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 1Gi
EOF

# 2. 挂载测试Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: longhorn-test
spec:
  containers:
  - name: test
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-pvc
EOF

# 3. 验证读写
kubectl exec -n longhorn-test test-pod -- sh -c "echo 'Longhorn OK' > /data/test.txt && cat /data/test.txt"

# 4. 清理
kubectl delete ns longhorn-test
验证通过标志:
  • Longhorn UI中Volume状态为 Healthy,且显示3个活跃副本
  • Engine与Replica进程分别运行在不同节点上(满足反亲和性)
  • CSI Plugin日志无 Failed to mount 或 context deadline exceeded 错误