裸机即没有安装任何操作系统的物理服务器

裸机即没有安装任何操作系统的物理服务器

Ironic是OpenStack裸机管理服务(baremetal as service),裸机即没有安装任何操作系统的物理服务器。虽然ironic支持standalone部署模式,但通常会协同OpenStack其他服务共同工作,具体分工如下:

Keystone:认证与授权。

Glance:为裸机提供镜像服务,保存OS安装介质。

Nova:负责裸机调度,提供裸机服务。

Ironic:裸机管理,包括裸机信息录入、硬件信息自动发现等。

Neutron:裸机网络管理和配置。

Swift:保存ConfigDrive数据,后面细讲。

以上,比较容易混淆的是Ironic组件和Nova组件的分工,Ironic是裸机管理,可以类同为企业的IT资产管理系统,而Nova是提供裸机服务的,可以认为是给用户分配物理服务器的。底层技术实现上,Ironic是Nova的其中一种ComputeDrive,和Libvirt平行,一个裸机node对应Nova的一个Hypervisor实例。

通常用户只需要和Nova交互,只有管理员才需要与Ironic交互。创建裸机和创建虚拟机完全一样,都是调用nova boot API,指定flavor、image、network等参数。如果平台既有裸机又有虚拟机,nova-scheduler怎么知道调度的是虚拟机还是裸机呢?答案是通过flavor的extra specs过滤,裸机录入时会指定一些硬件特性,如cpu-arch、boot-option,裸机的flavor也会添加这些硬件特性,nova-scheduler调度时会一一比对这些特性,从而保证调度的是裸机hypervisor。

既然Ironic和Libvirt是平行的,那自然裸机和虚拟机有很多相似的地方,二者都是提供OS服务,大多数用户其实并不关心底层是裸机还是虚拟机的。

因此为了更好的理解裸机的实现原理,不妨和虚拟机的操作原理做个对比。

首先介绍电源管理,虚拟机的开关机直接调用libvirt API即可。裸机服务器则通过调用IPMI指令进行服务器的远程电源管理。当然IPMI并不是唯一的方式,ironic还支持如redfish、redfish,ilo,irmc等。

裸机的装机是Ironic最重要的功能。虚拟机创建的过程是compute节点向Glance下载镜像到本地目录,定义虚拟机xml模板,镜像文件映射为虚拟机的一个虚拟块设备,调用libvirt启动虚拟机。而裸机部署则相对复杂些。首先conductor节点会启动一个TFTP服务,保存有操作系统的bootloader文件,而Neutron可提供DHCP服务,并提供TFTP服务的地址。Ironic会首先从Glance下载initramfs镜像到conductor节点的TFTP路径,然后通过IPMI命令开机服务器,并设置从PXE启动(网卡需要提前开启PXE功能)。裸机服务器PXE引导后,自动从TFTP下载bootloader文件,bootloader会告诉服务器加载deploy initramfs和deploy kernel,启动deploy操作系统。deploy操作系统仅仅是一个临时的操作系统,并没有安装到硬盘,可以认为是一个内存精简操作系统,该操作系统除了安装一些必要的驱动和工具外,还安装了ironic-python-agent。deploy操作系统起来后,agent会下载用户镜像到本地(或者通过iscsi协议attach到conductor节点),通过规则找到需要安装的目标设备,比如/dev/sda。然后对该硬盘设备进行清零操作后(dd if=/dev/zero of=/dev/sda, sgdisk),把下载的镜像dd到设备中(qemu-img convert -t directsync -O host_device test.img /dev/sda)。如果配置了ConfigDrive,则还会从Swift下载ConfigDrive文件并拷贝到设备的一个单独分区中。镜像和ConfigDrive数据都全部拷贝完后agent会发送信号给conductor,conductor收到该信号,意味着操作系统安装完成,调用IPMI重启服务器,并设置从本地硬盘启动(boot_option为local),服务器再次起来后就可以进入指定的操作系统了。

如上有个细节需要注意的是,deploy操作系统需要与conductor服务和Swift通信,意味着网络必须和管理网通,这里存在安全隐患的。因此ironic支持指定单独的部署网络(provision网络),该网络只在部署时临时使用,与用户的租户网络隔离。PXE启动时会使用provision网络,操作系统安装完后会自动切换为用户指定的网络,即期间会有一个切port的过程。

另外关于镜像,物理服务器和虚拟机的镜像是有区别的,物理服务器往往需要安装更多的硬件驱动。官方提供了使用DIB制作裸机的镜像的方法:Create and add images to the Image service。如果需要从虚拟机镜像转化为裸机镜像,需要注意更新initramfs文件,因为该initramfs可能并没有包含硬件设备驱动,启动时识别不了硬盘导致进入操作系统失败。通常rhel以及suse系列通过dracut工具生成即可,需要注意禁用Host-Only模式,否则换一个型号的服务器可能又由于硬件驱动不兼容导致引导不起来。另外如果镜像操作系统有LVM分区,则必须添加dracut驱动lvm,否则会不识别vg,这个坑折腾了很久。。。

裸机即没有安装任何操作系统的物理服务器

关于网络,虚拟机是通过OVS或者Linux Bridge实现vswitch,而Ironic裸机则管理的是物理交换机设备。目前Ironic支持两种网络模式,其中一种为flat模式,该模式下不支持配置硬件交换机,需要提前做好裸机的网络接入,支持的Neutron网络类型为flat或者vlan。另一种为neutron模式,该模式需要配置交换机端口信息和登录信息,该模式更灵活,并且支持多租户。

安装完操作系统后,和虚拟机一样,支持通过cloud-init进行OS初始化,如主机名修改、密码密钥注入等功能。除此之外,还可以通过cloud-init实现物理服务器网卡bond配置。不过如果需要支持bond,datasource貌似不能使用OpenStack,而必须使用ConfigDrive。前面提过,裸机和虚拟机的ConfigDrive实现不一样,虚拟机是通过计算节点的一个虚拟设备文件映射给虚拟机的,而裸机则需要把Configdrive数据上传到Swift,agent从Swift下载到本地并dd到硬盘设备的一个分区中。