longhorn 部署
安装 longhornctl
# For AMD64 platform
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.9.0/longhornctl-linux-amd64
# For ARM platform
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.9.0/longhornctl-linux-arm64
检查硬件环境
KUBECONFIG=/etc/rancher/k3s/k3s.yaml longhornctl check preflight
# 或者 longhornctl check preflight --kube-config=.kube/config
目前 v1.9.0 版本这两个命令都可以,但是 –help 里并没有提示 kube-config 这个 flag。可以看这个讨论
安装依赖
longhornctl --kube-config ~/.kube/config --image longhornio/longhorn-cli:v1.9.0 install preflight
这个命令会把所有机器上都装上 longhorn 的依赖。
备份配置
https://github.com/longhorn/longhorn/discussions/8087
https://longhorn.io/docs/1.9.1/snapshots-and-backups/backup-and-restore/set-backup-target/#set-up-a-local-testing-backupstore
https://www.cnblogs.com/hacker-linner/p/15183055.html
问题排查
pvc-xxxx is not ready for workloads
这种在 ui 页面上也能看到 pvc 卷是 not ready 状态。
首先看 pvc 的状态(我用的 k9s,这里是列表的内容)
nezha-data-pvc Bound pvc-f8575387-b277-4448-a6c9-5da12fc51b92 300Mi RWO longhorn 10m
状态是 Bound,是正常的。
然后看 volumes.longhorn.io 的状态
pvc-f8575387-b277-4448-a6c9-5da12fc51b92 v1 detached faulted 314572800 11m
状态为 faulted。
describe 它看看,
currentNodeID: ""
expansionRequired: false
frontendDisabled: false
isStandby: false
kubernetesStatus:
lastPVCRefAt: ""
lastPodRefAt: ""
namespace: default
pvName: pvc-f8575387-b277-4448-a6c9-5da12fc51b92
pvStatus: Bound
pvcName: nezha-data-pvc
workloadsStatus:
- podName: nezha-dashboard-798489ddff-phfxk
podStatus: Pending
workloadName: nezha-dashboard-798489ddff
workloadType: ReplicaSet
lastBackup: ""
lastBackupAt: ""
lastDegradedAt: ""
ownerID: vvps3
remountRequestedAt: ""
restoreInitiated: false
restoreRequired: false
robustness: faulted
shareEndpoint: ""
shareState: ""
state: detached
- robustness: faulted - 卷处于故障状态
- state: detached - 卷处于分离状态
- currentNodeID: "" - 没有分配到节点
查看 replicas
pvc-f8575387-b277-4448-a6c9-5da12fc51b92-r-bd088c48 v1 stopped vvps3 89e7d389-1af6-4566-ac7f-5de74b5670da 28m
pvc-f8575387-b277-4448-a6c9-5da12fc51b92-r-c778fd5b v1 stopped vvps2 b7ec3536-c180-423b-8a70-eafec2d1ce86 28m
两个副本都有问题,是 stoped 状态。
查看 longhorn-manager 日志
time="2025-07-20T16:07:13Z" level=info msg="Creating replica /host/data01/longhorn/replicas/pvc-f8575387-b277-4448-a6c9-5da12fc51b92-5657abcc, size 314572800/512" func="replica. │
│ rror running start replica command" func=cmd.ReplicaCmd.func1 file="replica.go:89" error="mkdir /host/data01/longhorn/replicas/pvc-f8575387-b277-4448-a6c9-5da12fc51b92-5657abcc: no suc
确定原因,目录无法创建。
通过 ’longhorn-manager’ pod 进去查看,确实没有 /home/data01/longhorn 这个目录。(这也正常,我定义的是 /data01/longhorn/)。
查看 nodes.longhorn.io 描述
disks:
default-disk-b2ac78d17fcce181:
allowScheduling: true
diskDriver: ""
diskType: filesystem
evictionRequested: false
path: /data01/longhorn
storageReserved: 10737418240
tags:
- longhorn-storage
去 longhorn-manager pod 里看宿主机的挂载目录。
longhorn-manager-cx8pr:/ # mount | grep host
/dev/vda1 on /host/boot type xfs (ro,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
udev on /host/dev type devtmpfs (rw,relatime,size=1981624k,nr_inodes=495406,mode=755,inode64)
devpts on /host/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /host/dev/shm type tmpfs (rw,nosuid,nodev,inode64)
mqueue on /host/dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
hugetlbfs on /host/dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
proc on /host/proc type proc (ro,relatime)
systemd-1 on /host/proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=0,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=16415)
binfmt_misc on /host/proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
/dev/vda1 on /host/etc type xfs (ro,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/vda1 on /etc/hosts type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/vda1 on /etc/hostname type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
这里 daemonset/longhorn-manager 里这个目录是有的,但是 longhorn 还有另外一个类型叫做 instancemanagers,里面是将宿主机挂载到了容器里,但是 /host/data01 是无法访问的,因为这个 data01 在宿主机里是软链接。
硬盘的多重绑定
我的 vps 上有一块数据盘,默认绑定到了 /home 下。如果我创建 /home/data01 并将 /home/data01 软链接到 /data01,然后将 /data01 挂在到容器(longhorn 的 instance manger 上),在 daemonset/instance manager 上可以访问,但是在 instancemanager 下无法访问,里面的宿主机目录都被挂载到了/host 下,而访问 /home/data01 会提示 /home/data01 不存在。
所以这里尝试新的办法,直接在宿主机上将 /data01 也指向到新的盘,也就是 /data01 和 /home 都挂到数据盘上,这个目录里的内容是一样的。
这里 /home 以经挂载好了,所以 /data01 不能再挂载,要用绑定。新建 /data01 目录,然后执行
sudo mount --bind /data01 /data
然后再修改 /etc/fstab
/dev/vdb1 /home ext4 defaults 0 0
/home /data01 none bind 0 0
官方也说了不要用软连接
