Utilizando nova-docker y nova-compute-lxd drivers

Hace tiempo estuve leyendo un articulo de Lars Kellogg Stedman donde menciona la posibilidad de utilizar varios «hipervisores» en el mismo nodo de computo, por medio de la instalación y configuración de nova-docker driver en conjunto con el levantamiento de un servicio adicional de nova-compute, el cual se encarga de despachar las peticiones por los usuarios para ese hipervisor en particular. Esta información esta basada en Fedora 21 y hace uso de los servicios de systemd, pero puede ser adaptado a cualquier otra distribución de Linux.

Este articulo pretende enlistar aquellos pasos necesarios para lograr el mismo objetivo en Ubuntu 14.04 LTS. Ademas de incluir Docker, se incluye los pasos necesarios para agregar LXD como otra alternativa mas en la lista de «hipervisores».

Nota : Se asume la correcta instalación y configuración de otros servicios de OpenStack en el servidor.

Antes que nada es necesario instalar algunas dependencias y servicios que serán utilizados mas tarde, por lo cual se necesita validar conexión a internet y que la cuenta utilizada tenga permisos de administrador sobre la maquina.

Instalación de dependencias

sudo apt-get update -y
sudo apt-get install -y git python-dev crudini

# Instalacion de pip
curl https://bootstrap.pypa.io/get-pip.py | sudo python

# Instalacion de LXD
sudo add-apt-repository -y ppa:ubuntu-lxc/lxd-git-master
sudo apt-get update -y
sudo apt-get install -y lxd

# Instalacion de Docker
curl -sSL https://get.docker.com/ubuntu/ | sudo sh

Una vez instaladas algunas dependencias y servicios, realizaremos la descarga e instalación de los drivers para la comunicación de nova con el «hipervisor». Ya que no hay garantia de que estos drivers puedan estar incluidos en los paquetes o dependencias de los paquetes de OpenStack es mas sencillo instalarlos de forma manual. Para ello se necesita descargar el código fuente (clonando el repositorio) e instalarlo por medio de pip o simplemente utilizando python setup install.

Instalación de drivers

git clone https://github.com/stackforge/nova-docker /tmp/nova-docker
git clone https://github.com/lxc/nova-compute-lxd /tmp/nova-compute-lxd

pushd /tmp/nova-docker
git checkout stable/kilo
cp etc/nova/rootwrap.d/docker.filters /etc/nova/rootwrap.d
pip install .
popd

pushd /tmp/nova-compute-lxd
git checkout stable/kilo
cp etc/nova/rootwrap.d/lxd.filters /etc/nova/rootwrap.d
pip install .
popd

Cabe mencionar que el branch utilizado en esta ocasión es para release de Kilo, esto puede variar con respecto al release utilizado, y es necesario incluir los filtros que serán utilizados por rootwrap.

El siguiente paso consiste en configurar cada servicio para que utilize un driver especifico y así conectarse con el hipervisor correspondiente. Cada servicio utilizara un valor de host diferente para poder ser diferenciados y require los valores necesarios para conectarse con el servidor de cola de mensajes.

Configuración de drivers

# Configuracion de nova-docker
touch /etc/nova/nova-docker.conf
chown nova:nova /etc/nova/nova-docker.conf

crudini --set /etc/nova/nova-docker.conf DEFAULT host docker${CONFIGURATION}
crudini --set /etc/nova/nova-docker.conf DEFAULT compute_driver novadocker.virt.docker.DockerDriver
crudini --set /etc/nova/nova-docker.conf DEFAULT state_path /var/lib/nova-docker

crudini --set /etc/nova/nova-docker.conf DEFAULT rpc_backend rabbit
crudini --set /etc/nova/nova-docker.conf oslo_messaging_rabbit rabbit_host ${MESSAGE_BROKER_HOSTNAME}
crudini --set /etc/nova/nova-docker.conf oslo_messaging_rabbit rabbit_userid openstack
crudini --set /etc/nova/nova-docker.conf oslo_messaging_rabbit rabbit_password ${RABBIT_PASS}

# Configuracion de nova-compute-lxd
touch /etc/nova/nova-compute-lxd.conf
chown nova:nova /etc/nova/nova-compute-lxd.conf

crudini --set /etc/nova/nova-compute-lxd.conf DEFAULT host lxd${CONFIGURATION}
crudini --set /etc/nova/nova-compute-lxd.conf DEFAULT compute_driver nclxd.nova.virt.lxd.LXDDriver
crudini --set /etc/nova/nova-compute-lxd.conf DEFAULT state_path /var/lib/nova-compute-lxd

crudini --set /etc/nova/nova-compute-lxd.conf DEFAULT rpc_backend rabbit
crudini --set /etc/nova/nova-compute-lxd.conf oslo_messaging_rabbit rabbit_host ${MESSAGE_BROKER_HOSTNAME}
crudini --set /etc/nova/nova-compute-lxd.conf oslo_messaging_rabbit rabbit_userid openstack
crudini --set /etc/nova/nova-compute-lxd.conf oslo_messaging_rabbit rabbit_password ${RABBIT_PASS}

Por ultimo y no menos importante, es necesario registrar los servicios para que estos puedan ser levantados durante el arranque de la maquina por upstart. Para lograrlo se necesita agregar las instrucciones de arranque del servicio en archivos localizados en el directorio /etc/init/.

Configuration de servicios

cat < /etc/init/nova-docker.conf
# vim: set ft=upstart et ts=2:
description "Nova compute docker worker"
author "Victor Morales "

start on runlevel [2345]
stop on runlevel [!2345]

exec start-stop-daemon --start --chuid root --exec /usr/bin/nova-compute -- --config-file=/etc/nova/nova-docker.conf
EOL

cat < /etc/init/nova-compute-lxd.conf
# vim: set ft=upstart et ts=2:
description "Nova compute LXD worker"
author "Victor Morales "

start on runlevel [2345]
stop on runlevel [!2345]

exec start-stop-daemon --start --chuid root --exec /usr/bin/nova-compute -- --config-file=/etc/nova/nova-compute-lxd.conf
EOL

service nova-docker restart
service nova-compute-lxd restart

Una vez que los servicios inicien y puedan comunicarse con el servidor de cola de mensajes, serán registrados dentro del catalogo de «hipervisores» disponibles para OpenStack.