Posted on Leave a comment

Por qué no utilizamos Docker en BCubium full node

Docker es una tecnología de virtualización que permite el empaquetado de una aplicación junto con todas sus dependencias y librerías en un contenedor. Este contenedor de software resultante puede ejecutarse en otras máquinas distintas a donde se creó con la única premisa que tengan el sistema de contenerización de Docker.

La tecnología de contenerización es más eficiente que la de virtualización del sistema operativo completo porque no necesita replicar todo el sistema sino únicamente lo necesario para la ejecución del contenedor. Docker utiliza la tecnología cgroups de Linux para gestionar los recursos de los contenedores y conseguir el aislamiento entre ellos.

Las principales ventajas que nos ofrece la contenerización son las siguientes:

Aporta consistencia, al contener tanto el código de la aplicación como las librerías que utiliza, ya sean propias o de terceros, más el entorno completo de ejecución por ejemplo en una aplicación Java tendríamos el código desarrollado, más todas las librerías que utiliza, más el servidor de aplicaciones completo. Muchos menos puntos de fallo a la hora de ejecutar la aplicación.

Conseguimos estandarización y productividad, al utilizar la misma imagen para todos los entornos, desarrollo, integración, calidad, preproducción, producción o los que haya nos es más sencillo gestionarla, etiquetarla, hacer backups, rollbacks… 

Ayuda en la Integración continua y la aplicación de la filosofía DevOps porque facilita la ejecución automatizada de pruebas sobre el software y la promoción entre los distintos entornos existentes.

Mejora la seguridad al tener contenedores independientes y aislados ya que si un intruso compromete la aplicación que se ejecuta dentro de un contenedor su ámbito de acción se limita a ese contenedor y no a todo el sistema.

Es multi cloud, ya que en todos los clouds públicos y privados tienen entornos que permiten la ejecución de contenedores Docker.

Por contra a medida que el número de contenedores crece se empieza a necesitar un sistema que gestione y automatice las operación con estos y por ello aparecieron plataformas como Kubernetes, Rancher, Openshift…

Con los contenedores más la plataforma para su gestión se consigue la mayor ventaja que nos aporta este sistema tecnológico que es el autoescalado dinámico en función de la carga, muy útil para websites grandes con muchísimas visitas y con una carga irregular. Lo explico con un ejemplo, si tenemos una aplicación web de una empresa donde el número de visitas sea distinto en función de la hora del día, del día del mes o del mes del año, que es lo normal, con la tecnología de contenerización podemos configurar que cuando la carga del sistema crezca y supere un determinado umbral se instancien nuevos contenedores para absorber ese aumento de la demanda y cuando esa carga decrezca se eliminen los contenedores creados consiguiendo con ello utilizar sólo los recursos necesarios en cada momento y así reducir el coste del aprovisionamiento de hardware.

Hasta ahora todo muy bonito pero… ¿qué tenemos en la mayor parte de los Bitcoin full nodes?

Un hardware básico para ejecutar un full node junto con otras aplicaciones para ampliar funcionalidad y facilitar la gestión, normalmente son placas básicas con un procesador con pocos recursos, con poca CPU y con poca RAM. En el caso de BCubium todavía más porque nuestro hardware es muy limitado porque queremos tener un nodo pequeño y en él estamos ejecutando bitcoin-core, LND, BTC-RPC-Explorer, RTL, la web de administración del nodo y alguna herramienta más, y no vemos ninguna ganancia por ejecutarlo con Docker por:

Las aplicaciones que se ejecutan han sido desarrolladas por terceros, ya nos las dan totalmente funcionales, se instalan sin problemas sin necesidad de contenerizarlas.

Cuando se instalan ya auto incorporan todas las librerías que necesitan y las que necesitan del sistema operativo Linux con su sistema de paquetes permite que se autoinstalen.

No vamos a hacer modificaciones sobre estas aplicaciones es decir no van a tener un desarrollo hecho por nosotros por lo que no tengo que ejecutar ningún sistema de integración continua, ni baterías de pruebas, ni promoción entre entornos.

El hecho de ejecutarlas contenerizadas supone un consumo extra de recursos ya que cada contenedor viene con su propio sistema operativo más las herramientas que necesita la gestión de los contenedores, más las librerías necesarias para su ejecución, lo provoca que tenga librerías y herramientas duplicadas en los distintos contenedores y al final nos obliga a tener un sistema con un hardware más potente cuando lo que queremos es justo lo contrario, un sistema mínimo.

Por nuestra parte desde BGeometrics realizamos un desarrollo que es la web de administración del nodo que es un website pequeño por lo que no hay una gran ganancia por desarrollarlo utilizando contenedores y también tenemos un conjunto de scripts que utilizan muchas aplicaciones y utilidades del sistema operativo y que no interesa que se ejecuten en un contenedor aislado porque supondría tener que instalar todas estas herramientas en los contenedores y algunas de ellas necesitan tener acceso al sistema operativo huésped.

La ejecución de Docker complica la gestión ya que tenemos ahora además de tener que realizar la operación del software instalado hay que vigilar la ejecución de cada contenedor y las comunicaciones entre ellos que entre otras cosas significa que tenemos que tener otro interfaz de red en el sistema. 

En nuestro caso nuestro sistema se ejecuta en una placa base y en un procesador y no tenemos ningún interés en ejecutarlo en una cloud pública por lo cual perdemos la facilidad que nos aportan los contenedores de migrado al cloud.

No tiene sentido el autoescalado dinámico que es la gran ventaja de la contenerización ya que no vas a instalar un sistema como Kubernetes cuando tenemos unos pocos contenedores, la carga es muy baja y constante y el acceso a las aplicaciones como BTC-RPC-Explorer o RTL se realiza muy de vez en cuando y por una una única persona…

Resumiendo Docker es una gran tecnología que ya está aquí y va a continuar con nosotros durante un buen tiempo, si a eso le sumamos los orquestadores como Kubernetes y sobre estos Rancher, Openshift… tenemos el kit completo para conseguir un dimensionamiento a medida, pero en un caso como el nuestro donde lo que queremos es ejecutar un software en un hardware mínimo no necesitamos esas ventajas y nos evitamos añadir complejidad al sistema y tener un mayor consumo de recursos.

La versión del artículo en inglés Why don’t we use Docker in BCubium full node

Leave a Reply