Longhorn 是一款专为 Kubernetes 设计的云原生分布式存储系统,提供简单易用、高可靠性的持久化存储能力。
本文基于 Longhorn v1 Data Engine 进行实践。
环境信息
- Longhorn:v1.12.1
- Kubernetes:RKE2 v1.35.8+rke2r1
- 集群规模:3 个节点
- 节点规格:每个节点
4c8g
安装前准备
所有节点安装依赖项:
1 2 3 4
| apt-get update apt-get install -y open-iscsi nfs-common cryptsetup dmsetup systemctl enable iscsid --now modprobe iscsi_tcp
|
安装 longhornctl:
1 2 3 4 5 6
| LonghornVersion=v1.12.1 OS=linux ARCH=amd64 curl -L https://github.com/longhorn/cli/releases/download/${LonghornVersion}/longhornctl-${OS}-${ARCH} -o longhornctl chmod +x longhornctl mv ./longhornctl /usr/local/bin/longhornctl
|
使用 longhornctl 进行预检:
1 2 3 4
| longhornctl --kubeconfig ~/.kube/config \ --image harbor.warnerchen.com/rancher/mirrored-longhornio-longhorn-cli:v1.12.1 \ check preflight
|
如果缺少依赖,也可以通过 longhornctl 进行安装:
1 2 3 4
| longhornctl --kubeconfig ~/.kube/config \ --image harbor.warnerchen.com/rancher/mirrored-longhornio-longhorn-cli:v1.12.1 \ install preflight
|
如果不使用 multipath,需要将其禁用:
1
| systemctl disable multipathd multipathd.socket --now
|
如果需要使用 multipath,需要为 Longhorn 相关设备设置 blacklist:https://longhorn.io/kb/troubleshooting-volume-with-multipath/
使用独立磁盘挂载 /var/lib/longhorn:
1 2 3 4 5 6 7
| wipefs -n /dev/sdb mkfs.ext4 /dev/sdb mkdir -p /var/lib/longhorn UUID=`blkid /dev/sdb | awk -F'"' '{ print $2 }'` echo "UUID=$UUID /var/lib/longhorn ext4 defaults,noatime 0 2" >> /etc/fstab mount -a
|
安装 Longhorn
准备 Helm Chart Values:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| cat <<EOF > longhorn-v1-data-engine-values.yaml global: imageRegistry: "harbor.warnerchen.com"
image: longhorn: engine: repository: rancher/mirrored-longhornio-longhorn-engine manager: repository: rancher/mirrored-longhornio-longhorn-manager ui: repository: rancher/mirrored-longhornio-longhorn-ui instanceManager: repository: rancher/mirrored-longhornio-longhorn-instance-manager shareManager: repository: rancher/mirrored-longhornio-longhorn-share-manager backingImageManager: repository: rancher/mirrored-longhornio-backing-image-manager supportBundleKit: repository: rancher/mirrored-longhornio-support-bundle-kit csi: attacher: repository: rancher/mirrored-longhornio-csi-attacher provisioner: repository: rancher/mirrored-longhornio-csi-provisioner nodeDriverRegistrar: repository: rancher/mirrored-longhornio-csi-node-driver-registrar resizer: repository: rancher/mirrored-longhornio-csi-resizer snapshotter: repository: rancher/mirrored-longhornio-csi-snapshotter livenessProbe: repository: rancher/mirrored-longhornio-livenessprobe
service: ui: type: NodePort
persistence: # 后续测试手动创建用途明确的 StorageClass createStorageClass: false dataEngine: v1
defaultSettings: # 默认使用 v1 Data Engine,不使用 v2 v1DataEngine: true v2DataEngine: false
# 只在明确标记的节点上创建默认磁盘 createDefaultDiskLabeledNodes: true EOF
|
安装 Longhorn:
1 2 3 4 5 6 7
| helm repo add longhorn https://charts.longhorn.io helm repo update helm upgrade --install longhorn longhorn/longhorn \ --namespace longhorn-system \ --create-namespace \ --version 1.12.1 \ -f longhorn-v1-data-engine-values.yaml
|
会部署以下组件:
| 组件 |
运行方式 |
作用 |
| csi-attacher |
Deployment |
监听 VolumeAttachment,负责 Volume Attach / Detach |
| csi-provisioner |
Deployment |
根据 PVC 创建 Longhorn Volume |
| csi-resizer |
Deployment |
处理 PVC 扩容请求 |
| csi-snapshotter |
Deployment |
创建和管理 Volume Snapshot |
| longhorn-csi-plugin |
DaemonSet |
Kubernetes CSI Node Plugin,负责 Volume mount / unmount |
| longhorn-manager |
DaemonSet |
Longhorn 核心服务,管理 Volume、Engine、Replica |
| engine-image |
DaemonSet |
提供 Longhorn Engine 运行镜像 |
| instance-manager |
DaemonSet |
管理 Engine 和 Replica 进程生命周期 |
| longhorn-driver-deployer |
Deployment |
部署 CSI Driver 相关资源 |
| longhorn-ui |
Deployment |
Longhorn Web 管理界面 |
常用功能
设置存储节点
由于设置了 defaultSettings.createDefaultDiskLabeledNodes: true,所以需要手动添加 Label 才能作为存储节点:
1
| kubectl label node test-2 node.longhorn.io/create-default-disk=config
|
添加磁盘:
1 2 3 4 5 6 7 8 9 10 11 12 13
| kubectl annotate node test-2 \ node.longhorn.io/default-disks-config='[ { "name":"var-lib-longhorn", "path":"/var/lib/longhorn", "allowScheduling":true, "diskType": "filesystem", # 预留的磁盘容量,为 0 则取 defaultSettings.storageMinimalAvailablePercentage 的值,默认预留 25% "storageReserved": 0, "tags": ["ssd"] } ]'
|
通过 Longhorn UI 查看节点情况:


通过标签进行存储分层
如果集群中的存储节点挂载了不同类型的磁盘,可以通过节点 / 磁盘标签进行分类:


创建自定义 StorageClass
Longhorn 可以创建不同用处的 StorageClass。
例如分别创建基于 SSD 和 HDD 的 StorageClass:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| cat <<EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: longhorn-v1-ssd provisioner: driver.longhorn.io allowVolumeExpansion: true reclaimPolicy: Retain volumeBindingMode: Immediate parameters: dataEngine: "v1" # 集群中三个节点都有 SSD 磁盘,可以将 Replica 设置为 3 numberOfReplicas: "3" diskSelector: "ssd" --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: longhorn-v1-hdd provisioner: driver.longhorn.io allowVolumeExpansion: true reclaimPolicy: Retain volumeBindingMode: Immediate parameters: dataEngine: "v1" # 集群中仅有一个节点有 HDD 磁盘,所以 Replica 设置为 1 numberOfReplicas: "1" diskSelector: "hdd" EOF
|
创建 PVC 和 Workload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| cat <<EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: app-ssd-pvc namespace: default spec: accessModes: - ReadWriteOnce storageClassName: longhorn-v1-ssd resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: app-ssd namespace: default spec: replicas: 1 selector: matchLabels: app: app-ssd template: metadata: labels: app: app-ssd spec: containers: - name: nginx image: harbor.warnerchen.com/library/nginx:mainline volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: app-ssd-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: app-hdd-pvc namespace: default spec: accessModes: - ReadWriteOnce storageClassName: longhorn-v1-hdd resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: app-hdd namespace: default spec: replicas: 1 selector: matchLabels: app: app-hdd template: metadata: labels: app: app-hdd spec: containers: - name: nginx image: harbor.warnerchen.com/library/nginx:mainline volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: app-hdd-pvc EOF
|

通过 UI 查看 Volume 状态:


重建 Replica
当 Volume 存在多个 Replica 的时候,可以通过删除重建其中的某个 Replica:


磁盘扩容
主要分为以下场景:
- 如果
/var/lib/longhorn 本身做了 LVM,那么可以新增磁盘后直接扩容至对应的 LV。
- 如果
/var/lib/longhorn 本身直接挂载某块磁盘或磁盘分区,新磁盘可以独立挂载,然后添加至 Longhorn:
1 2 3
| 第一块盘 → /var/lib/longhorn 第二块盘 → /var/lib/longhorn-xxx 第三块盘 → /var/lib/longhorn-yyy
|