TLDR:这是个1controller+1compute的openstack实验环境,使用ceph作为存储后端,以及vlan外部网络和vxlan内部网络。
首先这不是一篇教程,只是想分享一些和官方文档中做法不同部分的心得,抛砖引玉。
第一次部署openstack,大概还是Q版还是R版吧,用的kolla-ansible,解决拉镜像问题后,基本上就能一键部署完了,打开dashboard把玩了下,也没能让虚机通外网,就到此为止了。当时的能力有限,没想着进一步去探索组件之间的关系。
至于为什么会再探openstack,是因为想要实现SDN和多租户的能力,让朋友能自助在我的homelab里开机器并且能够自治网络环境。了解到能提供类似功能的一个是vmware的nsx,一个就是openstack了,还了解过opendaylight,发现我的交换机不支持openflow协议之后就作罢了。vmware的产品更封闭,而且感觉平台本身会消耗更多资源(个人感觉),并且不支持多租户,不能对接ceph(虽然vsan很好用,特别是企业场景下),所以考虑了后者。至于proxmox的SDN功能,还是再让它发展一段时间看看吧。
硬件
先从构建硬件开始,好在家里遗留下来的配件够丰富,拿了块j4005和j1800,按照官方文档要求,做了个1控制节点+1计算节点的低功耗实验环境。
3D打印了一个模块化连接器,称不上机箱了。横梁是通用并且预留了连接点,用来扩展节点,安装其他组件以及如果有需要的话可以用亚克力封箱。连接主板到横梁的的主板螺丝孔适配座,每块主板都是不同的,因为虽然螺丝孔间距都是ATX/MATX/ITX标准,但是每家的主板尺寸都是不同的。这个螺丝孔适配座实现了非标转标准化的过程,方便以后扩展节点。因为主板没有m.2槽,只能外挂一个硬盘架,装到上方的安装孔位上。
整个模块化连接器打印安装完已经过去了半周,好在兴趣还没有消散,装上系统开始下一步部署。为什么不在虚拟化上部署实验环境?毕竟真机更有成就感嘛,以及我的PVE集群计算资源紧张,又不想开那台2U的RH2288。
关于文档
homelab用openstack的伙伴应该不多吧,说到homelab大部分人还是会用proxmox或者vmware来构建集群,网上大部分教程也都是这两个产品的。好在现在的openstack官方的文档还算不错,至少跟着文档能把基础的环境跑通。就是文档的跳转逻辑要习惯一下,有时候下一页按钮会跳到错误的位置,以及要知道你需要看那部分内容,多对照目录来找到你需要看的部分。这倒是有点像纸质书。
还有就是,官方文档不会教你部署一个生产级别的云计算平台,但是提供了“详细的”架构设计指南,部署文档的内容也很有限,具体配置还得看配置文件里的注释。
学习路径
刚开始看文档的时候,会有无从下手的感觉,官方推荐的各种部署工具链、安装手册、部署手册、用户手册、配置手册,如果想要手动安装一遍openstack的话,建议从Installation Guide开始。
部署完基础环境组件后,文档也给出了openstack组件的安装顺序。我采用了文档Overview中的示例架构进行部署,文档提示需要每个节点有2张网卡。实际上,也可以在单个节点上部署所有组件,节点也可以用单网卡,只不过这样控制平面网络和业务平面网络混用了。
关于网络
文档给出了两种网络选项,Provider模式和Self-service模式。前者所有网络必须由管理员创建分配,后者用户可以自助创建内部网络,并且通过虚拟路由器访问物理网络或者分配真实网络弹性ip地址给示例,就像云计算那样。
建议从文档给出的provider模式flat网络开始,进而到vlan,vxlan,gre的外部网络,然后转到Self-service模式的overlay网络,配置起来就很容易理解了。openstack能做很多,我只是测试了其中flat、vlan和vxlan部分。
注意neutron/plugins/ml2/ml2_conf.ini中[ml2_type_flat]中,文档演示的flat_networks = provider里的provider实际上是network name,这点对应在创建network的时候,你只能创建名为provider的flat类型network。如果要创建其他名称的network,需要把name放到这个配置中,或者填*通配符。其他类型的network配置也是同理。
另外neutron/plugins/ml2/openvswitch_agent.ini中,[ovs]下的bridge_mappings = provider:PROVIDER_INTERFACE_NAME也对应了上面的network name,PROVIDER_INTERFACE_NAME则是对应了节点的物理网络设备,文档中用了open-vswitch的bridge作为网络接口。由于你可以创建多个bridge,所以就像上面提到的那样,如果你愿意,其实节点用单网卡也可以运行。以我的物理网络环境来说,管理网络ip配在bridge下的vlan虚接口上,bridge本身提供给openstack使用。
多提一句Self-service模式,就像公有云一样,租户可以创建自己的vpc,然后通过NAT网关的SNAT功能让内部子王的示例访问外部网络。对应openstack,需要管理员创建一个外部网络,然后租户就可以自行创建内部网络,然后创建路由器(NAT网关),配上外部、内部网关IP和路由。不过,Neutron组件不提供DNAT功能,要实现访问内部子网实例端口的话,要用Octavia组件的四层LB实现了,这点和国外公有云的逻辑倒是很像。
关于存储
文档中存储服务Cinder没有放到必须组件,而是和Horizon一起放到了建议安装组件中。事实上,不安装Cinder组件的前提下,确实可以用openstack server create命令启动实例。但是,无法通过网页后台创建示例,因为网页引导创建的方式会尝试创建一个块设备并且将镜像复制到块设备上运行实例,所以如果想持久化你的虚机,还得安装Cinder组件。
这里我没有按照文档提供的方式使用LVM卷作为存储提供服务,因为需要额外的块设备作为lvm卷的PV,而我不想给节点再连接更多的硬盘或者连接iscsi设备。而是直接使用CEPH作为存储后端,之后的生产环境,节点操作系统会直接用PXE引导启动,同样由CEPH提供iscsi设备。实验环境为了保持其独立性,同时降低复杂度,所以各挂了一个硬盘放操作系统。
关于openstack如何集成ceph,ceph的文档中已经写得很好了,倒是没有在openstack的文档中找到具体步骤。其中Glance镜像、块设备、guest磁盘、备份都可以由ceph提供,块设备的复制、快照ceph也是支持的。对象存储也可以用ceph来代替swift。
关于Dashboard
如果你用的是Ubuntu包管理器安装的Horizon的话,配置文件/etc/openstack-dashboard/local_settings.py中COMPRESS_OFFLINE默认是True的,我的环境下Dashboard会报500错误,打开DEBUG后看到报错是来自COMPRESS_OFFLINE,关闭后就好了,至于原因也没有深究,等用到了再去解决吧。
心得
就像文档中说的那样,要部署使用openstack,需要具备相当的Linux的基础。花了一周把基础组件部署了起来,对接了ceph,至少形成了一个可用的环境,但这只是摸到了皮毛,各个组件的细节深究下去起码能玩一年。
过程还是非常有趣的,特别是很好地帮助我去理解了市面上公有云的设计逻辑,以及提升了不少排障的能力。遇到困难,理清逻辑,多看日志。
有关homelab网络和存储的1.0版本文章都已经写了,至于计算,由于还没有达到一个我能够大致满意的形态,所以一直没写。接下来如果openstack这套方案使用稳定了,就可以作为v1.0来分享了。