《OpenStack高可用集群(下册):部署与运维》—11.3.2 控制节点KVM虚拟机准备
11.3.2 控制节点KVM虚拟机准备
在本节的实验环境中,OpenStack高可用集群控制节点由三台KVM虚拟机组成(controller1-vm、controller2-vm和controller3-vm),KVM虚拟机的宿主机为前一节创建的运行Centos7.2的三台VMware虚拟机(controller1、controller2和controller3)。本节将重点介绍如何在Centos/RHEL系统中创建KVM虚拟机。本节内容也可作为OpenStack系统镜像创建的参考。
1. KVM虚拟机安装源设置
在使用virt-install安装KVM虚拟机之前,需要配置安装源,即为virt-install指定安装包位置仓库(通过--location参数指定)。本节实验环境使用Centos 7.2系统镜像来安装KVM虚拟机。在11.3.1节中,Centos 7.2的ISO镜像已经被解压到controller1节点的/data/ISO目录,并且controller2和controller3节点也通过NFS挂载到本地/data目录,即每台VMware虚拟机的/data/ISO目录都存放了ISO安装镜像源。本节以在controller1节点创建KVM虚拟机为例进行讲解,其他节点创建过程与此类似。为简单起见,此处配置HTTP下载服务器供virt-install在安装时进行软件包下载,HTTP服务器的具体配置过程可参考create_vm_on_master_node.sh脚本中的configure_apache_server()函数。该函数运行完成后,通过http://controller1_ip/rpm/即可下载安装包。本例中controller1的IP为192.68.142.21,因此在浏览器中输入http://192.168.142.21/rpm/即可下载HTTP站点软件包,如图11-18所示。
同样,在virt-install的安装命令中,为--location参数指定http://192.168.142.21/rpm/,则virt-install将自动到HTTP站点提取安装包。另外,/data目录并不具备httpd_sys_content上下文标签,因此如果启用SELinux,则SELinux会禁止访问该目录,用户将收到权限不允许的提示。通常情况下建议关闭SELinux(重启生效),在SELinux被禁用的情况下将不会出现此类情况。如果确实要使用SELinux,则可以使用semanage命令为/data目录设置允许httpd访问的标签。
2. KVM虚拟机Fencing设置
作为试验环境,Fencing功能可能并不重要,但是如果作为生产环境,则Fencing功能是必须的。本节的实验环境中,之所以要在VMware虚拟机中创建KVM虚拟机来作为OpenStack高可用集群的控制节点,就是希望借用现有的KVM虚拟机Fencing驱动来模拟控制节点的Fencing功能。如果是生产环境,则控制节点通常由物理服务器承载。常见的物理服务器均具备Fencing功能,因此生产环境中创建KVM虚拟机来作为控制节点这个步骤是完全没有必要的。在本实验环境中,通过fence-virtd软件对KVM虚拟机进行Fencing操作,fence-virtd的配置可参考create_vm_on_master_node.sh脚本中的configure_fence_file()函数实现。该函数执行完成后,在VMware宿主虚拟机上即可通过fence_xvm命令来验证配置是否正确。fence_xvm命令可以列出(list)主机上全部虚拟机信息,同时获取全部虚拟机的状态,并对指定虚拟机进行关机(off)、启动(on)、重启(reboot)和状态获取(status)等操作。fence_xvm -o list命令将列出宿主机上全部虚拟机及其状态,验证结果如下:
[root@controller1 ~]# fence_xvm -o list
controller1-vm b9baabdf-9822-447e-95c0-35ff1af0d5ed on
[root@controller1 ~]# virsh list --all
Id Name State
----------------------------------------------------
4 controller1-vm running
此外,可以通过fence_xvm命令测试对虚拟机的Fencing操作,如下命令将会重启VMware宿主机controller3上的KVM虚拟机controller3-vm:
[root@controller3 ~]# fence_xvm -o reboot -H controller3-vm
通过VNC客户端可以观察到,在运行fence_xvm -o reboot命令后,KVM虚拟机controller3-vm系统自动重启,如图11-19所示。
图11-19 fence_xvm重启KVM虚拟机controller3-vm
3. KVM虚拟机自定义安装
在制作适用于特定环境的系统镜像时,并不希望安装社区或厂商发行的全部软件包,因为社区或厂商发行的系统镜像(如CentOS-7-x86_64-DVD-1511.iso)包含了很多不必要的软件包,这些不必要的软件包使得制作出来的镜像显得十分臃肿,非常不利于云环境中镜像的快速分发。因此在制作镜像时通常采取自定义安装方式来有选择性地安装所需软件和工具包。在本实验环境中,我们事先制作了一个KVM虚拟机自定义安装初始化文件virt-base.ks。该文件将告知virt-install需要安装的软件工具包,同时告知其在系统安装完成后需要对KVM虚拟机做哪些系统初始化配置工作,如设置/etc/hosts、/etc/fstab等系统配置文件,以及设置主机名、本地yum源仓库和配置网卡IP地址等。virt-base.ks自定义安装文件的制作可参考create_vm_on_master_node.sh脚本中的create_guest_inject_script()函数来实现,该函数执行完成后,将会在当前目录生成一个名为virt-base.ks的自定义安装文件,virt-base.ks文件通过--initrd-inject参数和--extra-args参数传入virt-install命令,virt-install命令将根据virt-base.ks文件指定的内容和命令进行KVM虚拟机操作系统的自定义安装和初始化设置。在采用virt-base.ks进行自定义KVM虚拟机安装时,virt-install除了安装Kernel模块外,还会自动安装nfs-utils、net-tools、ntp和wget等实用工具包,同时根据脚本对系统进行初始化设置,并挂载NFS文件系统、配置yum源以及设置网卡IP地址等。
4.创建KVM虚拟机镜像
在Linux系统中,创建KVM虚拟机最常使用的便是virt-install命令行工具。virt-install命令行工具有着复杂多样的参数供用户选择,用户可以通过virt-install提供的参数设置不同的值来创建不同类型的虚拟机。常见的virt-install命令行参数介绍如下:
-n|--name参数:字符串值,用以设置客户端虚拟机名称。
-r|--ram参数:整数值,用以设置为客户端虚拟机分配的内存。
-u|--uuid参数:字符串值,用以设置客户机UUID ,用户未指定时系统会自动生成。
--vcpus参数:整数值,用以设置客户机的vcpu个数。
-v|--hvm 参数:没有值,用以指定客户机虚拟化模式为全虚拟化。
-p|--paravirt参数:没有值,用以指定客户机虚拟化模式为半虚拟化。
-l|--location参数:字符串值,用以指定安装源的位置,有本地安装源和远程安装源之分。远程安装源包括nfs、http和ftp几种方式,常用于kickstart网络安装中,--location参数允许使用--extra-args和--initrd-inject来指定额外的内核参数。
-c|--cdrom参数:字符串值,用于指定光驱安装介质路径,一般为iso格式镜像文件,如--cdrom=/root/centos7.iso。
--disk参数:字符串值,用以指定存放客户机操作系统的介质路径,类似Windows系统安装中使用的C盘,如--disk= /image/centos7/centos7-base.img。
-w|--network参数:值为网络名称,用以指定客户机连接到的主机网络,对于想要使用静态网络的客户机,通常将该参数值设置为主机网桥(BRIDGE)。
--cpuset参数:整数列表,设置哪些物理CPU能够被虚拟客户机使用。
--os-type参数:其值为操作系统类型(如Linux、Windows),用以指定客户机操作系统类型,虚拟化引擎将根据不同类型的操进行客户机系统优化。
--os-variant参数:其值为特定的操作系统(如Fedora18、Rhel6、Rhel7、Winxp和Win2k3等),虚拟化引擎将针对该参数设置的操作系统进一步优化虚拟机配置。
--accelerate参数:用以指定KVM或KQEMU内核加速,这个选项目前是默认。
--initrd-inject参数:字符串值,此参数通常与--location以及--extra-argsc参数配合使用,主要用以kickstart自动安装场景中,用以指定ks文件的绝对路径。
--extra-args参数:字符串值,在通过--location参数安装客户机时,用以指定附加内核命令行参数给安装程序。在kickstart自动安装中,通常与--initrd-inject参数配合使用,如--initrd-inject=/path/to/my.ks --extra-args "ks=file:/my.ks"。
--graphics参数:字符串值,用以指定使用的图形安装界面,此参数并不会配置客户机的虚拟硬件,而是设置可以通过什么方式访问客户机。如--graphics vn,listen='0.0.0.0',这样便可通过VNC客户端来访问KVM虚拟机。
在本实验环境中,先通过qemu-img创建一个qcow2格式的镜像文件,然后通过virt-install命令工具安装KVM虚拟机操作系统,使用远程HTTP安装源,通过--initrd-inject和--extra-args参数将ks文件传递给安装程序。创建的虚拟机名称为centos7-base(对应的虚拟机镜像文件为centos7-base.img)。在virt-install安装过程中,可以使用VNC客户端查看安装进度。virt-install命令行工具安装KVM虚拟机的过程可参考如下脚本:
#/usr/bin/bash
yum install -y virt-install
mkdir -p $vm_dir
//创建qcow2格式的磁盘文件
qemu-img create -f qcow2 -o preallocation=metadata \
${vm_dir}/$vm_base $vm_disk
//创建KVM虚拟机
virt-install --connect=qemu:///system \
--network=bridge:$int_br_name,mac=$int_mac \
--initrd-inject=./virt-base.ks \
--extra-args="ks=file:/virt-base.ks console=tty0 \
console=ttyS0,115200 serial rd_NO_PLYMOUTH" \
--name=centos7-base \
--disk path=${vm_dir}/$vm_base,format=qcow2,cache=none \
--ram $vm_ram \
--vcpus=$vm_cpu \
--check-cpu \
--accelerate \
--os-type linux \
--os-variant rhel7 \
--hvm \
--location=$rpm_http \
--graphics vnc,listen='0.0.0.0' \
--noautoconsole
上述KVM虚拟机安装脚本中,通过--graphics参数设置虚拟机访问方式为虚拟网络客户端(VNC,Virtual Network Console),并监听全部IP。这里没有指定VNC的监听端口,而VNC默认监听端口为5900,因此只需在VNC客户端软件中指定主机IP和5900端口,即可访问主机上的KVM虚拟机。VNC客户端访问方式如图11-20所示。
图11-20中使用的VNC Viewer是一款常用的免费VNC客户端软件,通过VNC访问KVM虚拟机后,即可看到KVM虚拟机安装启动过程。安装完成之后,通过VNC客户端即可实现KVM虚拟机的终端命令行操作,VNC客户端对centos7-base虚拟机的访问结果如图11-21所示。
图11-21 VNC客户端访问KVM虚拟机创建过程
5.定义KVM虚拟机配置文件
虚拟机的运行有多种方式,用户既可以使用qemu-system-x86或者qemu-kvm来运行虚拟机,也可以使用Libvirt的virsh命令从XML文件来定义和运行虚拟机。Libvirt使用XML文件对虚拟机进行配置,其中包括虚拟机名称、分配内存、vcpu和网络等多种信息,通常XML文件又称虚拟机配置文件。使用qemu-kvm来运行虚拟机,与virt-install命令创建KVM虚拟机一样,需要在命令行指定很多虚拟机运行参数,包括内存、vcpu、网络和镜像文件等参数,而这些参数实际上都可以通过XML语言定义到XML文件中,并通过Libvirt提供的virsh命令操作XML文件从而操作虚拟机。在Libvirt中,定义虚拟机通常也称为定义一个Domain,在实际应用中,通常不必去修改virt-install生成的虚拟机镜像系统文件,而是将该镜像系统文件作为一个基础镜像,并在其上创建一个仅保存差异部分的差分镜像文件,同时通过XML语言重新定义虚拟机配置,并以virsh命令来定义和启动虚拟机。用这种方式对虚拟机进行操作非常灵活,并且不会更改原始虚拟机镜像(除非使用commit命令)。如果想要重新定义虚拟机资源配置,只需修改XML文件并重新定义和启动虚拟机即可。在本节的实验环境中,基础镜像文件为virt-install创建的centos7-base.img文件,这里将其拷贝到/localvms目录,并在该目录中创建一个虚拟机配置临时文件template.xml,之后以centos7-base.img和template.xml为基础,创建一个差分镜像文件${vm_name}.img和一个定义虚拟机的XML文件${vm_name}.xml,并通过virsh命令来定义和启动虚拟机。另外,此处启动的虚拟机即是最终作为OpenStack高可用集群控制节点的KVM虚拟机。虚拟机的具体定义和启动过程可参考create_vm_on_master_node.sh脚本中的define_vm_xml()函数。
该函数执行完成后,在主机/localvms目录下将生成如下文件,同时通过virsh命令可以看到虚拟机的运行状态:
[root@controller1 localvms]# ls -l
total 1925344
-rw-r--r-- 1 qemu qemu 21478375424 Nov 28 23:40 centos7-base.img
-rw-r--r-- 1 qemu qemu 86507520 Nov 29 15:07 controller1-vm.img
-rw-r--r-- 1 root root 1192 Nov 28 23:40 controller1-vm.xml
-rw-r--r-- 1 root root 1192 Nov 28 23:40 template.xml
[root@controller1 localvms]# virsh list --all
Id Name State
----------------------------------------------------
4 controller1-vm running
virsh命令启动虚拟机后,即可通过VNC客户端访问虚拟机。进入虚拟机系统命令行后,可以检查虚拟机的系统配置是否与自定义安装文件设置的一致,如图11-22所示。
本节创建KVM虚拟机的源代码参见https://github.com/ynwssjx/Openstack-HA-Deploy-ment,其中,实现KVM虚拟机创建和初始化的脚本主要包括create_vm_on_all_nodes.sh、create_vm_on_master_nodes.sh和create_vm_on_slave_nodes.sh三个脚本,但是在实际执行中,只需运行第一个脚本create_vm_on_all_node.sh,该脚本会自动在三台运行Centos系统的VMware虚拟机上分别创建三个KVM虚拟机。需要指出的是,使用物理服务器作为控制节点的生产环境并不需要执行本节所做的操作,本节内容仅针对采用虚拟机作为OpenStack高可用集群控制节点的实验环境。
图11-22 通过VNC访问controller1-vm虚拟机并查看系统配置情况
- 点赞
- 收藏
- 关注作者
评论(0)