基于自建IB存储的无盘刀片服务器虚拟化实战

这是2016年3月份我在“桌面云”微信群的一次分享,后发布于“桌面云之云潮涌动”公众号,现将其作为我的第一篇博文。

mark

主题背景

mark
先简单介绍一下今天分享主题的背景,去年我单位接收了一批HPC设备,这批设备之前是用于超算环境,大部分是并行计算,使用Lustre文件系统,而且很多都是无盘环境。因为BOSS说要把这批设备应用于虚拟化方面,所以也就有了本次的分享。

下面,我分几部分来讲一下今天要分享的内容。因起点有点low,范围有点广,水平有限,望批评指正。

InfiniBand

首先,我们来介绍一下IB,说一下IB的概念,拓扑,一些术语和我们的IB设备情况。
mark

IB概念

mark
说了这么多废话了都还没解释IB呢,其实IB就是Infiniband的简称,大家习惯这样叫了。InfiniBand贸易协会(IBTA)成立于1999年,InfiniBand是由InfiniBand行业协会所倡导的,IBTA制定和维护InfiniBand标准。InfiniBand代表了两种计算潮流的融合:下一代I/O(NGIO)和未来的I-O(FIO),大部分NGIO和FIO潮流的成员都加入了InfiniBand阵营。Infiniband的出现实际上是为了解决现有计算网(以太网)、存储网(FC SAN)的一些问题,如以太网广播风暴问题,占用CPU资源,延迟等;还有就是多网的融合(计算网和存储网)。因此Infiniband的优点有自由组网,且彻底解决广播风暴;实现网络协议的完全卸载,既可靠传输,又高效处理,且不占用CPU资源;高带宽,低延迟等等。Infiniband过去在HPC/超算领域应用比较广泛,现在在X86环境也有应用了,不过听说好像有些没落了(求真相)。

IB拓扑

mark
看图哈(盗mellanox的),图上其实已经描述的很清楚了。服务器(计算节点)安装HCA卡,HCA卡接IB边缘交换机,IB边缘交换机接IB核心交换机,IB核心交换机接网关设备。这样看来,倒是有点类似于以太网络,HCA卡类似于网卡,IB边缘交换机类似于2层交换机,IB核心交换机类似于3层交换或者路由器,就网关设备不太一样,这里的网关负责与其它网络(以太网、FC)互通。当然上图交换机这里没有细分是边缘还是核心交换机,我是拿我们这批设备来说明的哈。

IB术语

mark
说到IB有很多的知识点,这里我介绍几个主要的:RDMA(Remote Direct Memory Access),SM(Subnet Manager)和iSER(iSCSI Extensions for RDMA)。RDMA这是一个很重要的技术,直译为远程直接内存访问,就是远程数据存取,牛B的地方就是旁路内核和CPU,所以更快。SM为子网管理器,每个子网必备的,当然它也有主备的概念,可以一主多备。iSER就是iscsi for RDMA的扩展,说简单些就是使iscsi在IB网络上也可以使用RDMA这种技术,那就快好多了呢,后面我在自建IB存储中会使用该技术。其它的知识点,如胖数结构,子网&分区,Qos和路由算法等等,这里就不说了。

IB现状

大家都知道IT技术发展之快,所以我们这批09年的IB设备性能已经out了,不过怎么说呢,和千兆以太网比起来,20Gbps的IB总比1Gbps的以太网要好吧,哈哈。虽然实测到不了20Gbps,但也十几Gbps了,也OK的了。不过现在主流IB网络带宽都在FDR 56Gbps(还有EDR 100Gbps哦)以上了,可怜我们的设备还是最老的20Gbps(4X DDR)。

在IB这块,大家可能听说过一家比较牛B的公司叫mellanox(芯片级厂商,掌握核心科技),我们的IB网络设备也用的mellanox的产品,准确来说是用到mellanox的芯片。具体的,设备中用到的HCA卡(Host Channel Adapters)、IB直通模块、IB核心/边缘交换机等是Voltaire公司产的,而Voltaire的产品用的都是mellanox的芯片,大概在2010年Voltaire被mellanox收购了。

自建IB存储

mark
其次,来说一下自建IB存储。由于我们的IBM刀片服务器全都是无盘的,而且每台刀片都只有一个内部2.5寸盘位,所以只能使用集中存储了。了解了一下市面上的IB存储厂商,国内少的可怜,国外就属大名鼎鼎的DDN了。于是接触了DDN,谈了几轮,后来由于各种原因吧,没有合作成。看来,使用商用IB存储这条路是不通了,汇报给BOSS,然后BOSS说你自己搞定吧,也就有了本节的内容了。其实,无盘使用集中存储我们还可以考虑NFS的,NFS over RDMA技术上是可行的,不过我没有测试这种方案,所以这里就不再介绍了。

可能有的童靴玩过IP SAN,那对ISCSI Target这类开源软件应该有所了解,我这里使用的是TGT,感兴趣的童靴可以测试一下。那就开工了,找了台DELL R720插上HCA卡,装满硬盘,做成RAID10,划一个几百G的系统LUN,其它全部都作为数据LUN。安装CentOS 6.5,安装OFED(HCA卡)驱动,配置IB口IP,用ib_write_bw测试一下速度。将数据LUN分区(GPT)作为LVM,为每台无盘刀片服务器创建2个LV,一个用于安装无盘刀片服务器的操作系统,一个用于存放无盘刀片服务器的数据(虚拟机镜像等),这个过程使用脚本就好了,一共创建了28个LV(针对单台刀片机箱的)。

准备工作做完了,主角该上场了。开始安装TGT,设置targets.conf分享所有的28个lv出去。具体地,要使用backing-store,关闭写缓存,使用initiator-address限制每台刀片服务器只能使用自己的2个LUN(在以太网口和IB口上),配置每台刀片的数据LUN使用iSER,因为BoIB不支持从iSER LUN启动,所以每台刀片的系统LUN不能使用RDMA了。

基本的IB存储已经是配置完了,后面会在配合刀片OS批量安装的时候操作一下。

无盘启动

mark
再者,再来说一下无盘启动。这个实际上是非常重要的一环。可能很多童靴一听到无盘就想起早些年的网吧了,哈哈。这里需要2个方面的支持,一个方面是刀片上的HCA要支持BoIB,不幸的是我们的这款HCA直通模块默认是没有启动ROM的,幸运的是mellanox为我们提供了对应的BoIB的ROM,于是就先做个刷ROM的无盘OS模板,接下来就是批量刷ROM了。第二个方面是既然是无盘大家可能也都猜到了要用到启动服务器,要不无盘刀片怎么知道从哪里可以引导系统啊。启动服务器是重点,下面就来介绍一下无盘启动服务器搭建。

先来介绍几个术语:PXE/gPXE/iPXE,PXE是闭源的,后来有了开源的gPXE,而后又由于gPXE版权问题,又fork出了iPXE。提到PXE我想大家应该都不陌生哈,批量安装系统必备基础,早期都是用pxe+tftp+dhcp+kickstart的,现在可以用cobbler(其实本质都差不多)。PXE只支持tftp这种传输方式,而我们要使用的可是ISCSI SAN启动,所以这里我们可以使用gPXE or iPXE,这两个支持更多的协议,包括HTTP、ISCSI SAN、AoE和BoIB等。我们这里使用iPXE。说到这里,可能有同学会想到前面刷的ROM了,其实里面刷的是gPXE,mellanox在里面做了扩展,以使它的设备支持BoIB。iPXE有多种调用方式,本来我是使用pxelinux调用iPXE的,这在厚节点上是可行的,但是在无盘刀片服务器上不够稳定,后来就改成从dhcp直接调用iPXE了。

搭建启动服务器:安装CentOS6.5,安装OFED驱动,安装配置DHCP+iPXE无盘启动环境。接下来主要要做的是修改dhcp配置和制作特定的“undionly.kpxe“文件。先来说说dhcp的配置,主要点:设定以太网和IB网段,为每台刀片服务器分配固定的IP地址(包括IB口),设定以太口的引导程序,设定IB口的root path等。再来说说undionly.kpxe文件获取及特定undionly.kpxe文件制作。undionly.kpxe是一种iPXE firmware,也是一种boot loader,我们需要在dhcp中调用它来从iSCSI LUN引导和安装OS,那么我们先要获取该文件,从github上git clone一下再make一下就有了,如果仅用这个文件,使用它引导后你只会看到一个ipxe的shell,要从iSCSI LUN引导你还要敲命令这太不厚道了,所以我们还是需要重新编译一个特定的undionly.kpxe文件,以使我们能够从iSCSI LUN引导并安装OS,这实际上就是先做个iPXE的boot menu,然后将其编译到undionly.kpxe文件就可以了。关于这个boot menu的制作这里就不说了哈。当我们从iSCSI LUN引导并安装好OS后就不需要再引导到这个menu了,可以直接设置从iSCSI LUN引导就好了,所以我们需要再做一个特定的undionly.kpxe文件只需要设置从指定的iSCSI LUN引导。

上面说的只是从以太口安装OS并从ISCSI LUN启动,而我们最终是要从IB口引导的,所以我们从以太口安装OS后要做一些操作才可以最终从IB口引导系统。说到这里,可能有些童靴有点晕哈,干嘛非要先从以太口安装OS再做修改,难道没有别的方式吗?有的,应该是有两种的,一种是mellanox文档中提到直接在IB口安装并引导OS,不过我尝试过很多次安装是没有问题的,但是引导还是不OK,可能是水平有限吧;还一种土办法就是装上硬盘安装系统,做一些必要的设置,然后提取相关文件作为模板,这种方法我没有尝试过。好了还是来说一下我的这种方法最后要做的一些设置,其实主要就是安装配置dracut-network和dracut,重新生成新的initramfs文件,用新的initramfs文件替换旧的initramfs文件。这里新生成的initramfs文件包括了IB驱动等,以使得系统能够BoIB。对于dracut-network和dracut这两个在其它类型的无盘启动系统中也都是要设置的,比如传统的NFS无盘工作站。
完成上面的操作后,就可以从HCA卡引导系统了。至此,也就完全实现了基于IB存储的无盘启动。

无盘OS模板及KVM

mark
下面,我们来说一下具体的无盘OS模板制作及KVM虚拟化。从以太口引导安装OS,分区,选择”infiniband support”、”iscsi storage client”、”Simple Chinese Support”和虚拟化组件。然后就是禁用selinux、iptables、NetworkManager,调整eth0网卡设置ONBOOT=”no”,安装dracut-network和dracut,安装OFED驱动,生成新的initramfs,应用新的initramfs。这里面操作很多,我就挑些主要的吧。接下来可以部署一下监控程序nagios或zabbix,或者再部署一下load测试脚本,然后挂载iSER LUN,配置网桥,新建VM模板(做些必要设置),再从VM模板clone 4个VM出来。这些我想大家都很熟练了,这里我就不再详细说明了。最后,我们要登出iSER LUN,关闭OS。登录到IB存储上,写个脚本将我们做好的无盘刀片服务器OS模板克隆到其它的刀片上,去启动服务器上配置好每台刀片服务器的BoIB,启动所有刀片,登录到每台刀片,登入iSER LUN,启动所有的VM。测试一下,这些操作是否都正常。登录监控系统,查看各监控项是否OK。

性能测试

mark
最后,就是各种测试,主要测试无盘OS稳定性,VM性能和IB存储性能。早期,我使用cpuburn-in+memtester+iozone对VM进行施压,配合监控系统,测试结果发现IB带宽资源充足,IB存储存储CPU资源占用较高,IOWAIT值较高,原因是我们IB存储上使用的都是7200RPM的NL SAS盘。实际上来说我这种测试方法不是很合适,后来就改用webbench多线程并发访问VM的apache页面的方式模拟正常业务流量来测试。测试了一段时间,无盘OS、VM及IB存储都很稳定。

最终拓扑

mark