在本地化设施中使用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进行相应设置。)

    1. 在VirtualBox菜单中打开”环境设置”。

 

    1. 打开”网络”标签的”仅主机网络”。

 

    分别按下面的方式设置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)都成功启动,则表示成功。

システムVMの起動を確認.png

创建虚拟机

为了确认操作,我将创建一个虚拟机。基本上,您只需按照常规方法创建即可。但是,如果使用常规模板或提供的内容,可能会超过容量限制,因此建议使用以下在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
广告
将在 10 秒后关闭
bannerAds