VMware vSphere的很多高级特性都依赖于共享存储, 如vMotion, HA: High Availability, DRS: Distributed Resource Schedule等, 它们要生效都需要虚拟机的存储位于共享存储中. vSphere支持的共享存储除了自家的vSAN, 还包括: NFS, iSCSI, 光纤通道: Fibre Channel等.
iSCSI是一个标准协议, 全称为:Internet Small Computer System Interface, 它在以太网上基于TCP/IP协议来传输SCSI协议. SCSI协议是计算机上的I/O传输协议, SCSI控制器通过SCSI总线与硬盘等设备以块为单位传输数据. iSCSI服务器称为target, 客户端称为initiator. iSCSI initiator能够以纯软件实现运行在标准网络适配器上, 也可以以硬件形式实现为专用的HBA卡:(Host Bus Adaptor), 也有带有iSCSCI offload硬件支持的网卡可以来加速iSCSI协议处理.
几乎所有的企业级存储产品都支持iSCSI协议. 在Windows和Linux等操作系统上也都有成熟稳定的iSCSI实现. 在CentOS上配置iSCSI也非常简单, 有大量的文章介绍, 可以参考:
- https://www.thegeekdiary.com/complete-guide-to-configuring-iscsi-in-centos-rhel-7/
- https://www.centlinux.com/2018/08/configure-iscsi-target-initiator-centos-7.html
- https://www.tecmint.com/create-centralized-secure-storage-using-iscsi-targetin-linux/
由于iSCSI存储数据是基于网络传输, 为了提升性能, 可以采用多路径: Multipathing机制来传输数据, 其中的一种实现方式是一个iSCSI session使用多个连接, 叫做MC/S: Multiple Connections per Session.
VMware vSphere支持iSCSI协议. 介绍在vSphere上配置iSCSI的文章也非常多, 可以参考:
- https://4sysops.com/archives/how-to-configure-esxi-6-5-for-iscsi-shared-storage/
- https://xpertstec.com/how-to-connect-iscsi-storage-vcenter-7-openfiler/
- http://woshub.com/add-iscsi-datastore-lun-vmware-esxi/
- https://www.unixmen.com/how-to-create-an-iscsi-target/
- https://stonywall.com/2021/01/15/setting-up-iscsi-on-esxi-7-with-vcenter-7/
- https://kb.synology.com/en-nz/DSM/tutorial/How_to_Use_iSCSI_Targets_on_VMware_ESXi_Server_with_Multipath_Support
VMware vSphere的iSCSI initiator实现也支持Multipathing, 是基于端口绑定: Port Binding实现, 如图:
一般, 在vSphere上配置iSCSI时, 会建立专用的VMkernel接口和网络端口组. 但需要注意的是用于multipathing的端口组的uplink接口, 只能有一个活动上行链路, 并且没有备用上行链路. 如果虚拟交换机维度存在备用上行链路, 在iSCSI端口组上需要将该链路移动未使用的上行链路. 如图:
为了实现multipathing, 需要至少建立两个这样的VMkernel接口和网络端口组, 分别指定不同的上行链路, 然后全部添加到iSCSI software adaptor的端口绑定中, 如图:
可以参考:
https://kb.vmware.com/s/article/2045040
但是, 实际使用Port binding时是有一些注意事项的, 请参考VMware官方KB
Port binding本质上是指定使用哪个VMKernel建立iSCSI网络连接. 当多个VMKernel接口位于相同广播域时, 默认ESXi只会使用第一个接口的路由表, 当需要使用多个连接时, 需要配置Port binding.
参考链接里说, 当多个VMKernel位于不同子网时, 不需要配置Port binding, 但个人感觉, 如果想使用load balance模式去利用多条连接而不是fail over模式, 也是需要配置的.