¿Cómo desplegar onesait Platform en CaaS Rancher?

ES | EN

Introducción

La Plataforma está preparada para desplegarse completamente contenerizada sobre Docker, como podemos ver en este tutorial: (Deployment) How to execute the platform with Docker

Sin embargo, en escenarios productivos es conveniente tener una plataforma CaaS que nos ayude a gestionar todos los contenedores Docker que tengamos en ejecución.

Cuando ofrecemos la plataforma bajo un esquema PaaS (Plataforma como Servicio) utilizamos RedHat OpenShift como plataforma CaaS de soporte.

Pero la plataforma también funciona sobre otras plataformas CaaS. Si tenemos que desplegar la plataforma en una infraestructura OnPremise suministrada por el cliente podemos adaptarnos a la plataforma Kubernetes que use el cliente. En otros escenarios el cliente no tiene ninguna plataforma, en ese caso proponemos Rancher, que es una plataforma open-source de gestión de contenedores muy ligera y sencilla de montar como vamos a ver...

¿Cómo instalar Rancher en un entorno con un Master y un Worker?

Para instalar Rancher necesitará al menos dos máquinas (físicas o virtuales) con un Linux de 64 bits. En una de ellas se instalará el server de Rancher (Master) y en la otra VM la plataforma (Worker)

NOTA: llegado el caso puede llegarse a instalar todo en una única VM más potente.

requisitos mínimos

Requisitos mínimos Onesait Platform

  • Un portátil o máquina adicional donde ejecutar el contenedor.
    • En la máquina desde la que se ejecute el contenedor, Docker versión 17 o superior.
  • En las VMs destino:
    • 1 VM para el CaaS de 2/4 cores y 4/8 GiB de RAM
    • 1 VM para la OP de 4/8 cores y 32/64GiB de RAM 
    • SO CentOS >= 7, RHEL7, Oracle Linux >= 7 o Ubuntu >= 18 (experimental).
    • 250GB de disco
    • acceso ssh
    • tráfico interno habilitado en los puertos 4500/udp, 500/udp y 8080/tcp y externo en los puertos 443/tcp 
    • en algunos casos puede ser necesario deshabilitar selinux

EN NODO MASTER:

1.- Instalar Docker CE en Nodo Master

Es fundamental una versión de Docker que sea compatible con la versión de Rancher que se vaya a instalar o en el caso de que se vaya a usar un nodo master ya existente, la versión Docker compatible con la versión de Rancher que haya en el nodo Master (Matriz de compatibilidad de Rancher)

          -CentOS: https://docs.docker.com/install/linux/docker-ce/centos/

          -Ubuntu: https://docs.docker.com/install/linux/docker-ce/ubuntu/

(No arranques Docker aún)

2.- Configurar Docker 

Antes de arrancar Docker es importante cambiar la ruta donde Docker almacena toda su información: imágenes, contenedores, etc. Si no se cambia usará el directorio por defecto /var/lib/docker. En las máquinas Azure que se suelen usar, ese directorio está en el disco efímero de 35Gb, por lo que se puede llenar en ejecución y hacer fallar la máquina. Es recomendable utilizar un disco con más espacio para evitar este problema, y en el peor de los casos, si se llena, que no haga fallar a la máquina completa. Para configurar esto, debes editar el fichero /lib/systemd/system/docker.service (sudo vi /lib/systemd/system/docker.service) y añadir la opción -g a la configuración ExecStart tal y como se muestra en el ejemplo siguiente:

ExecStart=/usr/bin/dockerd -g /datadrive/docker

Finalmente, estando parado el servicio de Docker, en el caso de que haya ficheros o directorios en /var/lib/docker, debes moverlos al nuevo directorio.

Añade tu repositorio como insecure-registry en el demonio de Dockerd

sudo vi /etc/docker/daemon.json y añadir:

{
"insecure-registries" : [ "registry.onesaitplatform.com" ]
}


3.- Arrancar Docker CE 

Arráncalo con >sudo systemctl start docker

y comprueba que ha arrancado bien ejecutando la imagen hello-world:

>sudo docker run hello-world

Configura también que el Docker se arranque en el boot de la VM:

>sudo systemctl enable docker.service

4.- Instalar Docker Compose

Como Rancher se despliega con Docker Compose, debes instalar una version de docker-compose compatible con Docker, Rancher y las versiones de los yml de los módulos en el nodo "master".

Para esto, descarga la última versión de Docker Compose (Puedes verlo aquí: https://github.com/docker/compose/releases)

>curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

y da permisos

>chmod +x /usr/local/bin/docker-compose

Y finalmente comprueba la versión con

>docker-compose -v

(Pasos en https://docs.docker.com/compose/install/#install-compose)

5. - Instalar y ejecutar el Servicio de Rancher

Ve al directorio del usuario (en este caso /home/administrador/)

Ejectua el siguiente comando:

>sudo mkdir -p /datadrive/onesaitplatform/rancher

Crea un fichero .env con este contenido en el directorio previamente creado:


HOST_VOLUME_PERSIST=/datadrive/onesaitplatform/rancher

y crea un fichero docker-compose.yml (para ejecutar Rancher sobre Docker Compose) como el siguiente, también en el mismo directorio:

version: "2.1" 
services:
 rancherinstance:
  image: rancher/server:latest
  container_name: rancherserver
  ports:
  - "8080:8080"
  volumes:
  - ${HOST_VOLUME_PERSIST}:/var/lib/mysql:rw
  privileged: true
  networks:
  - datanetwork
networks:
 datanetwork:
  ipam:
   driver: default
   config:
   - subnet: 172.28.0.0/16

Es importante tener abiertos los puertos 500 y 4500 UDP para que Rancher funcione correctamente, y revisar también que el firewall no esta capando esos puertos.

Una vez hayas creado el fichero docker-compose.yml, ve al directorio generado por los scripts y ejecuta:

>sudo docker-compose up -d

Una vez termine de arrancar, tendrás la consola de Rancher accesible en http://<IP_pública_vm>:8080

(NOTA: Ten en cuenta que es necesario tener abierto el puerto TCP 8080).


6.- Crear entorno en Rancher

Una vez instalado Rancher en el nodo Master, tienes que crear un Environment desde la consola de Rancher para poder desplegar la plataforma en el nodo Worker. Para eso, desde Manage Environments --> Add Environment crea un entorno (nombre y descripción)

Selecciona Cattle como template.


y selecciona


Tras esto, añade un nuevo host al Entorno, en el que luego desplegarás contenerizada la Open Platform.

7.- Instalar agente de Rancher en el nodo de la Open Platform

Dentro del entorno recién creado:


selecciona la opción Infraestructure --> Hosts --> Add Host

Te preguntará si deseas usar esta URL de registro. Valida si es correcto y sigue:


Deja el valor Custom 


En la sección de Labels, asígnale la etiqueta "NODE" y un nombre, normalmente es "Worker-N"


donde N es un identificador numérico y secuencial del worker de Rancher dentro del cluster.

Además, dale la ip privada de la máquina que quiera añadirse al cluster, en este caso:


Una vez que has rellenado estos dos campos, selecciona el comando Docker que tienes que copiar y lanzar en la VM que estés añadiendo al cluster de Rancher.


Empieza por instalar Docker en el nodo Worker, siguiendo los mismos pasos que antes.

          -CentOS: https://docs.docker.com/install/linux/docker-ce/centos/

          -Ubuntu: https://docs.docker.com/install/linux/docker-ce/ubuntu/

y recordando las configuraciones:

Vas a cambiar la ruta donde Docker almacena toda su información:

>sudo vi /lib/systemd/system/docker.service 

y añadir la opción -g /datadrive/docker a la configuración ExecStart tal y como se muestra en el ejemplo siguiente:

ExecStart=/usr/bin/dockerd -g /datadrive/docker

>sudo vi /etc/docker/daemon.json

 y añadir:

{
"insecure-registries" : [ "registry.onesaitplatform.com" ]
}

Arrancamos Docker: 

>sudo systemctl start docker

Copiamos el texto que nos indicaba la consola de Rancher y lo pegamos y ejecutamos en el shell del nodo Worker:


Al ejecutar este comando, Docker descargará las imágenes necesarias para activar el agente de Rancher. Tardará unos minutos.

Una vez descargados, en la infraestructura del entorno de Rancher (Infraestructure --> Hosts) podrás ir viendo como los servicios del agente Cattle se van arrancando (scheduler, healthcheck, ip-sec, etc...):


Una vez completados estos pasos ya tienes Rancher desplegado y un nodo instalado como Worker en Rancher para instalar la plataforma. 

¿Cómo desplegar la onesait Cloud Platform gestionada por Rancher?

1.- Generar los ficheros de despliegue en Rancher

Dentro del proyecto Git, en la ruta (https://github.com/onesaitplatform/onesaitplatform-cloud/tree/1.1.0-ce/devops/build-deploy/rancher/onesaitplatform), se encuentran los scripts y templates necesarios para generar los ficheros que cargarás en Rancher para hacer un despliegue de la Open Platform.

El fichero config.properties, dentro del directorio onesaitplatform-cloud/devops/build-deploy/rancher/onesaitplatform/scripts, tiene valores parametrizables dependiendo de la instalación:

  • PROJECT_NAME → nombre del proyecto.
  • WORKER2DEPLOY → es el nodo o host en el cual vas a desplegar la Onesait-Platform. Debes proporcionar la etiqueta de Rancher que lo identifica con NODE
  • DOMAIN_NAME → es el dns a través del cual vas a acceder a esta instancia de la OnesaitPlatform.
  • IMAGE_TAG → etiqueta que identifica la versión de las imágenes Docker que se vayan a desplegar.

En nuestro caso, al ser la ip de nuestro worker 139.59.133.169, tendremos:


2. Lanzar los ficheros de despliegue en el nodo Worker

Una vez editado el fichero de configuración anterior, sube el directorio completo a la VM que hace de Worker. En este caso, crea una carpeta deploy en el home del usuario y sube el directorio completo:


Da permiso de ejecución al fichero y lanza el script generate-templates.sh:


Este script genera en la carpeta donde te encuentras un directorio con el nombre del proyecto (onesaitplatform_cloudlabs-Worker1) con los ficheros de Rancher generados a partir de las plantillas del directorio /templates: docker-compose-ce.template y rancher-compose.yml.


Dentro de este directorio habrá dos ficheros con extensión .yml:

  • docker-compose.yml → Fichero compatible con Docker Compose. Define servicios, imágenes, etiquetas, redes, volúmenes, etc...

  • rancher-compose.yml → Configuración específica de Rancher (número de réplicas de cada servicio, orden de arranque, etc...)

NOTA: Estos dos ficheros pueden modificarse a mano en caso de ser necesario.

3.- Crear los directorios de los volúmenes persistentes 

Antes de lanzar el despliegue en el nodo Worker será necesario realizar la creación de directorios en el (los) host anfitrión (tu Worker) en el que se vaya a realizar el despliegue.

Estos directorios son los que van a necesitar los distintos contenedores para volcar datos en sus volúmenes y puedes verlos en el fichero docker-compose.yml generado:



Para crear los directorios de los volúmenes ejecutaremos el script create-directories.sh, que se encuentra en el directorio de scripts que hemos subido.

En el ejemplo, estarán ubicados en un disco externo del host anfitrión ubicado en /datadrive, y se habrá creado los siguientes directorios:

  • /datadrive/onesaitplatform/platform-logs → directorio de logs de cada contenedor

  • /datadrive/onesaitplatform/nginx/ → directorio para almacenar configuración nginx
  • /datadrive/onesaitplatform/nginx/certs → directorio para almacenar certificados autofirmados, típicamente "/etc/nginx/ssl" en el contenedor nginx.
  • /datadrive/onesaitplatform/configdb → directorio de datos de la ConfigDB
  • /datadrive/onesaitplatform/realtimedb → directorio de datos de la RealTimeDB sobre Mongo

  • /datadrive/onesaitplatform/schedulerdb → directorio de datos de la base de datos para planificaciones

  • /datadrive/onesaitplatform/flowengine → directorio donde se almacenan los flujos del FlowEngine (Node RED)

  • /datadrive/onesaitplatform/webprojects → directorio que contiene los proyectos web

  •  /datadrive/onesaitplatform/export → directorio para RTDBMaintainer
  • /datadrive/onesaitplatform/binaryrepository → directorio para almacenar los ficheros binarios
  • /datadrive/onesaitplatform/zeppelin/notebook→ directorio para almacenar Notebooks
  • /datadrive/onesaitplatform/zeppelin/conf → directorio para configuración de Notebooks
  • /datadrive/onesaitplatform/kafka-logs → directorio persistencia Kafka
  • /datadrive/onesaitplatform/streamsets/data→ directorio para los datos del DataFlow

4.- Generar certificados autofirmados.

Para generar los certificados autofirmados, ve al directorio /datadrive/onesaitplatform/nginx/certs y ejecuta:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
[Rellenamos los campos que nos indica]
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
[Rellenamos los campos que nos indica]
openssl rsa -in server-key.pem -out server.key
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out platform.cer

Al ejecutarlo, te irá pidiendo una serie de parámetros tales como ciudad, país, empresa, grupo de trabajo, etc. Introduce todos los parámetros que nos pide, prestando especial atención a "common name". Aquí debes introducir el DNS o la IP por la que vayas a acceder a la plataforma. Validaremos que el certificado está bien generado validándolo contra la ca que hemos creado ejecutando:

>openssl verify -CAfile ca.pem platform.cer

5.- Crear archivo de configuración para el proxy nginx

Para poder exponer la plataforma a Internet, necesitas un balanceador de carga que lo haga. Para este fin, utilizaremos un nginx a modo de proxy inverso. Copiaremos el archivo de configuración de <directorio_subida>/deploy/op_config/nginx.conf en el directorio /datadrive/onesaitplatform/nginx/. Le daremos permisos 777. También copiaremos los ficheros de configuración del resto de módulos <directorio_subida>/deploy/op_config/conf.d al directorio datadrive/onesaitplatform/nginx/conf.d

En caso de querer añadir nuevas redirecciones, debemos incluir el fichero de configuración del nuevo servicio en el directorio /datadrive/onesaitplatform/nginx/conf.d. Este directorio se mapea al directorio /usr/local/conf.d del contenedor. Para terminar debemos especificar a nginx que cargue dicho fichero con la orden include

La configuración que le pasamos sería de este estilo:

Debes prestar especial atención al parámetro "server_name" donde debes de escribir la DNS de tu máquina, lab.onesaitplatform.com en la configuración mostrada. El contenedor no conseguirá arrancar si en el nginx.conf hacemos referencia a servicios que no se vayan a desplegar.


6.- Crear un stack en Rancher

Tras estos pasos volveré a la consola de Rancher (en este caso en http://10.3.1.4:8080/)

Dentro del entorno creado anteriormente, debes dar de alta un "Stack".


Dale un nombre que represente esa instalación (grupo de contenedores), en este caso OpenPlatform-CloudLabs


Subiremos los compose generados con el script, en el directorio <subida>/scripts/<project_name>-<worker_tag>/

lo más sencillo es copiar esos dos ficheros a tu equipo local y adjuntarlos desde ahí.

Además en "Advanced Options", indica algún tag de utilidad para tu despliegue (como "CloudLabs") y deshabilita el check "start services after creating"


Este check debe quedar deshabilitado puesto que te interesa seguir un orden de arranque manual.

Finalmente tendrás:


Ya puedes dar 

Comenzará la creación del Entorno:

Finalmente se habrán asignado los contenedores:


7.- Arrancar los contenedores de la Plataforma

Tu stack contiene los contenedores de la plataforma.

Los contenedores se deben lanzar en un orden concreto para que la plataforma funcione de forma estable.

  1. Primero lanza el servicio configdb que lanza la Base de Datos de Configuración. Lánzalo con el 


  2. Una vez activa la configdb, lanza realtimedb que lanza la Base de Datos RealTimeDB sobre MongoDB.


  3. Una vez en ejecución lanza quasar, que es el motor de consultas en SQL sobre la RealTimeDB.


  4. Lanza schedulerdb que es la bbdd que almacena las planificaciones Quartz


  5. Tras esto lanza un contenedor especial (contenedor efímero), el configInit que se encargará de poblar las ConfigDB y las RealTimeDBs. Este contenedor se ejecuta, carga los datos y se destruye. En primer lugar deberemos ejecutar el servicio con la variable LOADMONGODB a false
    El servicio se detendrá una vez termine, y no se volverá a ejecutar debido al tag "start_once". A través del menú derecho (View logs) podemos comprobar que no ha habido errores

     

    1. A continuación volveremos a ejecutar el servicio hacinedo un Upgrade primero y poniendo la variable LOADMONGODB a true, para poblar la bbdd de mongo
    2.   

    Una vez termine, se parará y ya tendremos las bbdd listas para desplegar los módulos de plataforma.


  6. El siguiente servicio a arrancar es el controlpanelservice que se corresponde con la Consola de Desarrollo de la Plataforma, 

    Este contenedor tarda unos minutos en arrancar. Puedes ver sus logs desde el directorio de la máquina anfitriona o través del directorio mapeado en el contenedor
                                                                    En caso de arrancar sin errores, deberás ver la siguiente traza                                         
    El contenedor se ejecuta en el puerto 18000. Si estás dentro de una VPN, podrás acceder por su IP interna:

    http://10.3.1.6:18000/controlpanel/login
    si estás en Internet y están los puertos abiertos por su IP externa.
    En cualquier caso lo que te interesa es mapear este puerto y path (18000:/controlpanel) con una URL tipo https://<dominio>/controlpanel. Y para eso tienes que arrancar y configurar el servicio loadbalancerservice (una instancia de NGINX). Esto lo harás al final para que el NGNIX balancee todos los servicios HTTP.

  7. Arranca el servicio loadbalancerservice. Una vez arrancado, ve al servicio y comprueba en los logs que no ha habido ningún error de configuración. Si todo ha ido correctamente, deberías ver un plot de tu nginx.conf seguido de "Starting nginx" y una serie de líneas que dice las llamadas que estan pasando a través de él.


Ahora sí, ya puedes acceder a nuestra instancia de la onesait Cloud Platform en https://<server_name>/controlpanel

  • username/password: administrator/Community2019!


10. Normalmente, te interesará desplegar todos los módulos de la plataforma. Para ello, primero habrá que arrancar los servicios que queramos utilizar. A continuación habrá que descomentar las redirecciones (include /usr/local/conf.d/<modulo>.conf) de aquellos módulos que queramos activar en nginx.conf .

  • Paramos el servicio loadbalancer

  • Arrancamos el módulo de dashboards, que es el servicio que queremos activar. Puesto que este servicio depende del router, deberemos activar también dicho servicio, que a su vez depende del cacheserver


  • Modificamos el fichero nginx.conf del directorio anfitrión /datadrive/onesaitplatform/nginx/nginx.conf y descomentamos el include del servicio de dashboards y del router

  • Los ficheros deben estar en /datadrive/onesaitplatform/nginx/conf.d 
    • Si no están, copiarlos del directorio descargado op_config/conf.d
      • >cp /root/deploy/op_config/conf.d/* /datadrive/onesaitplatform/nginx/conf.d

11. Arrancamos el loadbalancer


12. Verificamos que podemos acceder al nuevo módulo desplegado

  • Desde el menú principal (Visualization/Dashboards Management)

  • Accedemos a VisualizeOpenFlightsData


13. Aún queda terminar la configuración de Rancher, por ejemplo asignando usuarios y permisos al gestor Rancher. Para eso, haz clic sobre Admin>Accounts. En esta dirección verás una lista con todos los usuarios que hay dados de alta en Rancher.

Haciendo clic en el botón "Add Account", aparecerá una ventana en la que podrás dar de alta otro usuario. Sólo tienes que rellenar un pequeño formulario. Te dejará elegir el rol que quieres asociar al usuario que has creado. Si lo asocias con rol administrador, tu nuevo usuario podrá ver todos los environments que tengas desplegados en Rancher. Por el contrario, si le das el rol user, solo podrá ver los environments a los que el usuario administrador le de permisos. Para asociar usuarios y environments basta con hacer clic en "Manage Environments" (siendo el usuario administrador). Aquí ves una lista de los environments desplegados en tu Rancher.

Haciendo clic en los 3 puntos verticales del environment al que quieras asociar tu usuario, aparecerá el siguiente cuadro:

Simplemente tienes que añadir a la lista "Access Control" el nombre del usuario que queramos asociar, clic en save. La siguiente vez que se logue el usuario en cuestión, ya tendrá acceso a los environments que le hayamos asociado.

Gestión y Monitorización de la plataforma a través de Rancher

Una vez tengas desplegados los contenedores en Rancher, deberías de ver algo similar a esto:


En esta vista puedes ver el estado de los servicios. Haciendo clic en el desplegable aparecen una serie de opciones:

  • Upgrade: permite modificar las opciones de lanzamiento del servicio, tales como volúmenes, variables de entorno, etc. Al realizar un upgrade, Rancher te mantendrá el servicio anterior activo, dándote la opción de hacer Rollback.
  • Restart: reinicia el servicio.
  • Stop: detiene el servicio.
  • Delete: elimina el servicio.
  • View in API: te lleva a una página en la que nos da la configuración de ese servicio en formato JSON y te muestra los endpoints a los que atacar para la gestión de los servicios vía API REST.
  • Clone: clona un servicio.
  • Edit: permite modificar la escabilidad, nombre, y links con otros servicios sin necesidad de hacer un upgrade.

Haciendo clic sobre un servicio, entras dentro de la configuración de dicho servicio. Esta pantalla nos ofrece la siguiente información y utilidades:

  • Scale: te informa sobre el número de contenedores que se van a desplegar asociados al servicio. También puedes modificar su valor.
  • Image: te dice la url de la que hemos descargado la imagen.

En la pestaña Containers, aparecerá una lista de los contenedores asociados al servicio en cuestión. Cada columna te da la siguiente información:

  • State: te dice el estado del contenedor, que puede ser: Running, Restarting, Upgrading, Upgraded, Stopping y Failed.
  • Name: nombre que asocia Rancher al contenedor en cuestión.
  • IP Address: IP que le da Rancher al contenedor.
  • Host: máquina en que está desplegado el contenedor.
  • Image: repositorio del que Rancher ha descargado la imagen.
  • Stats: monitorización de los recursos que está consumiendo el contenedor.


En el desplegable de cada contenedor tienes varias opciones:

  • Restart: reinicia el contenedor.
  • Stop: detiene el contenedor (A no ser que se configure lo contrario, Rancher por defecto volverá al lanzar el contender detenido si el servicio asociado sigue activo).
  • Delete: elimina el contenedor (Dependiendo del valor que tenga "Scale", Rancher nos volverá crear un contenedor en función de la escalabilidad asociado al servicio).
  • Execute Shell: abre una ventana en la que podemos acceder a la consola del contenedor seleccionado.
  • View Logs: muestra una ventana con los logs que envía el contenedor.
  • View in API: esquema JSON con la configuración del contenedor y una serie de endpoints interactuar vía API REST con el contenedor.
  • Edit: permite modificar el nombre del contenedor y los servicios a los que está ligado.

Es recomendable que cada vez que se inicie un servicio, entrar en el/los contenedor/es y ver en los logs que el despliegue se ha efectuado correctamente. Cuando todos los servicios estén desplegados y en estado Active, la plataforma estará desplegada.