Longhorn
31 May 2023 - joy717
csi相关
- 创建出pvc
- csi-provisioner监控到新pvc(provisioner虽然是多例,但会选举出一个实例进行服务)
- 通过csi driver的socket调用本机csi-plugin
- 调用longhorn-manager的svc创建lh volume
- volume_controller监控到新的lh volume
- volume_controller创建对应的engine/replica instance
设备关联:
- instance-manager-e pod中,/var/run/目录下,创建一个pvc的socket.
- 将这个socket作为iscsi的新建的lun对应的backstore/block下的设备.(即用tgtadm创建lun的时候, --backing-store参数)(即iscsi服务端创建一个lun)
- 用nsenter命令,在宿主机上用iscsiadm login到对应的lun,此时宿主机上自动创建出/dev/vdxx
- 用nsenter命令,在宿主机上创建出设备/dev/longhorn/pvc-xxxx, (mknod命令,将/dev/longhorn/pvc-xxxx,的major/minor number指定成跟/dev/vdxx的一样,即指向同一块设备)
- csi-plugin, 将/dev/longhorn/pvc-xxxx挂载到/var/lib/kubelet/plugins/kubernetes.io/csi/volumeDevices/publish/pvc-xxxx
- instance-manager-r pod所在节点,/var/lib/longhorn/replicas/pvc-xxx 最终落盘数据,存在此处
instance manager:
instance-manager pod里面包含:
- grpc服务(负责pod内process的管理)
- cli工具,数据封装/解封,调用步骤1的grpc服务,创建process
process是用longhorn-engine(lonhorn的engineimage对应的二进制)这个cli启动的.
longhorn-manager监听各种crd状态,通过调用instance-manager里的grpc服务,创建process. process再走iscsi相关流程.
pod内服务
代码项目longhorn-engine controller(engine) 提供grpc服务,控制volume、replicas、backup等。
代码项目longhonr-engine replica:
- 提供grpc服务,控制replicas以及disk。
- 提供一个rpc服务,数据传输。
相关目录
/dev/xxxx iscisadm登录后,产生的本地设备
/dev/longhorn/pvc-xxx longhorn设备. 通过mknod与iscisadm 登录后的设备同min/max number. csi-plugin会将此设备挂到/var/lib/kubelet/plugins/kubernetes.io/csi/volumeDevices/publish/pvc-xxxx.
/var/lib/longhorn/replicas/pvc-xxx 最终落盘数据,存在此处
instance-manager-e pod里面,/var/run/ 底下,有个对应pvc的socket. 作为iscsi的target lun.
数据流:
- pod往pvc挂载的目录里面读写,以下以写为例
- 对应pod目录为:/var/lib/kubelet/pods/xxxxx/volumeDevices/kubernetes.io~csi/pvc-xxxx
- 上面的目录实际上,是一个软链接,实际为 /var/lib/kubelet/plugins/kubernetes.io/csi/volumeDevices/publish/pvc-xxxx
- 步骤3的目录,实际为/dev/longhorn/pvc-xxxx的挂载点
- /dev/longhorn/pvc-xxxx实际指向/dev/xxxx,即iscsiadm登录之后,创建出来的设备.(因为major/minor number一致)
- 往/dev/xxxx设备里面写,会通过iscsi,写入到服务端 target的lun里面。而这个实际指向instance-manager-e里面的/var/run/xxxx.socket
- instance-manager-e pod里面对应的controller进程,会监听这个socket,之后,通过dataconn.Server(server1),将读到的内容,转化成longhorn自己的一套协议,写入后端3个replicas. 这边也是通过dataConn, 只不过dataConn.client在controller进程里,对应的dataConn.Server(server2),在replicas进程.
- instance-manager-r pod里面对应的replicas进程,监听一个独立的tcp端口,dataconn.Server(server2),将读到的内容,转义一下,写入server2的后端,真正的磁盘目录/var/lib/longhorn/replicas/pvc-xxxx