Nomad como solución de orquestación

Nomad como solución de orquestación

Alexandre Sa. Cuando se piensa en crear un entorno escalable, Kubernetes es la primera herramienta que nos viene a la mente. Sin embargo, existen otras soluciones interesantes que sirven para este propósito. En este documento presentamos una herramienta muy robusta y menos compleja: Nomad.

Nomad es una solución de orquestación de aplicaciones y contenedores desarrollada por HashiCorp. Está diseñado para ser flexible y fácil de usar, permitiendo a los usuarios implementar y administrar aplicaciones en entornos heterogéneos. Nomad le permite ejecutar aplicaciones en múltiples tipos de infraestructura, incluidos servidores físicos, máquinas virtuales y contenedores. También ofrece funciones avanzadas de escalabilidad y conmutación por error, lo que lo convierte en una excelente opción para entornos de producción.

Una de las principales ventajas de Nomad es su capacidad para empaquetar y distribuir aplicaciones en varios formatos, incluidos contenedores Docker, archivos ejecutables y scripts. Esto permite a los usuarios implementar aplicaciones en cualquier entorno, independientemente del formato en el que se creen. Además, Nomad ofrece capacidades de programación avanzadas, lo que permite a los usuarios definir políticas de asignación de recursos y tolerancia a fallas. Esto permite a los usuarios crear aplicaciones altamente resistentes y escalables.

Por lo tanto, si buscas una solución de orquestación de aplicaciones potente y fácil de usar, Nomad es la opción correcta. Con funciones avanzadas de escalabilidad y conmutación por error, compatibilidad con múltiples formatos de aplicaciones y una comunidad activa, Nomad ofrece todo lo que necesitas para administrar aplicaciones en cualquier entorno.

Conceptos de Nomad

Antes de comenzar, debemos presentar algunos conceptos importantes para comprender el núcleo de la solución.

Job

Job Es una carga de trabajo que necesita ser ejecutada, compuesta por grupos de tareas. Nomad garantiza que el estado real coincida con el estado deseado mediante asignaciones y evaluaciones, utilizando controladores flexibles y programación de grupos de tareas.

Task Group

Un grupo de tareas es un conjunto de tareas que deben ejecutarse juntas, como un servidor web que requiere un proceso de envío de registros en ejecución constante. El grupo de tareas es la unidad de programación y debe ejecutarse en un único nodo cliente, sin posibilidad de división en partes más pequeñas.

Driver

Un conductor representa el medio básico para realizar sus tareas. Algunos ejemplos de controladores incluyen Docker, QEMU, Java y binarios estáticos.


Task

Una Task es la unidad de trabajo más pequeña de Nomad, realizada por controladores que permiten a Nomad soportar múltiples tipos de tareas. Las tareas especifican el controlador, la configuración, las restricciones y los recursos necesarios.

Client

Un cliente Nomad es un agente responsable de ejecutar y gestionar tareas utilizando los recursos computacionales disponibles en una máquina. El agente se registra en servidores, monitorea los trabajos asignados y realiza tareas. El agente Nomad es un proceso de larga duración que se comunica con los servidores.

Allocation

Una Allocation es un mapeo entre un grupo de tareas en una tarea y un nodo cliente. Un solo trabajo puede tener cientos o miles de grupos de tareas, lo que significa que debe existir una cantidad equivalente de asignaciones para asignar el trabajo a las máquinas cliente. Las asignaciones las crean los servidores de Nomad como parte de las decisiones de programación tomadas durante una evaluación.

Evaluación

Las evaluaciones son el mecanismo mediante el cual Nomad toma decisiones de programación. Cuando cambia el estado deseado (trabajos) o el estado real (clientes), Nomad crea una nueva evaluación para determinar si se debe tomar alguna medida. Una evaluación puede dar lugar a cambios en las asignaciones si es necesario.

Implantación

Las implementaciones en Nomad cambian el estado del clúster paso a paso y solo están disponibles para trabajos de servicio. Durante una evaluación, el programador crea solo la cantidad de asignaciones permitidas por el bloque de actualización y el estado actual del clúster. Las implementaciones monitorean el estado de estas asignaciones y emiten una nueva evaluación para la siguiente etapa de la actualización.

Server

Los servidores nómadas son el cerebro del clúster. Hay un grupo de servidores por región y administran todos los trabajos y clientes, ejecutan evaluaciones y crean asignaciones de tareas. Los servidores replican datos entre ellos y eligen al líder para garantizar una alta disponibilidad. Puede encontrar más información sobre los requisitos de latencia para servidores en Topología de red.

Regions

Nomad modela la infraestructura como regiones y centros de datos. Una región contendrá uno o más centros de datos. Un conjunto de servidores unidos representará una única región. Los servidores están federados en todas las regiones para que Nomad sea globalmente consciente.

Datacenters

Nomad modela un centro de datos como una agrupación abstracta de clientes en una región. Los clientes nómadas no necesitan estar en el mismo centro de datos que los servidores a los que están conectados, pero sí deben estar en la misma región. Los centros de datos brindan una forma de expresar la tolerancia a fallas entre trabajos, así como el aislamiento de la infraestructura.

Bin Packing

Bin Packing es el proceso de llenar cajas con artículos para maximizar el uso de las cajas. Esto se extiende a Nomad, donde los clientes son "contenedores" y los elementos son grupos de tareas. Nomad optimiza los recursos al empaquetar tareas de manera eficiente en las máquinas cliente.

Ahora que entendemos los conceptos fundamentales, estamos listos para configurar nuestro entorno.

En este artículo adoptaremos una distribución Centos Linux en su versión 9, actualizada y con Docker instalado. Si no tiene Docker instalado, le recomiendo ejecutar el siguiente comando, esto le permitirá ejecutar nomad con el controlador Docker.

$ curl -fsSL https://get.docker.com -o get-docker.sh

$ sudo sh get-docker.sh

$ systemctl enable docker

$ systemctl start docker

Para otras distribuciones o sistemas operativos Windows o MacOS, el proceso de instalación es muy sencillo y bien explicado en la página oficial de la herramienta, disponible en https://developer.hashicorp.com/nomad/downloads.

Pasos para instalar en nuestro ambiente

Instalación de las dependencias del proyecto

$ sudo yum install -y yum-utils

Habilitar el repositorio oficial

$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

Ahora que el Sistema Operativo puede reconocer el repositorio de Hashicorp, podemos proceder con la instalación con el comando:

$ sudo yum -y install nomad

Siguiendo este proceso, el binario de Nomad se instalará en la carpeta /usr/bin/nomad, haciendo que el comando nomad sea accesible desde cualquier parte del sistema operativo.

Ahora que hemos configurado todo el entorno, necesitamos iniciar nuestro agente. Para que el servicio se ejecute correctamente, ejecute el siguiente comando.

$ sudo nomad agent -dev -bind 0.0.0.0 -log-level INFO

Estamos iniciando nomad en modo desarrollador, lo que nos permite verificar los registros de la aplicación directamente en la consola. Sin embargo, tenga cuidado ya que este modo no debe usarse en producción. Más adelante te mostraré cómo proceder correctamente en esta situación. Después de ejecutar el comando anterior, deberíamos esperar un resultado similar a este:


Una vez instalado, podremos acceder a nuestro entorno sólo de forma local, es decir, si accedemos a la dirección en el navegador http://localhost:4646 Tendremos acceso al servicio que acabamos de crear. Sin embargo, si queremos permitir que se pueda acceder al servicio a través de la IP de la máquina o mediante FQDN (Full Qualified Domain Name), debemos liberar los puertos en el firewall del sistema operativo.

$ firewall-cmd --permanent --zone=public --add-port=4646-4647/tcp

$ firewall-cmd --permanent --zone=public --add-port=4648/tcp

$ firewall-cmd --permanent --zone=public --add-port=4648/udp

$ firewall-cmd --reload

$ firewall-cmd --zone=public --list-all

Esta es la pantalla de inicio que verá cuando acceda por primera vez a la interfaz web.


Configurando el ambiente para producción

Después de configurar y probar el entorno, podemos crear un proceso de arranque automático con el sistema operativo.

$ sudo nano /etc/systemd/system/nomad-client.service

Necesitamos colocar el texto a continuación para informar los parámetros que utilizará el servicio.

[Unit]

Description=Nomad

Documentation=https://nomadproject.io/docs/

Wants=network-online.target

After=network-online.target

[Service]

ExecReload=/bin/kill -HUP $MAINPID

ExecStart=/usr/bin/nomad agent -config /etc/nomad.d

KillMode=process

KillSignal=SIGINT

LimitNOFILE=65536

LimitNPROC=infinity

Restart=on-failure

RestartSec=2

TasksMax=infinity

OOMScoreAdjust=-1000

[Install]

WantedBy=multi-user.target

Para dar início ao serviço, precisamos executar os comandos abaixo:

$ systemctl enable nomad  #Inicia o nomad junto com o sistema operacional.

$ systemctl start nomad #Inicia o serviço.

$ systemctl status nomad #Verificar se o serviço está configurado corretamente.

Se tudo ocorreu bem, o resultado esperado ao executarmos o comando no servidor do nomad($ systemctl status nomad) é ter o status de Active (running), conforme mostrado na imagem abaixo.


HCL: el lenguaje de Hashicorp

HCL es un lenguaje de codificación desarrollado por Hashicorp, una empresa de software de infraestructura, que está diseñado para proporcionar una sintaxis simple y clara para definir recursos de infraestructura en servicios en la nube y otras plataformas.

HCL permite a los usuarios definir recursos utilizando bloques de código, donde cada bloque representa un recurso específico, como una instancia de servidor o una red virtual. Además, HCL proporciona una variedad de funciones avanzadas, como la capacidad de utilizar variables y funciones, para hacer que la codificación sea más eficiente y flexible. Con su sintaxis intuitiva y funciones avanzadas, HCL es una opción popular entre los desarrolladores e ingenieros de infraestructura que trabajan con servicios en la nube y otras plataformas modernas.

Ahora que conocemos las características principales de Nomad y el lenguaje HCL, comprendamos un poco más sobre el archivo de configuración base de Nomad. Para acceder a él basta con abrir el archivo ubicado en /etc/nomad.d/nomad.hcl y deberíamos tener una configuración similar a esta:

```bash

Full configuration options can be found at [https://www.nomadproject.io/docs/configuration](https://www.nomadproject.io/docs/configuration)

data_dir  = "/opt/nomad/data" # Pasta onde se encontra o arquivo de configuração do Nomad

bind_addr = "0.0.0.0" # Informa que a solução pode ser visível na sua rede.

server { # Se quisermos que essa solução funcione como servidor, devemos preencher as informações abaixo.

license_path is required for Nomad Enterprise as of Nomad v1.1.1+

#license_path = "/etc/nomad.d/license.hclic" # Utilizado se adquirida a versão corporativa

enabled          = true # Informa se o servidor deve estar ativo

bootstrap_expect = 1 # Quantas máquinas são esperadas para que o serviço funcione

}

client {# Se quisermos que essa solução funcione como cliente, devemos preencher as informações abaixo.

enabled = true # Dizemos que queremos que esse servidor se comporte como Cliente da solução.

servers = ["10.0.254.254"] # IP dos servidores que serão cadastrados como Cliente.

}

```

Deploy de una aplicación

Para ejecutar un trabajo existen 2 formas, la primera es a través de la interfaz web, accediendo a la pestaña Trabajos y pulsando el botón Run Job, como se muestra en la imagen de abajo.


Al insertar el siguiente código en la pantalla de ejecución del trabajo, especificaremos los siguientes parámetros:

```bash

job "revelo-http-echo" { # Nome do Job

datacenters = ["dc1"] # Nome do Datacenter

group "http-echo" { # Nome do Task Group

task "server" { # Definição da Task

driver = "docker" # Diz para usar o docker para provisionar o nosso serviço

config { # Aqui definimos os nossos parâmetros, assim como fazemos no docker

image = "hashicorp/http-echo:latest" # Imagem docker que será usada

args  = [ # Esses argumentos podem ser identificados para parâmetros que serão enviados para a variável de ambiente

"-listen", ":8067", # Diz para a aplicação ser executada na porta 8067

"-text", "Meu primeiro serviço no Nomad.", # Qual o texto que deve ser apresentado ao iniciar o serviço

]

}

resources { #Definimos os parâmetros do nosso ambiente

network { # Configuração das portas de rede(assim como no docker)

mode = "bridge" # Iremos usar o default, modo bridge

port "http" { # Criando um alias para o mapeamento de portas (host:container)

static = 8067 # Porta que será utillizada de forma públlica

to = 8067 # Porta do container que será exposta

}

}

}

}

}

}

```

Ahora, nuestra aplicación está lista y accesible para nuestros clientes, con los parámetros que configuramos en nuestro Job y deberías ver una pantalla similar a la que se muestra en la imagen a continuación.


La segunda forma de ejecutar la aplicación sería a través de la CLI (Command Line Interface). Para hacer esto, debe guardar el trabajo configurado en el servidor con la extensión .hcl y luego ejecutar el comando correspondiente.

`nomad run <nome-do-arquivo-que-voce-salvou>.hcl`


Esta fue sólo una breve introducción a la herramienta Nomad de Hashicorp. Espero que te haya gustado y nos vemos pronto.

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.