Openstack云环境 ironic部署裸机那点儿事

来源:互联网 发布:win10和ubuntu双系统 编辑:程序博客网 时间:2024/06/07 00:35

关于Openstack中的ironic子项目,在此不做过多介绍,ironic就是openstack用来部署裸机(baremetal)的一个子项目,在此贴一张ironic部署裸机的工作流程图:
这里写图片描述

网络配置:

裸机管理网口和普通网口都要配成VLAN的Access口、VLAN号要跟Fuel中Baremetal网络配置的VLAN要一致,如下图。
(例如把两个网口都配置成74#VLAN并都设置成Access口)

裸机BIOS配置:

设置裸机的管理网卡网络IP为静态分配、设置好IP地址和子网掩码,还有IPMI的同户名和密码,设置裸机从PXE启动,此时记下PXE启动的网卡的MAC地址备用。
(例如将裸机IP设为192.168.3.45、IPMI用户名为root、密码为123456,网卡的MAC地址为:08:19:A6:D0:82:A1)

准备镜像

镜像分为两部分:部署镜像和用户镜像。

部署镜像

其中部署镜像的是用的Fuel部署完了以后glance中自带的三个:ironic-deploy-linux 、ironic-deploy-initramfs 、ironic-deploy-squashfs
这里写一下坑: 很多博客和文档都是写用disk-image-builder工具生成或者直接下载CoreOS,他们所指的IPMI驱动用的是pxe_ipmitool 但是Fuel部署的环境用的是fuel-ipmitool,所以并不适用。

用户镜像

用户镜像根据Fuel的文档自己生成,参考:Openstack官方文档,用

disk-image-create -a amd64 -p grub2-common,grub-pc,grub-gfxpayload-lists,emacs24-nox,parted,cloud-init,NetWorkManager \                 baremetal ubuntu -t raw -o <image_name>

因为在我们的环境中要使用cloud-init和NetWorkManager,所以在生成镜像时加入这两个参数。命令执行成功后,生成3个文件,.vmlinuz 、.initrd、.raw
注意的是:raw镜像上传至glance时候,需要指定kernel_id和ramdisk_id ,如下:

glance image-create --name ubuntu-baremetal-image --visibility public \                    --disk-format raw --container-format bare \                    --property kernel_id=$MY_VMLINUZ_UUID \                    --property ramdisk_id= $MY_INITRD_UUID  < image-name.raw

还要带关于裸机的其他元数据,添加数据如下:

glance image-update <image-id> --property cpu_arch=x86_64 \                               --property fuel_disk_info=DISK_INFO

这里写一下另一个坑:上条命令中的 DISK_INFO在文档上写的是可以如下:

‘[{"name": "sda", "extra": [], "free_space": 11000, "type": "disk","id": "vda", "size": 11000, "volumes":   [{"mount": "/", "type":"partition", "file_system": "ext4", "size": 10000}]}]’

经过测试和后来排查日志和源码,此条fuel_disk_info 元数据的值需要是array类型,所以不能将前后两个单引号一起写入,否则在部署裸机时会报错。另外,元数据中的磁盘大小的单位为MB,若按GB填写也会报错。

Centos7裸机用户镜像制作

diskimage-builder制作的centos7镜像(raw格式)部署到裸机后不能正常开机,网络也不能正常启用的问题,所以将该问题单列出来。
首先,不能正常开机的原因是镜像中grub.cfg中在搜索根磁盘时候用的是MRB磁盘分区的表示方法,即‘hd0,msdos1’。但实际上现在的裸机磁盘阵列虚拟出来的磁盘都是GPT分区格式。而且在指定内核文件时uuid与裸机的uuid不一样,而且经过测试,raw镜像中的uuid也不会在部署的时候发生适应的改动,所以加载不了内核进而进入不了系统。
截图如下:
这里写图片描述
上图与实际上裸机磁盘信息是不符的,截图如下:
这里写图片描述
解决办法也很粗暴,diskimage-builder制作镜像是从centos官网下载最新的cloud系统镜像,然后缓存在本地解压出来挂载到系统去装指定的软件,最后导出。所以把缓存的系统镜像中grub.cfg改成正确的就可以正常部署开机了。镜像缓存目录为/root/.cache/image-create/, 将目录下的CentOS-7-x86_64-GenericCloud.qcow2.xz.tgz解压后是一个完整的文件系统,修改其中/boot/grub2/grub.cfg文件,将分区改成‘hd0,gpt3’然后,将指定内核文件的命令由原来的uuid改成label(因为每一次裸机部署后都会将跟磁盘分区的label设置成‘cloudimg-rootfs’),修改后的文件截图如下:
这里写图片描述
将文件修改完打包放回原处,再次执行diskimage-builder的命令就是加在修改乐的镜像去制作raw的裸机用户镜像,经过测试新制作的镜像可以正常部署开机,不需要人为去操作。

Tags:

  1. 裸机如果尝试部署多次未成功,则会自动进入维护状态,需要自己手动取消维护才能继续部署。
  2. 裸机IPMI提供了远控功能,使用起来比较方便,访问管理网口的80端口即可。
  3. 关于用户镜像,经过测试只要是raw格式的镜像是都可以成功部署的(也可以不用添加kernel-id和ramdisk-id)
  4. 生成用户镜像时,需要预装什么软件包只需在-p 后添加以逗号隔开即可,比如上例中的cloud-init 和NetWorkManager