![iSCSI 作为 KVM 存储后端:有关每个 VM 的目标和 LUN 的最佳实践](https://linux22.com/image/689306/iSCSI%20%E4%BD%9C%E4%B8%BA%20KVM%20%E5%AD%98%E5%82%A8%E5%90%8E%E7%AB%AF%EF%BC%9A%E6%9C%89%E5%85%B3%E6%AF%8F%E4%B8%AA%20VM%20%E7%9A%84%E7%9B%AE%E6%A0%87%E5%92%8C%20LUN%20%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.png)
我正在使用 iSCSI 池作为几个虚拟机的存储后端,我想知道其他人如何在这种用例中使用目标和 LUN。
我一开始使用一个名为的目标iqn.2016-06.iscsihost:kvmguests
,每个虚拟机都有一个 LUN。然而,这导致与虚拟机关联的存储目标的一些名称不太理想(请参阅这个问题),因此我想知道我是否应该切换到每个 VM 一个目标(每个目标可能有几个 LUN,例如用于单独的 OS 磁盘等)。这会产生副作用,即名称非常简洁,在 KVM 方面不容易混淆(例如iqn.2016-06.iscsihost:webserver01
,iqn.2016-06.iscsihost:database07
等)。我不确定这会产生什么影响,因此非常感谢任何指示。
所以问题是:最佳做法是什么?每个虚拟机一个目标,一个 (或多个) LUN,还是每个虚拟机一个目标?
更新: 想想看,必须将每个 iSCSI 目标作为存储池添加到每个 KVM 主机。这非常不方便,因为每次添加新 VM 时都必须更改每个 KVM 主机的配置...或者我遗漏了什么。在现实世界中如何做到这一点?
答案1
我不能代表 KVM 发言,但我们正在使用 iSCSI 将带有 4 个 ESXi 主机的 VMWare VSphere 集群连接到我们的 Dell Compellent 存储系统,并且我们只是为大约 4-5 个虚拟机创建数据存储,目前每个 LUN 大约 2 TB。您不希望太多虚拟机位于单个 iSCSI 连接上,但您也不希望每个虚拟机有多个 LUN 带来巨大的管理开销,特别是当您的环境超过 4-5 个虚拟机时。“最佳”设置取决于您的环境、存储后端的功能(多个控制器、负载平衡等)和虚拟化解决方案。
答案2
Libvirt 项目最初设计 iSCSI 存储以存在于 KVM 主机上的池中。正如您所观察到的,使用 iSCSI 这样做没有多大意义,特别是如果您想要移动虚拟机。我相信这就是 QEMU 项目使用库实现自己的“内置 iSCSI”驱动程序的原因libiscsi
。这样,虚拟机本身就可以连接到 iSCSI 目标进行存储。如果 QEMU 进程自行连接到目标,则它不依赖于主机,并且可以很容易地实时迁移到其他主机,而主机无需了解任何有关 iSCSI 存储基础架构的信息。
使用原始 QEMU 很容易做到这一点,如下所示:
-device virtio-scsi-pci,id=scsi0 \
-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,drive=disk0 \
-drive id=disk0,file=iscsi://server.example.com/iqn.2000-01.com.example:server:target/0,if=none,cache=none,format=raw,media=disk,discard=unmap
在这里找到 QEMU 文档:
https://www.qemu.org/docs/master/qemu-doc.html#Device-URL-Syntax
我已经能够使 Libvirt 抽象像这样工作:
<domain type='qemu'>
<!-- snip -->
<devices>
<!-- snip -->
<controller type='scsi' index='0' model='virtio-scsi'>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
<disk type='network' device='lun'>
<driver name='qemu' cache='none' discard='unmap'/>
<source protocol='iscsi' name='iqn.2000-01.com.example:server:target/0'>
<host name='server.example.com' port='3260'/>
</source>
<target dev='sda' bus='scsi'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<!-- snip -->
</devices>
</domain>