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):
安装后务必启动并启用iscsid服务:
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的默认设置偏向通用场景,生产多集群环境必须针对性能、可用性和资源消耗进行调整。以下为关键设置项及其推荐值。
3.6 通过Longhorn UI进行设置调整
除Helm参数外,Longhorn UI提供图形化设置面板。以下为通过UI调整关键参数的步骤。
- 访问UI:
kubectl -n longhorn-system port-forward svc/longhorn-frontend 8080:80,浏览器打开http://localhost:8080 - 进入Setting页面:左侧导航栏点击 Setting
- 调整关键参数:
| 设置项 | 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用于区分备份目标中的卷归属,避免多集群共享同一备份存储时发生卷名冲突。
在跨集群场景中,务必为每个集群的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错误