最近花了几天的时间研究openstack的安装部署,终于搭建出来一个最小实例。把在安装部署过程中碰到的问题和经验总结一下,以后不再犯错,也分享给大家,提供点帮助。
搭建虚拟机环境:
virtual box 5.1.38+vagrant 1.8.6+win10
openstack的部署环境
ubuntu16.04+openstack-ocata
我是采用virtual box+vagrant来搭建多ubuntu虚拟机环境的,开始时是从官网上下载的官网最新vagrant2.1.5和最新的virtual box5.2.18,搭建环境后安装单个ubuntu16.04没有问题,但是搭建多个ubuntu虚拟机环境的时候发现配置vagrant文件跟网上说的有点区别,后来把vagrant版本换到了1.8.6,但是安装虚拟机的时候又出现问题,把virtual box的版本也换成旧一点的5.1.38版本去安装正常了。
vagrant是也有一个类似于工作目录的概念,我的设置的工作目录是D:\openstack-ocata。在每个工作目录下有一个共享的配置文件Vagrantfile,在该工作目录下执行vagrant命令时,读取的配置都是该工作目录下的配置文件配置,不会影响其他工作目录下的虚拟机。
比如有有两个工作目录A,B,在A目录下的配置文件中定义了一个虚拟机V1,在B工作目录下的配置文件定义了两个虚拟机V2,V3。
假设都已经初始化则在目录下执行vagrant up(启动虚拟机命令)时,只会启动V1虚拟机,不会启动V2,V3虚拟机。不同工作目录下的虚拟机是操作隔离的。
vagrant的单环境的安装的步骤网上很多,我是从网上下载了一个box存放到本地,然后从本地导入box的方式安装的,单个虚拟机实例的安装步骤如下:
1.先导入本地的box到vagrant仓库中,一遍vagrant识别和管理box。
vagrant box add ubuntu16 D:/data/ubuntu16.box
验证是否导入成功:
vagrant box list
列别中出现刚才导入的box说明导入成功。
2.利用仓库中的box来创建虚拟机实例。box相当于模板,而由一个模板可以刻录出多份相同类型的虚拟机实例。
vagrant init
3.启动虚拟机实例
vagrant up
验证是否启动成功:
vagrant status
另外还需要说明的是,在配置多个虚拟机实例的情况也可以单独启动指定的虚拟机,如只要启动controller实例,则执行:
vagrant up controlNode
关闭虚拟机:vagrant halt
挂起虚拟机:vagran suspend
挂起后唤醒虚拟机:vagrant resume
windows下需要利用远程登录工具登录虚拟机环境,如Xshell,登录虚拟机的登录名和密码在用户主目录下的.vagrant.d\boxes下找到的对应box,在里层也有个Vagrantfile文件,在里面可以找到登录的用户名config.ssh.username和密码config.ssh.password。我操作的环境是在文件:
C:\Users\carter\.vagrant.d\boxes\ubuntu16\0\virtualbox\Vagrantfile
上面的安装过程一般没有问题,对于安装多个节点的openstack环境来说,需要解决下面三个问题:
1.如何定义和启动多个虚拟机实例。
对共享的Vagrantfile文件做如下设置:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu16"
config.vm.define "controlNode" do |controlNode|
controlNode.vm.network "private_network", ip: "192.168.44.11"
controlNode.vm.hostname = "controller"
end
config.vm.define "computeNode" do |computeNode|
computeNode.vm.network "private_network", ip: "192.168.44.22"
computeNode.vm.hostname = "compute"
end
end
上面定义了两个虚拟机实例controlNode,computeNode,两个虚拟机的IP和主机名为:
192.168.44.11 controller
192.168.44.22 compute
2.如何给多个虚拟机设置主机名,并且虚拟机之间通过主机名就可以识别对方不用通过IP就可以相互通信。
在1中已经定义了虚拟机的主机名,ssh登录到虚拟机中输入hostname命令显示主机名,但是此时通过ping相应的主机名并不能ping通,即还不能相互访问。需要通过一个插件才可以实现主机名相互访问。需要安装vagrant-hostmanagerr插件,同时修改配置文件。
a:安装插件,在cmd中的工作目录下执行如下命令:
vagrant plugin install vagrant-hostmanager
vagrant会自动下载安装插件,等安装完成。
b:修改配置文件,在配置文件中加入如下设置:
config.hostmanager.enabled = true --设置启用host管理设置
config.hostmanager.manage_guest = true --设置管理虚拟机上面的hosts目录
config.hostmanager.manage_host = true --设置管理物理主机上的hosts目录
配置文件Vagrantfile修改后如下:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu16"
config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
config.hostmanager.manage_host = true
config.vm.define "controlNode" do |controlNode|
controlNode.vm.network "private_network", ip: "192.168.44.11"
controlNode.vm.hostname = "controller"
end
config.vm.define "computeNode" do |computeNode|
computeNode.vm.network "private_network", ip: "192.168.44.22"
computeNode.vm.hostname = "compute"
end
end
验证:
在物理主机cmd中输入命令:ping controller 成功pIng通虚拟机节点controller,物理主机可以ping通虚拟机。
登录到虚拟机controller中输入命令:ping compute 成功pIng通,虚拟机之间也可以相互ping通。
3.这个问题在有些情况下会出现,就是如何设置单个虚拟机的内存大小。
在我部署的环境中开始设置的控制节点controller的内存4G,计算节点compute的内存1G.开始没有问题,但是随着计算节点上安装的组件越来越多,出现申请内存失败的问题,这需要加大控制节点的内存解决。设置单个虚拟机的内存大小的配置如下:
controlNode.vm.provider "virtualbox" do |v|
v.gui = false
v.name = "ubuntu16-1"
v.cpus = "4"
v.memory = "5120"
end
这个要加在单个虚拟机配置的代码块内部。c.name代表虚拟机名称,与虚拟机的主机名不是一个概念,这个名称在哪里会用到呢,在virtual box的面板上会看到虚拟机列表,虚拟机里面里面显示的虚拟机名字就是v.name。
v.cpus是cpu核数,v.memory是内存大小。
修改后完整的配置文件如下:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu16"
config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
config.hostmanager.manage_host = true
config.vm.define "controlNode" do |controlNode|
controlNode.vm.network "private_network", ip: "192.168.44.11"
controlNode.vm.hostname = "controller"
controlNode.vm.provider "virtualbox" do |v|
v.gui = false
v.name = "ubuntu16-1"
v.cpus = "4"
v.memory = "5120"
end
end
config.vm.define "computeNode" do |computeNode|
computeNode.vm.network "private_network", ip: "192.168.44.22"
computeNode.vm.hostname = "compute"
computeNode.vm.provider "virtualbox" do |v|
v.gui = false
v.name = "ubuntu16-2"
v.cpus = "2"
v.memory = "2048"
end
end
end
有了这一节的vagrant的相关设置的基础,在安装与部署openstack方面就会顺利很多。