Longhorn使用总结

Longhorn主要有两个组件构成

  1. Longhorn Engine 数据面板
  2. Longhorn Manager 控制面板

v0.7.0

Longhorn Engine

Engine有两种工作模式,enginereplica

他们所使用的镜像是一样的,以v0.7.0为例, 镜像地址均为 longhornio/longhorn-engine:v0.7.0

replica模式运行的进程用于在磁盘上存储volume的数据,每个volume对应多个replica,每个replica包含volume的完整数据,只要一个replica是存活的,就可以恢复volume的完整数据

engine模式运行的进程用于连接replica,实现了volume的数据面板

  • 任何volume的写操作,将会分发到该volume的所有replica
  • 任何volume的读操作,将会在任意一个健康的replica上执行

在k8s中,运行replica的pod的名字类似于 instance-manager-*,通过crd里面的instancemanagers.longhorn.io来控制该pod

在v0.6.0以前,是一个replica对应一个k8s的pod,为了解决单台机器Pod限制的问题,引入了instance-manager, 会在instance-manager运行多个进程,每个Node上通常有两个instance-manager的Pod:

  • instance-manager-e-* 以engine模式运行的进程在该Pod内,每个volume对应一个进程
  • instance-manager-r-* 以replica模式运行的进程在该Pod内,每个replica对应一个进程

需要注意的是会存在一个与engine镜像相同的 engine-image-ei-* 的daemonset,它的作用只是将longhorn的一些二进制包拷贝到Node宿主机的某个目录上 /var/lib/rancher/longhorn/engine-binaries/ 并无其他作用

engine的前端就是就是快存储设备,由于当前版本是用iSCSI来实现快存储设备,依赖stgt,和iscsiadm。

iSCSI补充:
iSCSI 全称 Internet Small Computer Systems Interface,是SCSI的网络版,基于TCP协议。iSCSI通过将SCSI命令封装成网络包并定向到iSCSI target,典型的iSCSI target包括SAN,NAS,Tape,LUN
iSCSI的target纯软件实现,也有硬件设备,类似Host-based adapters (HBA) 和 iSOE,好处是可以带来更高的性能和功能,不消耗服务器的CPU

Longhorn Manager

longhorn会创建一个 longhorn-manager Daemonset, 使用的镜像地址是longhornio/longhorn-manager:v0.7.0
longhorn-manager负责:

  1. 根据k8s的调用请求创建pv (注意,longhorn-manager是和k8s相关的,上一节的engine与k8s无关,可独立运行)
  2. 在集群中调度engine
  3. 支持定时备份,多磁盘管理,灾难恢复卷等功能
  4. 监控已attached磁盘的状态

longhorn原理

下面创建一个卷,来简述longhorn的原理

首先在ui界面创建一个1G的卷,名称为tmptest

将起attach到某个node上,并进入该node

1
2
3
ls -lh /dev/longhorn/*
# 输出如下:
brw-rw---- 1 root root 8, 16 Mar 09 19:05 /dev/longhorn/tmptest

可以看到该卷已在 /dev 目录下创建了一个快存储设备

主设备号(major): 8
次设备号(minor): 16

devices,可以查询到该device为SCSI disk,(也可在/proc/devices查询到该类型)

1
2
3
4
5
6
7
8
9
10
8 block	SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
...
240 = /dev/sdp Sixteenth SCSI disk whole disk

Partitions are handled in the same way as for IDE
disks (see major number 3) except that the limit on
partitions is 15.

次设备号16代表为该设备(8)的分配的子ID为16个,系统可以保证 8,16 这个组合ID的唯一

可以用xxd /dev/longhorn/tmptest |less 或者 dd if=/dev/longhorn/tmptest bs=1k count=1 | hexdump -C 来简单打印该block的内容

1
2
3
4
5
dd if=/dev/longhorn/tmptest bs=16 count=1 | hexdump -C

# 打印如下内容
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010

通过命令向该block device写入一些东西 echo hello\0 > /dev/longhorn/tmptest
再次执行

1
2
3
4
5
dd if=/dev/longhorn/tmptest bs=16 count=1 | hexdump -C

# 打印如下内容
00000000 68 65 6c 6c 6f 30 00 00 00 00 00 00 00 00 00 00 |hello...........|
00000010

此时,如果在longhorn的replica目录下进入该卷,执行dd if=volume-head-000.img bs=16 count=1 | hexdump -C, 可以看到打印的内容与上述相同,可以看出longhorn只是对写入iSCSI设备的数据原样写入成了一个img文件,需要注意的是这个img文件是稀疏文件(sparse file, 文件的显示大小小于占用大小。因为文件中的空白字节并没有占用实际空间)

1
2
3
4
5
6
# engine 的pod中新加了一个进程:
/usr/local/bin/longhorn controller tmptest --launcher 0.0.0.0:8500 --launcher-id tmptest-e-cf8fb213 --frontend socket --enable-backend tcp --replica tcp://10.244.1.74:10000 --listen 0.0.0.0:10000

# replica 的pod中新加了两个进程
/usr/local/bin/longhorn replica /host/var/lib/rancher/longhorn/replicas/tmptest-8cd25dd0 --size 1073741824 --listen 0.0.0.0:10000
\_ /usr/local/bin/longhorn sync-agent --listen 0.0.0.0:10002 --replica 0.0.0.0:10000 --listen-port-range 10003-10012

参考

Longhorn Architecture Overview
What Is iSCSI and How Does It Work
[block-device]https://www.cnblogs.com/MrVolleyball/p/9993137.html
[disk-editor-for-linux]https://superuser.com/a/1302550

0%