Configuraciones de Docker Swarm para el Visualizador de Incidentes Viales.
En este repositorio están los archivos de configuración para levantar la aplicación en un cluster de servidores utilizando Docker Swarm. La idea general es configurar un nodo con traefik para servir como balanceador de cargas (manager) y luego tantos nodos como se quiera para replicar la aplicación (workers).
Tenemos que tener un nodo (servidor) configurado con una versión reciente de Docker para servir como balanceador de cargas. Si vamos a correr también aquí procesos de la aplicación entonces tendría que tener unos 4 Gigas de RAM y dos núcleos por lo menos.
Para que el manager (nodo de traefik) se pueda comunicar con los demás necesita tener los siguientes puertos abiertos:
Protocolo | Puerto | Fuente |
---|---|---|
TCP | 2377 | managers y workers |
TCP | 7946 | managers y workers |
UDP | 7946 | managers y workers |
UDP | 4789 | managers y workers |
50 | Todos | managers y workers |
HTTP | 80 | Cualquiera |
HTTPS | 443 | Cualquiera |
Para cada nodo (worker) extra que queramos configurar, necesitamos los siguientes puertos:
Protocolo | Puerto | Fuente |
---|---|---|
TCP | 7946 | managers y workers |
UDP | 7946 | managers y workers |
UDP | 4789 | managers y workers |
50 | Todos | managers y workers |
# Configuración de Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
sudo usermod -aG docker ubuntu
docker swarm init
docker network create --driver=overlay traefik-public
Primero configuramos la red del nodo en donde va a correr traefik y le decimos que va a usar un certificado público (para https). Simplemente estamos guardando el id del nodo en una variable de entorno y actualizando el nodo con esa información para que traefik configure el certificado,
export NODE_ID=$(docker info -f '{{.Swarm.NodeID}}')
docker node update --label-add traefik-public.traefik-public-certificates=true $NODE_ID
Ahora configuramos el dominio para traefik (en este caso el dominio traefik.sys.app.example.com debe apuntar a la ip pública del nodo). También configuramos un usuario y contraseña (autenticación básica) para el Dashboard de traefik
export [email protected]
export DOMAIN=traefik.sys.app.example.com
# Para traefik
export USERNAME=admin
export HASHED_PASSWORD=$(openssl passwd -apr1)
Clonamos este repositorio y utilizamos la configuración que viene en el archivo yml para desplegar el servicio.
git clone https://github.com/CentroGeo/docker-swarm-visualizadorIncidentesViales.git
cd docker-swarm-visualizadorIncidentesViales
docker stack deploy -c traefik.yml traefik
Primero configuramos (en una variable de entorno que se va a usar adentro del yml que levanta el servicio) el dominio de la aplicación. Otra vez, app.example.com (la url que vayamos a usar) debe apuntar a la ip pública del nodo manager.
export APP_DOMAIN=app.example.com
Después configuramos la red interna que van a utilizar los nodos para comunicarse entre sí, sin importar si residen en diferentes computadoras físicas.
docker network create --driver=overlay sp-net
Finalmente, levantamos el servicio del visualizador
docker stack deploy -c standaloneapp.yml app
Si visitamos app.example.com (después de un par de minutos), debemos ver el visualizador
Primero tenemos que unir cada nuevo nodo al Swarm, para eso necesitamos el token del manager que podemos obtener haciendo:
docker swarm join-token worker
Esto nos regresa algo como:
SWMTKN-1-6crh4a0iu3vr64wmgymvi0zj1v219usp91cwcbtu00cor5avxx-9jmbyac8bvxd2h6crbvwsgm21 172.31.12.19:2377
Con lo que podemos ejecutar, en cada nodo que queramos agregar al swarm:
docker swarm join --token SWMTKN-1-6crh4a0iu3vr64wmgymvi0zj1v219usp91cwcbtu00cor5avxx-9jmbyac8bvxd2h6crbvwsgm21 172.31.12.19:2377
Para levantar N nuevos workers:
docker service update app_visualizador --replicas N
docker service update --force app_visualizador
La carga se debería balancear automáticamente entre todos los nodos!!!!
Para que el caché se pueda compartir entre todos los nodos (workers), es necesario que exista una carpeta compartida montada en /efs/cache
en cada nodo.