Nova (Openstack Compute Service) sobre Ubuntu 11.10

Objectiu:

Instal·lar els components de Nova sobre Ubuntu, que utilitzin Keystone per a l’autenticació i Glance com a repositori de les imatges.

Les dues entrades anteriors explicaven com instal·lar Keystone i Glance en un entorn Ubuntu. La instal·lació i funcionament, comparades amb la de Nova són força simples.

Nova incorpora una sèrie de components que estan separats ja que s’enten que la majoria d’aquests s’instal·laran en diverses màquines i d’altres només en algunes concretes. Per exemple el gestor que escull la ubicació d’on executarà una instància només s’executarà en el node controlador, mentre que el component compute s’executarà en tots aquells nodes que puguin instanciar màquines virtuals. En aquest tutorial ho instal·larem tot en una sola màquina.

Procediment:

Les versions que els repositoris d’Ubuntu 11.10 ofereixen de Keystone, Glance i Nova no permeten l’ús de Keystone com a mòdul d’autenticació central, es produeixen un munt d’errors. Es per això que utilitzarem la versió dels paquets que openstack ofereix en el seu repositori personal (ppa).

Les comandes per instal·lar els components de nova són:

# apt-get install python-software-properties
# add-apt-repository ppa:nova-core/trunk
# apt-get update
# apt-get install -y rabbitmq-server python-greenlet python-mysqldb lvm2

A continuació, crearem un grup de volums a la part del disc dur que havíem deixat buit en la instal·lació de Ubuntu (en el tutorial de Keystone). Creem una nova partició amb el que quedi lliure:

# fdisk /dev/sda

A continuació, un cop fora de l’fdisk executem:

# partprobe
# pvcreate /dev/sda3
# vgcreate nova-volumes /dev/sda3
# vgs
  VG           #PV #LV #SN Attr   VSize   VFree  
  nova-volumes   1   0   0 wz--n- 206,75g 206,75g

NOTA: En aquest punt s’ha assumit que la partició on creem el volum és la 3. Si ho heu fet en una altra assegureu-vos que la informació és correcta per tal de no perdre dades.

Instal·lem els paquets bàsics de nova:

# apt-get install nova-volume nova-api nova-scheduler nova-network nova-compute

Aturem tots els serveis de nova per procedir a la configuració:

# ls /etc/init.d/nova-* | cut -d'/' -f4 | while read l; do service ${l} stop; done

Primer que res creem una base de dades MySQL per a nova:

# mysql -p
Enter password:

mysql> create database nova;
mysql> grant all privileges on nova.* to 'nova'@'%' identified by 'pAssw0rd' with grant option;
mysql> quit;
Bye

Seguidament modificarem l’arxiu /etc/nova/nova.conf i per que contingui la següent informació bàsica:

# cat /etc/nova/nova.conf
--sql_connection=mysql://nova:pAssw0rd@IP_SERVIDOR/nova

--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/var/lock/nova
--use_deprecated_auth
--force_dhcp_release
--libvirt_use_virtio_for_bridges
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--iscsi_helper=tgtadm

--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth0
--flat_network_bridge=br100
--flat_injected=False

En aquest punt preparem l’schema de la base de dades:

# nova-manage db sync

Borrem la base de dades anterior per defecte:

# rm -f /var/lib/nova/nova.sqlite

Cal configurar nova per que autentiqui mitjançant Keystone. Per això haurem de modificar l’arxiu /etc/nova/api-paste.ini. Les pipelines i la configuració del client Keystone a modificar és:

...
[pipeline:ec2cloud]
pipeline = ec2faultwrap logrequest ec2keystoneauth cloudrequest authorizer validator ec2executor
...
[pipeline:openstack_compute_api_v2]
pipeline = faultwrap authtoken keystonecontext ratelimit osapi_compute_app_v2
...
[pipeline:openstack_volume_api_v1]
pipeline = faultwrap authtoken keystonecontext ratelimit osapi_volume_app_v1
...
[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = IP_SERVIDOR
service_port = 5000
auth_host = IP_SERVIDOR
auth_port = 35357
auth_protocol = http
auth_uri = http://IP_SERVIDOR:5000/
admin_token = 999888777666

I finalment ja podem arrencar tots els serveis de nova de nou:

# ls /etc/init.d/nova-* | cut -d'/' -f4 | while read l; do service ${l} start; done
# nova-manage service list
Binary           Host                                 Zone             Status     State Updated_At
nova-volume      openstack                            nova             enabled    :-)   2012-02-17 10:41:16.227129
nova-scheduler   openstack                            nova             enabled    :-)   2012-02-17 10:41:16.335346
nova-compute     openstack                            nova             enabled    :-)   2012-02-17 10:41:12.113813
nova-network     openstack                            nova             enabled    :-)   2012-02-17 10:41:16.439966

Si totes les emoticones somriuen es que tot ha arrencat correctament.

Per a qualsevol comanda posterior que fem amb el nova ens farà falta autenticació (que ens proporciona Keystone). Hi ha dues maneres de subministrar les credencials. Una és mitjançant paràmetres a la comanda:

# nova --auth_url http://IP_SERVIDOR:5000/v2.0/ --tenant_name admin --password root --username admin list
+----+------+--------+----------+
| ID | Name | Status | Networks |
+----+------+--------+----------+
+----+------+--------+----------+

L’altra opció (força més útil) és mitjançant variables d’entorn:

# export OS_USERNAME=admin; export OS_PASSWORD=root; export OS_TENANT_NAME=admin; export OS_AUTH_URL=http://IP_SERVIDOR:5000/v2.0/
# nova list
+----+------+--------+----------+
| ID | Name | Status | Networks |
+----+------+--------+----------+
+----+------+--------+----------+

Configuració posterior:

És hora de configurar la xarxa amb les adreces IP que assignarem a les màquines virtuals. Podem utilitzar diferents estratègies essent potser la més simple FlatDHCP de manera que una màquina rebrà l’adreça IP per DHCP en la xarxa en la que es troba el host.

Així, per exemple, si la IP_SERVIDOR fos 192.168.0.100 (amb mascara /24) podríem crear una xarxa a nova com ara 192.168.0.200/28 que inclouria de la .200 a la .216 amb 14 IPs utilitzables. La comanda que crea la xarxa a nova és:

# nova-manage network create --label=public --fixed_range_v4=192.168.0.200/28
# nova-manage network list
id   	IPv4              	IPv6           	start address  	DNS1           	DNS2           	VlanID         	project        	uuid           
1    	192.168.0.200/28  	None           	192.168.0.201  	8.8.4.4        	None           	None           	None           	12606c34-4ca8-49e8-92ff-6d1d171224b8

Ho tenim tot preparat per descarregar una imatge, pujar-la a glance i instanciar-la amb nova. El procediment és el següent:

# wget http://uec-images.ubuntu.com/releases/11.10/release/ubuntu-11.10-server-cloudimg-amd64-disk1.img
# glance -A=999888777666 add name="ubuntu11.10" < ubuntu-11.10-server-cloudimg-amd64-disk1.img

Creem un parell de claus que ens permetran accedir a les màquines virtuals sense autenticació:

# nova keypair-add mykey > /root/mykey.priv
# chmod 600 /root/mykey.priv

Arranquem la màquina virtual:

# nova boot --flavor 1 --image IMAGE_ID --key_name mykey ubuntu

NOTA: En aquest exemple s'ha de substituir IMAGE_ID amb l'identificador que glance ha retornar a l'afegir la imatge.

Si tot ha anat bé veurem el següent:

# nova list
+--------------------------------------+--------+--------+----------------------+
|                  ID                  |  Name  | Status |       Networks       |
+--------------------------------------+--------+--------+----------------------+
| ef73779d-b910-4967-9f85-ba43db7444f5 | ubuntu | ACTIVE | public=192.168.0.201 |
+--------------------------------------+--------+--------+----------------------+

Afegim les regles per accedir via SSH:

# nova secgroup-add-rule default tcp 22 22 0.0.0.0/0

I finalment accedim amb SSH a la nova màquina virtual:

# ssh -i mykey.priv ubuntu@192.168.0.201

Per aturar la màquina farem:

# nova delete ef73779d-b910-4967-9f85-ba43db7444f5

Afegir volums en temps real a les VM:

Un dels punts forts de la virtualització és la possibilitat de afegir volums en calent a les màquines virtuals, d'aquesta manera es separa el que és el sistema operatiu i el serveis de les dades d'aplicació. En aquest cas nova utilitza volums iSCSI que adjunta a les VM. Vegem com fer-ho.

El primer que farem és crear un nou volum, assegurant-nos que el servei tgt estigui funcionant:

# service tgt start
# nova volume-create --display_name UnVolum 5

Això crearà un volum LVM a la partició /dev/nova-volumes (en /dev/sda3) de mida 5Gb i l'exportarà via iSCSI. Veurem que tot ha anat bé si a la llista de volums apareix com a disponible:

# nova volume-list
+----+-----------+--------------+------+-------------+
| ID |   Status  | Display Name | Size | Attached to |
+----+-----------+--------------+------+-------------+
| 1  | available | UnVolum      | 5    | None        |
+----+-----------+--------------+------+-------------+

Per assignar-lo a una màquina virtual en funcionament fem:

# nova volume-attach ef73779d-b910-4967-9f85-ba43db7444f5 1 /dev/sdm

L'identificador correspon a la màquina virtual, el segon paràmetre correspon a l'identificador del volum i el /dev/sdm es un disc local que s'utilitzarà temporalment pel muntatge posterior a la màquina virtual. Un cop executada la comanda, si executem un dmesg a la màquina virtual hauríem de veure la informació del nou volum detectat que ja podem tractar com una unitat més, particionant-la, muntant-la i demés.

Per treure un volum d'una instància podem fer:

# nova volume-detach ef73779d-b910-4967-9f85-ba43db7444f5 1

I finalment per eliminar un volum farem:

# nova volume-delete 1

Documentació:

La documentació d'openstack es pot trobar a http://docs.openstack.org.

Són molt recomanables també els projectes devstack.org i debostack.org. Són scripts bash que duen a terme la instal·lació pas a pas. La lectura i comprensió és gairebé obligatòria.

Bona sort i benvinguts al núvol. 🙂