安装 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

官方也说了不要用软连接
image.png