在本地化设施中使用Vagrant+VirtualBox来运行Apache CloudStack
最近Apache CloudStack新增了很多我想要尝试的功能,所以我会用Vagrant+VirtualBox快速地尝试运行Apache CloudStack。
DevCloud是什么
DevCloud是一个可以使用Vagrant和VirtualBox轻松构建Apache CloudStack环境的工具。
DevCloud是Apache Cloudstack的一个项目,由Apache软件基金会负责。
DevCloud自体在数年前就存在了,并且有以下的介绍文章。虽然基本部分没有大的改变,但由于有一些与几年前的文章有所不同的地方,所以这次我们将重新开始。
使用简便的方式尝试云操作系统「Apache CloudStack」的方法。
DevCloud所创建的虚拟机。
DevCloud将在VirtualBox上创建两个虚拟机,一个管理服务器(管理)和一个xenserver(主机)。
在管理服务器上,除了安装CloudStack的管理服务器外,还会安装NFS和MySQL。
主机上将安装XenServer 6.2。
由于这两台虚拟机上已经安装了几乎所有CloudStack运行所需的软件,所以只需进行CloudStack的配置即可尝试各种不同的设置。
使用DevCloud进行CloudStack的构建步骤。
有关创建环境的事项。
验证设备
-
- Mac OS X 10.11.6 (El Capitan)
プロセッサ 1.4GHz Intel Core i5
メモリ 8GB 1600MHz DDR3
版本
-
- VirtualBox (5.0.26)
-
- Vagrant (1.8.5)
-
- vagrant-berkshelf (5.0.0)
-
- vagrant-omnibus (1.4.1)
- ChefDK (0.17.17)
云栈
我们将使用Apache CloudStack 4.9版本。我认为即使使用其他版本,步骤也不会有太大变化。
CloudStack软件包 | CloudStack公司
网络配置
这次我们将创建一个高级区域。
我认为,只要更改Marvin的配置文件,就可以以同样的方式创建Basic区域。
主存储
Marvin的默认设置文件将主存储设备设置为使用主机(xenserver)的本地存储。然而,本地存储和NFS在使用上存在几处差异,因此我们需要修改设置文件,以便同时使用两种存储方式。
安装和设置必要的软件
首先,需要安装以下软件。
-
- VirtualBox
-
- Vagrant
- ChefDK
DevCloud会使用Chef对虚拟机进行配置。它会安装所需的Chef插件来进行配置。
$ vagrant plugin install vagrant-berkshelf vagrant-omnibus
马文的安装
在建立区域时安装Marvin。我认为使用Jenkins的产物来安装会更方便。即使没有Marvin,也可以成功安装CloudStack,如果遇到问题可以先跳过。
$ pip install http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-2.0.4.zip
$ curl -O https://builds.apache.org/job/cloudstack-marvin/lastBuild/artifact/tools/marvin/dist/Marvin*.tar.gz/*zip*/dist.zip
$ unzip -o dist.zip
$ pip install Marvin*.tar.gz
如果在依赖关系中安装密码学失败的情况下,您可以尝试参考下面的链接安装密码学,然后再次使用pip install Marvin*.tar.gz,也许会成功。
安装 – 加密 1.6.dev1 文档
VirtualBox的网络设置
对于Mac电脑,您需要按照以下方法更改VirtualBox的网络设置。
(对于Windows电脑来说,适配器的名称可能不同,请根据README进行相应设置。)
-
- 在VirtualBox菜单中打开”环境设置”。
-
- 打开”网络”标签的”仅主机网络”。
- 分别按下面的方式设置vboxnet0、vboxnet1、vboxnet2。(在”DHCP服务器”标签中,取消”DHCP服务器”的启用选项)
-
- vboxnet0
IPv4アドレス: 192.168.22.1
IPv4ネットマスク: 255.255.0
DHCPサーバー: 無効
vboxnet1
IPv4アドレス: 192.168.23.1
IPv4ネットマスク: 255.255.0
DHCPサーバー: 無効
vboxnet2
IPv4アドレス: 192.168.24.1
IPv4ネットマスク: 255.255.0
DHCPサーバー: 無効
解决了Vagrant 1.8.5的问题。
由于Vagrant版本1.8.5存在authorized_keys权限设置不正确的错误,因此请搜索plugins/guests/linux/cap/public_key.rb(在我的环境中为/opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb),进行以下修正。
其他版本不需要进行修正。
Poohblah提交的拉取请求#7611修复#7610的问题(不正确的权限在~/.ssh/authorized_keys导致在不安全的密钥替换后认证失败)。
if test -f ~/.ssh/authorized_keys; then
grep -v -x -f '#{remote_path}' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
+ chmod 0600 ~/.ssh/authorized_keys
fi
获取CloudStack的源代码
由于DevCloud的源代码包含在CloudStack的存储库中,因此可以使用git clone等方法进行获取。
$ git clone https://github.com/apache/cloudstack.git
将文件移动到用于Advanced Zone的目录。
cloudstack/tools/devcloud4目录中也有用于Basic Zone的配置,如果要构建Basic Zone,则最好使用那里的配置。
$ cd cloudstack/tools/devcloud4/binary-installation-advanced
修改Vagrantfile和chef_configuration.json文件。
将Chef的版本更改为最新版本。
原始的Vagrantfile中指定了要安装的Chef版本为11.16.4,但直接使用这个版本会导致错误,所以将其改写为:latest。
- management.omnibus.chef_version = "11.16.4"
+ management.omnibus.chef_version = :latest
禁用SyncedFolder
由于在我的环境中启用默认的SyncedFolder会导致错误,所以我会将其设置为无效。
@@ -40,6 +40,7 @@ end
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define 'xenserver' do |xenserver|
xenserver.vm.box = 'duffy/xenserver'
厨师食谱的修改
由于在启动虚拟机时,如果不进行更改,Marvin的安装将失败。因此,我们会从../common/binary-installation/recipes/management_server.rb中注释掉安装过程。
因为在本地安装了Marvin,所以可以进行区域创建,即使不执行该处理也没有问题。
@@ -17,7 +17,7 @@
# under the License.
#
-include_recipe 'cloudstack::marvin'
+# include_recipe 'cloudstack::marvin'
include_recipe 'cloudstack::management_server'
cloudstack_setup_database node['cloudstack']['db']['host'] do
更改虚拟机的内存大小
默认的内存大小为XenServer为6GB,管理器为2GB,但根据不同的机器使用情况可能过大而无法运行,因此需要进行调整。
在我的环境中,我采取了如下措施。
@@ -75,7 +75,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
v.customize ['modifyvm', :id, '--hostonlyadapter2', virtualbox_interface_0]
v.customize ['modifyvm', :id, '--hostonlyadapter3', virtualbox_interface_1]
v.customize ['modifyvm', :id, '--hostonlyadapter4', virtualbox_interface_2]
- v.customize ['modifyvm', :id, '--memory', 6144]
+ v.customize ['modifyvm', :id, '--memory', 2048]
end
## Tweak kernel
@@ -92,7 +92,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
management.vm.network 'forwarded_port', guest: 8080, host: 8080
management.vm.provider 'virtualbox' do |v|
- v.customize ['modifyvm', :id, '--memory', 2048]
+ v.customize ['modifyvm', :id, '--memory', 512]
v.customize ['modifyvm', :id, '--hostonlyadapter2', virtualbox_interface_0]
v.customize ['modifyvm', :id, '--hostonlyadapter3', virtualbox_interface_1]
end
更改CloudStack的版本
根据想要构建的版本,改变 chef_configuration.json 文件的库和系统VM模板的URL。
@@ -24,12 +24,11 @@
"path": "/exports/primary"
},
"hypervisor_tpl": {
- "xenserver": "http://packages.shapeblue.com/systemvmtemplate/4.5/systemvm64template-4.5-xen.vhd.bz2"
+ "xenserver": "https://packages.shapeblue.com/systemvmtemplate/4.6/systemvm64template-master-4.6.0-xen.vhd.bz2"
},
"configuration": "/vagrant/marvin.cfg.erb",
- "yum_repo": "http://packages.shapeblue.com/cloudstack/testing/centos/4.5/",
- "apt_repo": "http://packages.shapeblue.com/cloudstack/testing/debian/4.5/",
- "version": "4.5.0"
+ "yum_repo": "http://packages.shapeblue.com/cloudstack/main/centos/4.9/",
+ "version": "4.9.0"
},
"iptables": {
"lans": ["eth1", "eth2"]
云堆设置的初始值更改
在安装完CloudStack之后,可以使用Marvin进行配置,允许8096端口,以修改默认的规格配置,使得即使在CPU和内存较少的环境下也能启动虚拟机。
通过使用名为prefill.sql的文件直接更新数据库来进行设置更改。
由于已禁用SyncedFolder,因此将修正路径。
@@ -110,6 +111,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
CHEF_CONFIGURATION = JSON.parse(Pathname(__FILE__).dirname.join('chef_configuration.json').read)
+ management.vm.provision :file, source: "./prefill.sql", destination: "/tmp/prefill.sql"
management.vm.provision :chef_solo do |chef|
chef.log_level = :debug
chef.run_list = CHEF_CONFIGURATION.delete('run_list')
@@ -15,7 +15,7 @@
"rootpassword": "password",
"management_server_key": "password",
"database_key": "password",
- "prefill": "/vagrant/prefill.sql"
+ "prefill": "/tmp/prefill.sql"
},
"secondary": {
"path": "/exports/secondary"
原始的prefill.sql文件位于cloudstack/tools/devcloud4/prefill.sql中,因此需要复制并修改必要的部分。主要的修改包括以下两个方面。
-
- NFS用のオファリングを追加
- オーバープロビジョニング係数と閾値を引き上げ
$ cp ../prefill.sql .
@@ -15,9 +15,12 @@
-- specific language governing permissions and limitations
-- under the License.
-REPLACE INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES (17, 'Devcloud4 offering', UUID(), 'Devcloud4 offering', NOW(), 1, 'Service', 0);
+REPLACE INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES (17, 'Devcloud4 offering - Local Storage', UUID(), 'Devcloud4 offering - Local Storage', NOW(), 1, 'Service', 0);
REPLACE INTO `cloud`.`service_offering` (id, cpu, speed, ram_size) VALUES (17, 1, 200, 256);
-REPLACE INTO `cloud`.`disk_offering` (name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES ('Devcloud4 disk offering', UUID(), 'Devcloud4 disk offering', NOW(), 1, 'Disk', 1073741824);
+REPLACE INTO `cloud`.`disk_offering` (name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES ('Devcloud4 disk offering - Local Storage', UUID(), 'Devcloud4 disk offering - Local Storage', NOW(), 1, 'Disk', 1073741824);
+REPLACE INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES (19, 'Devcloud4 offering', UUID(), 'Devcloud4 offering', NOW(), 0, 'Service', 0);
+REPLACE INTO `cloud`.`service_offering` (id, cpu, speed, ram_size) VALUES (19, 1, 200, 256);
+REPLACE INTO `cloud`.`disk_offering` (name, uuid, display_text, created, use_local_storage, type, disk_size) VALUES ('Devcloud4 disk offering', UUID(), 'Devcloud4 disk offering', NOW(), 0, 'Disk', 1073741824);
REPLACE INTO `cloud`.`configuration` (category, instance, component, name, value) VALUES ('Advanced', 'DEFAULT', 'management-server', 'integration.api.port', '8096');
REPLACE INTO `cloud`.`configuration` (instance, name,value) VALUE('DEFAULT','router.ram.size', '256');
REPLACE INTO `cloud`.`configuration` (instance, name,value) VALUE('DEFAULT','router.cpu.mhz','256');
@@ -31,4 +34,10 @@
REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'expunge.interval', '60');
REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'management.network.cidr', '0.0.0.0/0');
REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'secstorage.allowed.internal.sites', '0.0.0.0/0');
-UPDATE `cloud`.`vm_template` SET unique_name="Macchinina",name="Macchinina",url="http://dl.openvm.eu/cloudstack/macchinina/x86_64/macchinina-xen.vhd.bz2",checksum="30985504bc31bf0cd3b9d2c6ca7944d3",display_text="Macchinina" where id=5;
\ No newline at end of file
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'cluster.cpu.allocated.capacity.disablethreshold', '1');
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'cluster.memory.allocated.capacity.disablethreshold', '1');
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'pool.storage.allocated.capacity.disablethreshold', '1');
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'pool.storage.capacity.disablethreshold', '1');
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'storage.overprovisioning.factor', '3');
+REPLACE INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'mem.overprovisioning.factor', '3');
+UPDATE `cloud`.`vm_template` SET unique_name="Macchinina",name="Macchinina",url="http://dl.openvm.eu/cloudstack/macchinina/x86_64/macchinina-xen.vhd.bz2",checksum="30985504bc31bf0cd3b9d2c6ca7944d3",display_text="Macchinina" where id=5;
启动虚拟机
执行“vagrant up”命令后,将启动两台虚拟机,一台是xenserver,一台是management。
$ vagrant up
完成后,在浏览器中访问http://192.168.22.5:8080/client/或http://localhost:8080/client/,即可打开CloudStack的用户界面。
您可以使用用户名admin和密码password进行登录。
(可能需要几分钟时间才能看到CloudStack的用户界面。)
创建区域
我将使用Marvin创建一个区域。
将marvin.cfg.erb复制一份,并更改管理服务器的IP地址。
$ cp marvin.cfg.erb marvin.cfg
@@ -109,15 +109,15 @@
},
"mgtSvr": [
{
- "mgtSvrIp": "<%= @management_server_ip %>",
- "port": <%= @management_server_port %>
+ "mgtSvrIp": "192.168.22.5",
+ "port": 8096
}
],
"dbSvr": {
- "dbSvr": "<%= @database_server_ip %>",
- "port": <%= @database_server_port %>,
- "user": "<%= @database_user %>",
- "passwd": "<%= @database_password %>",
- "db": "<%= @database %>"
+ "dbSvr": "192.168.22.5",
+ "port": 3306,
+ "user": "cloud",
+ "passwd": "cloud",
+ "db": "cloud"
}
执行以下命令将创建区域。
$ python ../../../tools/marvin/marvin/deployDataCenter.py -i marvin.cfg
如果在UI上确认了“基础架构 > 系统虚拟机”中,两个虚拟机(SSVM,CPVM)都成功启动,则表示成功。
创建虚拟机
为了确认操作,我将创建一个虚拟机。基本上,您只需按照常规方法创建即可。但是,如果使用常规模板或提供的内容,可能会超过容量限制,因此建议使用以下在prefill.sql中添加的模板或提供的内容。
-
- テンプレート: Macchinina
-
- Compute Offering
Devcloud4 offering
Devcloud4 offering – Local Storage
Disk Offering
Devcloud4 disk offering
Devcloud4 disk offering – Local Storage
从Macchinina模板创建的虚拟机,可以使用用户名:root,密码:password登录。
故障排除
如果系统虚拟机无法正常启动或者虚拟机创建失败,请登录管理界面并检查日志。我认为这很可能是由于容量限制引起的。
$ vagrant ssh management
$ sudo less /var/log/cloudstack/management/management-server.log