开源云主机管理平台调研。

1. 需求

轻量级云管理平台?

  1. 网络(划分 VLAN)
  2. 服务器资源(集群/多节点)
  3. 兼容性(KVM/Xen、数据库)
  4. 修改难易程度(删减不需要的模块)
  5. 部署测试

2. 云管理平台

2.1. ZStack

基于 Java,使用 Maven 进行编译

2.1.1. 企业付费版

一款产品化的 IaaS(基础设施即服务)软件,通过提供统一的平台来管理包括计算,网络,存储在内的数据中心资源。

  • 网络
  • 服务器资源
  • 兼容性
  • 修改难易程度
  • 部署测试

2.1.2. 社区开源版

提供基础的计算,网络,存储等 IaaS 软件的功能,可以免费申请下载。

  • 网络
  • 服务器资源
  • 兼容性
  • 修改难易程度
  • 部署测试

2.1.3. 编译

更新 yum 源,安装相关依赖:

$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum clean all
$ yum makecache
$ yum install -y vim tmux wget curl maven ant mariadb-server git zip unzip patch python-setuptools

下载 ZStack 源码:

$ git clone https://github.com/zstackio/zstack.git -b 2.0.2
$ git clone https://github.com/zstackio/zstack-utility.git -b 2.0.2
$ git clone https://github.com/zstackio/zstack-dashboard.git
$ git clone https://github.com/zstackio/zstack-vyos.git

下载 Tomcat 包:

$ wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.35/bin/apache-tomcat-7.0.35.zip

安装 Golang 环境:

$ wget https://mirrors.nju.edu.cn/golang/go1.10.8.linux-amd64.tar.gz
$ tar -C /usr/local -xvzf go1.10.8.linux-amd64.tar.gz
$ vim ~/.bashrc
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

zstack 打上以下补丁:

diff --git a/core/src/main/java/org/zstack/core/ScatteredValidator.java b/core/src/main/java/org/zstack/core/ScatteredValidator.jar.java b/core/src/main/java/org/zstack/core/ScatteredValidator.java
index f983e91..297588a 100755
--- a/core/src/main/java/org/zstack/core/ScatteredValidator.java
+++ b/core/src/main/java/org/zstack/core/ScatteredValidator.java
@@ -1,6 +1,5 @@
 package org.zstack.core;

-import com.sun.org.apache.regexp.internal.RE;
 import org.zstack.header.errorcode.OperationFailureException;
 import org.zstack.header.exception.CloudRuntimeException;
 import org.zstack.utils.DebugUtils;

zstack-utility 打上以下补丁:

diff --git a/zstackbuild/build.properties b/zstackbuild/build.properties
index 682d6b01..ccda4316 100644
--- a/zstackbuild/build.properties
+++ b/zstackbuild/build.properties
@@ -1,6 +1,6 @@
 zstack_build_root=/usr/local/zstack/root/
 #the git repository version for build
-build_version=master
+build_version=2.0.2
 product.name=ZStack
 #product.version=1.0.1
 product.bin.name=zstack-installer
@@ -22,7 +22,7 @@ apachetomcat.pkg=${zstack_build_root}/apache-tomcat-7.0.35.zip

 # For UI 1.x
 zstackdashboard.source=${zstack_build_root}/zstack-dashboard
-mevocoui.source=${zstack_build_root}/mevoco-ui
+#mevocoui.source=${zstack_build_root}/mevoco-ui
 zstackdashboard.build_version=${build_version}
 #zstackdashboard.source=${zstack_build_root}/zstack-ui
 #zstackdashboard.build_version=master
@@ -113,4 +113,4 @@ zstack.ui.source=${zstack_build_root}/zstack-ui
 build.zstack.ui.war.script=${zstackbuild.scripts}/build_zstack_ui_war.sh
 mevocoui2.build_version=${build_version}
 mevocouiserver.build_version=${build_version}
-build.zstack.ui.war=true
+build.zstack.ui.war=false
diff --git a/zstackbuild/build.xml b/zstackbuild/build.xml
index 96b61f5f..1d746fa2 100644
--- a/zstackbuild/build.xml
+++ b/zstackbuild/build.xml
@@ -267,9 +267,6 @@
             <sequential>
                 <antcall target="build-zstack-vyos"/>
             </sequential>
-            <sequential>
-                <antcall target="check-zstack-distro"/>
-            </sequential>
         </parallel>
     </target>

更换 maven 镜像:

  <mirrors>
    <mirror>
      <id>aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>Aliyun Mirror</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
  </mirrors>

编译 zstack

$ cd zstack && mvn -DskipTests clean install

编译 zstack-utility 并生成安装包:

$ cd zstack-utility/zstackbuild
$ ant -Dzstack_build_root=$ZSTACK_HOME -Dzstack.build_version=2.0.2 -Dzstack-utiltiy.build_version=2.0.2 -Dzstackdashboard.build_version=master all-in-one

使用 ZStack-x86_64-DVD-2.0.2.iso 安装 Expert Mode,然后上传编译的 bash 脚本,安装部署编译的版本:

$ bash zstack-installer-2.0.2.bin -i

使用安装好的 zstack-ctl 工具对数据库和 UI 进行安装:

$ zstack-ctl install_db --host=192.168.1.101
$ zstack-ctl install_rabbitmq --host=192.168.1.101
$ zstack-ctl install_ui

部署数据库:

$ zstack-ctl deploydb --host=192.168.1.101

启动管理节点服务:

$ zstack-ctl start_node

启动 Web UI 服务:

$ zstack-ctl start_ui

2.2. OpenStack

基于 Python

Devstack 是一套给开发人员快速部署 OpenStack 开发环境的脚本,不适用于生产环境。Devstack 将自动下载源代码,自动执行所有服务的安装脚本,自动生成正确的配置文件,自动安装依赖的软件包。

  • 网络:使用有问题
  • 服务器资源
  • 兼容性
  • 修改难易程度:代码复杂
  • 部署测试:编译安装成功

2.2.1. 安装

2.3. Apache CloudStack

基于 Java

Apache CloudStack 是一个开放源代码的基础架构即服务平台,该平台管理和协调存储,网络和计算机资源池以构建公共或私有 IaaS 计算云。

  • 网络
  • 服务器资源
  • 兼容性
  • 修改难易程度
  • 部署测试:编译成功

2.3.1. 安装

安装基础的依赖:

$ cat << EOT > /etc/yum.repos.d/mysql.repo
[mysql-community]
name=MySQL Community connectors
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/$releasever/$basearch/
gpgkey=http://repo.mysql.com/RPM-GPG-KEY-mysql
enabled=1
gpgcheck=1

[mysql-8.0-community]
name=MySQL Community connectors 8.0
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/$releasever/$basearch/
gpgkey=http://repo.mysql.com/RPM-GPG-KEY-mysql
enabled=1
gpgcheck=1
EOT
$ yum makecache
$ yum install -y mysql-connector-python
$ yum groupinstall -y "Development Tools"
$ yum install -y java-11-openjdk-devel.x86_64 genisoimage mysql mysql-server ws-commons-util MySQL-python python-setuptools createrepo

2.3.2. 编译

安装依赖软件(MySQL-5):

$ yum install -y epel-release
$ yum localinstall -y http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
$ yum makecache
$ yum install -y java-1.8.0-openjdk-devel maven python-setuptools python-pip genisoimage git mysql-community-server

使用 Maven-3.5.0 以及 Java-1.8:

$ wget https://archive.apache.org/dist/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
$ tar -zxvf apache-maven-3.5.0-bin.tar.gz
$ export PATH=$HOME/apache-maven-3.5.0/bin:$PATH
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
$ export PATH=$JAVA_HOME/bin:$PATH

获取 MySQL 的默认密码:

$ grep 'temporary password' /var/log/mysqld.log
$ vim utils/conf/db.properties

修改 MySQL 密码:

# mysql5.6
$ mysqladmin -uroot -p$OLD_PASS password ''
# mysql8
$ mysql -uroot -p
mysql> UNINSTALL COMPONENT "file://component_validate_password";

编译以及部署:

$ mvn -DskipTests -Pdeveloper,systemvm clean install
$ mvn -P developer -pl developer -Ddeploydb
$ mvn -pl :cloud-client-ui jetty:run

2.4. OpenNebula

基于 Ruby、C、JS

  • 网络
  • 服务器资源
  • 兼容性
  • 修改难易程度
  • 部署测试

2.4.1. 安装

添加软件包:

$ cat << EOT > /etc/yum.repos.d/opennebula.repo
[opennebula]
name=opennebula
baseurl=https://downloads.opennebula.io/repo/5.12/CentOS/7/x86_64
enabled=1
gpgcheck=0
EOT

安装相关依赖:

$ yum makecache
$ yum install -y epel-release
$ yum install -y opennebula-server opennebula-sunstone opennebula-ruby opennebula-gate opennebula-flow

安装 Ruby 版本控制软件以及相关插件:

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc && source ~/.bashrc
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ git clone https://github.com/andorchen/rbenv-china-mirror.git "$(rbenv root)"/plugins/rbenv-china-mirror
$ gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/

安装 Ruby-2.6.0 并下载 OpenNebula 相关 Gem 包:

$ yum install -y bzip2 gcc openssl-devel readline-devel zlib-devel
$ rbenv install 2.6.0
$ rbenv global 2.6.0
$ /usr/share/one/install_gems

关闭或清空防火墙,关闭 SELinux:

$ systemctl stop firewalld
$ iptables -F
$ setenforce 0

设置桥接网络:

$ yum install -y bridge-utils
$ cat << EOT > /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.xxx.xxx
NETMASK=255.255.255.0
GATEWAY=192.168.xxx.1
DNS1=114.114.114.114
NM_CONTROLLED=no
EOT
$ cat << EOT >> /etc/sysconfig/network-scripts/ifcfg-eth0
BRIDGE=br0
NM_CONTROLLED=no
EOT
$ systemctl restart network

3. Summary

云管理平台 网络 资源 兼容性 修改 部署
ZStack Enterprise &check; &cross; &check; &cross; &check;
ZStack Community &cross; &check; &check; &cross; &check;
OpenStack     &check; &cross; &cross;
Apache Cloudstack       &cross; &cross;
OpenNebula       &cross; &cross;

4. 更换网卡名称

修改内核配置,在 GRUB_CMDLINE_LINUX 中增加 net.ifnames=0 biosdevname=0 选项:

$ vim /etc/default/grub
...
GRUB_CMDLINE_LINUX="noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off mitigations=off crashkernel=auto rd.lvm.lv=zstack/root rd.lvm.lv=zstack/swap net.ifnames=0 biosdevname=0 rhgb quiet"
...
$ grub2-mkconfig -o /boot/grub2/grub.cfg

修改网卡名称:

$ ip link set ens192 down
$ ip link set ens192 name em2
$ ip link set em2 up

更改网卡信息:

$ mv /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-em2
$ vim /etc/sysconfig/network-scripts/ifcfg-em2
...
NAME="em2"
...
DEVICE="em2"
...

创建 70-persistent-net.rules 应用永久更改:

$ MAC=$(ifconfig em2 | grep ether | awk '{print $2}')
$ cat << EOT > /etc/udev/rules.d/70-persistent-net.rules
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="$MAC", NAME="em2"
EOT

5. References

The Top Nine Open Source Cloud Management Platforms
ZStack–网络模型 1:L2 和 L3 网络 - ZStack 上海云轴
zstack 源码安装 - 走在成长的道路上
如何将使用原生 Centos 系统安装的物理机添加为计算节点
Centos7 安装 OpenNebula - Fenng27
opennebula(一)在 Centos7.5 上部署 - iblk
How To Rename Network Ethernet Cards in CentOS7/RHEL7
CentOS 7.x 系统添加 70-persistent-net.rules 文件,来实现网卡名称自定义 - q35445762
CentOS 7 - Rename network interface without rebooting
Manual Installation - ZStack Installation
Getting Started With Manual Installation - ZStack Installation
云平台其他运维 - 运维手册 - ZStack