Proyecto final de Centros de Datos y Provisión de SS - ETSIT UPM
Desarrollado por Rodrigo Barbado y Federico Fernández.
El servicio se divide en dos partes:
- server.cdpsfy.es: es el servidor front-end de la aplicación. Contiene la lógica de la misma, así como el modelo de datos de canciones. Su implementación se encuentra aquí.
- tracks.cdpsfy.es: es una red de servidores web y de disco, que almacena las canciones y las sirve vía HTTP. La implementación del servidor web RESTful se encuentra aquí.
La solución que se ha implementado proporciona una alta disponibilidad, y es fácilmente escalable. La arquitectura básica puede verse en la siguiente figura:
En Docker, ha sido necesario realizar algunas modificaciones, que pueden verse a continuación:
Docker permite fácilmente que el servicio funcione en cualquier parte, independientemente del entorno y sus características.
- lb1 y lb2: son dos balanceadores de carga, que utilizan la imagen de
tutum/haproxy
. Esta imagen facilita que el balanceo se produzca entre todas las instancias de www y de tracks que se arranquen en cada momento de forma automática. Ambos balanceadores escuchan en sendos puertos5000
, que se mapean con el80
(lb1,www.cdpsfy.es
) y5000
(lb2,tracks.cdpsfy.es
) en el host. - www: es el servicio en que se aloja la aplicación web (
server.cdpsfy.es
). Además del puerto5000
, expone sus puertos7
y22
para la monitorización desde Nagios. - tracks: es el servicio en que se aloja el servidor REST (
tracks.cdpsfy.es
). Además del puerto5000
, expone sus puertos7
y22
para la monitorización desde Nagios. - db: es el servicio en que se aloja la base de datos, y utiliza la imagen de Postgres para ello. Expone su puerto
5432
para la conexión a la base de datos desde fuera. Contiene un volumen de datos. - nas: es un servicio que se utiliza únicamente para alojar el volumen de datos en que se almacenan las canciones. Este volumen se monta en las instancias del servicio tracks (línea discontinua).
- nagios: es un servicio que aloja el servidor Nagios.
Se han definido las siguientes variables de entorno, a fin de que se pueda configurar cdpsfy en cualquier entorno:
Variable | Descripción | Valor por defecto |
---|---|---|
PORT | Puerto en que se lanzará la aplicación web | 8080 |
TRACKS_HOST | URL del host y puerto en que se ha lanzado el servidor tracks | localhost:8000 |
DATABASE_URL | URL a utilizar para la base de datos | - |
PASSWORD_ENCRYPTION_KEY | Utilizada para cifrar las contraseñas de los usuarios | - |
Variable | Descripción | Valor por defecto |
---|---|---|
PORT | Puerto en que se lanzará la aplicación web | 8000 |
TMPPATH | Ruta en que se almacenarán temporalmente las canciones subidas | ./.tmp/ |
NASPATH | Ruta en que se almacenarán las canciones subidas | __dirname |
-
Instalar
git
:sudo apt-get install git
-
Descargar la práctica con:
git clone https://github.com/FedericoFdez/cdpsfy.git && cd cdpsfy
-
Instalar las dependencias y arrancar server:
cd server npm install npm test
El script
npm test
arranca el servidor con las variables de entorno necesarias para utilizar una base de datos SQLITE, adecuada para entornos de desarrollo. -
Instalar las dependencias y arrancar tracks:
cd tracks npm install npm start
De este modo, server está disponible en localhost:8080
, y tracks en localhost:8000
.
-
Instalar VNX, siguiendo las instrucciones disponibles en este enlace.
-
Descargar la imagen utilizada por las máquinas virtuales del escenario mediante:
cd /usr/share/vnx/filesystems vnx_download_rootfs -r vnx_rootfs_lxc_ubuntu-14.04-v025-cdps.tgz ln -s vnx_rootfs_lxc_ubuntu-14.04-v025-cdps rootfs_lxc-cdps
-
Instalar Nagios manualmente en el sistema de archivos, para ello:
sudo vnx --modify-rootfs filesystems/rootfs_lxc-cdps sudo dhclient eth0 sudo apt-get install -y nagios3
Y seguir las instrucciones de instalación que aparecen en pantalla. Hay un fallo en la configuración de idiomas que impediría la correcta instalación de la base de datos, que se hará posteriormente. Para resolverlo, debe ejecutarse:
export LANGUAGE="en_US.UTF-8" export LC_ALL="en_US.UTF-8" echo 'LANGUAGE="en_US.UTF-8"' >> /etc/default/locale echo 'LC_ALL="en_US.UTF-8"' >> /etc/default/locale
Para finalizar:
halt -p
-
Instalar
git
ypython
con:sudo apt-get install git python
-
Descargar la práctica con:
git clone https://github.com/FedericoFdez/cdpsfy.git && cd cdpsfy
-
Arrancar la práctica con:
./crear_escenario.py
El script
crear_escenario.py
se encarga de configurar todos los parámetros y variables de entorno necesarios.
Se arrancarán varias máquinas virtuales con sus respectivas consolas. Desde el host:
- La web de cdpsfy está disponible en
http://www.cdpsfy.es
- La interfaz web de monitorización de Nagios está disponible en
http://nagios/nagios3
. - La interfaz web del balanceador de carga está disponible en
http://lb:8003
.
Finalmente, para cerrar el escenario (desde el host):
./eliminar_escenario.py
###Despliegue en Docker
-
Instalar Docker siguiendo las instrucciones en este enlace.
-
Instalar Docker-Compose siguiendo las instrucciones en este enlace.
-
Instalar Flocker siguiendo las instrucciones en este enlace. Es necesario realizar la instalación completa (full install) para que se instale el plugin de Flocker para Docker, que se utilizará para gestionar los volúmenes de datos.
- Instalar el cliente de Flocker, siguiendo las instrucciones en este enlace.
- Instalar los servicios para los nodos de Flocker (Flocker Node Services) y el plugin de Flocker para Docker, siguiendo las instrucciones en este enlace.
-
Configurar Flocker siguiendo los pasos en este enlace.
- Configurar la autenticación con el cluster, tanto del cliente que se comunica con el agente Flocker como de cada uno de los nodos (en este caso solo hay uno), tal y como se indica en este enlace.
- Generar certificados para el cliente de la API, según este enlace.
- Generar certificados para el plugin de Flocker para Docker, según este enlace.
- Habilitar el servicio de control, como se muestra en este enlace.
- Configurar el backend de almacenamiento (véase este enlace. En este caso se elige un backend ZFS para almacenamiento local, para ello, deben seguirse los siguientes pasos:
-
Instalar ZFS (véase este enlace).
-
Crear un pool ZFS. Se recomienda crear uno de tipo mirror, por ejemplo, con cuatro discos de 1 GB virtualizados sobre tres ficheros, como se muestra a continuación:
mkdir -p /var/opt/flocker truncate --size 1G /var/opt/flocker/nas1 truncate --size 1G /var/opt/flocker/nas2 truncate --size 1G /var/opt/flocker/nas3 ZFS_MODULE_LOADING=yes zpool create flocker mirror /var/opt/flocker/nas1 /var/opt/flocker/nas2 /var/opt/flocker/nas3 /var/opt/flocker/nas4
-
Configurar ZFS como backend de almacenamiento en los nodos de Flocker (véase este enlace).
-
Instalar
git
con:sudo apt-get install git
-
Clonar el repositorio del proyecto con:
git clone https://github.com/FedericoFdez/cdpsfy.git
-
Compilar las imágenes de Docker usando Docker-Compose, desde el directorio
cdpsfy/docker
, con:docker-compose build
-
Finalmente, ejecutar los contenedores con las imágenes correspondientes, con:
docker-compose run -d
Puede usarse
docker-compose logs
para ver los logs de los contenedores -
Por defecto, el comando anterior lanza un contenedor por cada servicio. Sin embargo, CDPSfy es una aplicación que se caracteriza por ser escalable, y Docker-Compose facilita mucho esta tarea. Pueden lanzarse varias instancias de servidores server y tracks con un comando como el siguiente:
docker-compose scale www=2 tracks=4
La orden anterior configura dos instancias de server y 4 instancias de tracks.
-
Para que los HAProxy balanceen la carga entre todos los servidores creados, es necesario volver a lanzar el servicio, en este caso con el comando siguiente:
docker-compose run -d --force-recreate
-
Para parar el escenario, debe utilizarse:
docker-compose kill