OpenNebula è un sistema di cloud simile a OpenStack Nova, più semplice nelle funzionalità ma più maturo.
Si compone di un nodo controllore (il cloud controller), di uno storage con le immagini delle VM e di una serie di nodi di calcolo che possono utilizzare hypervisor KVM, XEN oppure VMWare ESXi.
Il software del nodo controllore è realizzato in ruby e, cosa più interessante, comunica con i nodi di calcolo esclusivamente lanciando comandi in ssh: pertanto sui nodi di calcolo non è necessario installare alcun pacchetto addizionale rispetto ad un hypervisor standard.
Analizziamo l’installazione di un sistema di test formato da un cloud controller che fungerà anche da storage esportando una directory locale tramite NFS e di due nodi di calcolo con XEN. Per il cloud controller ho scelto ubuntu 10.10, mentre per i nodi ho utilizzato la distribuzione Debian 6.0.
Informazioni di rete
IP Gateway: 172.16.0.254/24
IP Cloud Controller: 172.16.0.1/24
IP Nodo 01: 172.16.0.2/24
IP Nodo 02: 172.16.0.3/24
Cloud Controller
Installare la distribuzione Ubuntu 10.10 abilitando esclusivamente il server ssh.
Dopo il riavvio, modificare il file /etc/hosts ed aggiungere:
/etc/hosts 172.16.0.1 cloud-cc 172.16.0.2 cloud-01 172.16.0.3 cloud-02
Installare i pacchetti aggiuntivi necessari per la compilazione di OpenNebula
apt-get install libsqlite3-dev libxmlrpc-c3-dev scons g++ ruby libopenssl-ruby libssl-dev ruby-dev make rake rubygems libxml-parser-ruby1.8 libxslt1-dev libxml2-dev genisoimage libmysqlclient16 libsqlite3-ruby libsqlite3-ruby1.8 mysql-server nfs-common libmysqlclient-dev nfs-kernel-server nfs-common portmap rails thin gem install nokogiri gem install json gem install sinatra gem install rack gem install thin cd /usr/bin ln -s rackup1.8 rackup
Creazione dello storage per le immagini (images conterrà gli ISO, one conterrà tutto il software necesasario a gestire il cloud) utilizzando un server NFS all’ip 172.16.0.253 che esporta la directory /nfs/public
/etc/export /srv/cloud 172.16.0.0(rw,sync,no_root_squash)
mkdir -p /srv/cloud/images mkdir -p /srv/cloud/one exportfs -a
Creiamo quindi l’utente di gestione del cloud che dovrà essere identico du tutti i server
groupadd cloud useradd -d /srv/cloud/one -s /bin/bash -g cloud -m oneadmin chown -R oneadmin:cloud /srv/cloud/ chmod 775 /srv id oneadmin #(segnarsi gli id: nel mio caso uid=1001, gid=1001)
Creiamo il database mysql che conterrà tutte le informazioni del nostro cloud: ho scelto di usare mysql in modo da avere maggiori possibilità di scalare in un futuro.
mysql -p create database opennebula; create user oneadmin identified by 'oneadmin'; grant all on opennebula.* to 'oneadmin'@'%'; exit;
A questo punto entriamo in modalità non privilegiata e creiamo le credenziali di accesso ssh con certificato in modo da permettere le comunicazioni tra gli host del cloud in forma criptata senza bisogno di inserire la password:
su - oneadmin ssh-keygen (usare i parametri di default) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chown 640 ~/.ssh/authorized_keys mkdir ~/.one
Creiamo quindi il file con le variabili di ambiente .profile
.profile export ONE_AUTH='/srv/cloud/one/.one/one_auth' export ONE_LOCATION='/srv/cloud/one' export ONE_XMLRPC='http://localhost:2633/RPC2' export PATH=$PATH':/srv/cloud/one/bin'
Creiamo il file con le username e password:
/srv/cloud/one/.one/one_auth oneadmin:password
source .profile
A questo punto siamo pronti per procedere con la compilazione di opennebula, da eseguire come utente non privilegiato “oneadmin”
cd wget http://dev.opennebula.org/attachments/download/339/opennebula-2.2.tar.gz tar zxvf opennebula-2.2.tar.gz cd opennebula-2.2 scons -j2 mysql=yes ./install.sh -d /srv/cloud/one
La configurazione di OpenNebula avviene solo sul cloud controller attraverso la modifica del file etc/oned.conf:
etc/oned.conf
HOST_MONITORING_INTERVAL = 60
VM_POLLING_INTERVAL = 60
VM_DIR=/srv/cloud/one/var
SCRIPTS_REMOTE_DIR=/tmp/one
DB = [ backend = "mysql",
server = "localhost",
port = 0,
user = "oneadmin",
passwd = "oneadmin",
db_name = "opennebula" ]
VNC_BASE_PORT = 5000
DEBUG_LEVEL=3
NETWORK_SIZE = 254
MAC_PREFIX = "00:03"
DEFAULT_IMAGE_TYPE = "OS"
DEFAULT_DEVICE_PREFIX = "hd"
IM_MAD = [
name = "im_xen",
executable = "one_im_ssh",
arguments = "xen" ]
VM_MAD = [
name = "vmm_xen",
executable = "one_vmm_ssh",
arguments = "xen",
default = "vmm_ssh/vmm_ssh_xen.conf",
type = "xen" ]
TM_MAD = [
name = "tm_nfs",
executable = "one_tm",
arguments = "tm_nfs/tm_nfs.conf" ]
HM_MAD = [
executable = "one_hm" ]
VM_HOOK = [
name = "image",
on = "DONE",
command = "image.rb",
arguments = "$VMID"
HOST_HOOK = [
name = "error",
on = "ERROR",
command = "host_error.rb",
arguments = "$HID -r n",
remote = "no" ]
VM_HOOK = [
name = "on_failure_resubmit",
on = "FAILED",
command = "/usr/bin/env onevm resubmit",
arguments = "$VMID" ]
A questo punto la configurazione del cloud controller è terminata. Con i seguenti comandi avvieremo l’interfaccia il demone di controllo e l’interfaccia web:
one start sunstone-server -H 0.0.0.0 start
Per avviare automaticamente al boot i due demoni ho modificato opportunamente lo script di startup:
/etc/init.d/one
#! /bin/sh
### BEGIN INIT INFO
# Provides: opennebula
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: OpenNebula init script
# Description: OpenNebula cloud initialisation script
### END INIT INFO
# Author: Soren Hansen
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/srv/cloud/one
DESC="OpenNebula cloud"
NAME=one
SUNSTONE=/srv/cloud/one/bin/sunstone-server
DAEMON=/srv/cloud/one/bin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
mkdir -p /var/run/one /var/lock/one
chown oneadmin /var/run/one /var/lock/one
su - oneadmin -s /bin/sh -c "$DAEMON start"
su - oneadmin -s /bin/sh -c "$SUNSTONE -H 0.0.0.0 start"
}
#
# Function that stops the daemon/service
#
do_stop()
{
su - oneadmin -s /bin/sh -c "$SUNSTONE stop"
su - oneadmin -s /bin/sh -c "$DAEMON stop"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
:
Inoltre lanciamo il seguente comando per lanciarlo automaticamente:
update-rc.d one defaults
Installazione dei nodi di calcolo
Installare XEN 4.0.1 su Debian 6 abilitando server ssh così come spiegato nel precedente articolo.
Modificare il file /etc/hosts ed aggiungere
172.16.0.1 cloud-cc 172.16.0.2 cloud-01 172.16.0.3 cloud-02
Installare il software aggiuntivo per interagire con il cloud controller
apt-get install ruby nfs-common
Montiamo lo storage per le immagini utilizzando un server NFS all’ip 172.16.0.1 che esporta la directory /nfs/public:
nano /etc/fstab 172.16.0.1:/srv/cloud /srv/cloud nfs soft,intr,rsize=8192,wsize=8192
mkdir -p /srv/cloud mount /srv/cloud
Creiamo l’utente di gestione del cloud rispettando uid e gid del cloud controller (nel mio caso 1001 e 1001)
groupadd --gid 1001 cloud useradd --uid 1001 -g cloud -d /srv/cloud/one -s /bin/bash oneadmin
Aggiungiamo le credenziali di accesso ssh con certificato editare il file /srv/cloud/one/.ssh/authorized_keys, duplicando la riga relativa a cloud-cc e impostando il nome host a cloud-01. ad es:
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-cc ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-01 ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-02
Eseguiamo un paio di configurazioni specifiche per XEN. Editare il file /etc/sudoers ed aggiungere:
/etc/sudoers %cloud ALL=(ALL) NOPASSWD: /usr/sbin/xm * %cloud ALL=(ALL) NOPASSWD: /usr/sbin/xentop *
Anche la configuarzione del nodo di calcolo è ultimata!
Una volta installato anche il secondo nodo, spostarsi sul cloud controller e lanciare i seguenti comandi come utente oneadmin per aggiungere i sue nodi di calcolo al cluster:
onehost create cloud-01 im_xen vmm_xen tm_nfs onehost create cloud-02 im_xen vmm_xen tm_nfs
Nel prossimo articolo vedremo come testare il sistema creando una nuova macchina virtuale base e usando i comandi shell per gestirla.