Docker Swarm constraints: dónde correr cada tarea

Clase 16 de 24Curso de Swarm

Resumen

Controla con precisión dónde corren tus servicios en Docker Swarm para proteger a los managers y mantener el clúster estable. Aquí verás cómo usar constraints, montar el docker socket y desplegar una interfaz web de visualización para entender, de un vistazo, la distribución de tareas. Todo con comandos claros y foco en disponibilidad.

¿Por qué decidir dónde corren las tareas en Docker Swarm?

En un entorno productivo, ubicar las tareas en los nodos correctos es crítico. Los managers realizan tareas administrativas invisibles que sostienen el swarm; si reciben cargas pesadas, pueden desestabilizarlo.

  • Evita ejecutar contenedores que consumen mucha RAM en managers.
  • Define explícitamente dónde corre cada tarea con constraints.
  • Usa una interfaz web para ver en qué nodo corre cada tarea.
  • Si una tarea necesita acceder al estado del swarm, debe correr en un manager.

¿Cómo desplegar Visualizer con constraint y bind mount?

La herramienta de visualización es una interfaz web que muestra el estado del swarm. Para funcionar, necesita: 1) correr en un manager y 2) comunicarse con el docker daemon a través del socket.

docker service create \
  -d \
  --name vis \
  -p 8080:8080 \
  --constraint 'node.role==manager' \
  --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
  dockersamples/visualizer
  • -d: modo detached.
  • --name vis: nombre del servicio.
  • -p 8080:8080: publica la interfaz web.
  • --constraint 'node.role==manager': garantiza acceso a la data del swarm.
  • --mount type=bind,...: monta el socket del docker daemon desde el host.

¿Cómo validar el estado del servicio?

  • Consulta el progreso y estados como preparing, starting y running.
docker service ps vis
  • Cuando esté en running, accede al puerto 8080: verás las tareas distribuidas de tu app y del propio Visualizer.

¿Cómo migrar servicios a workers con constraint y actualización?

Para que la aplicación corra solo en workers, agrega una restricción al servicio existente. Además, puedes ajustar la actualización para no ir uno por uno y acelerar el cambio de estado.

docker service update \
  --constraint-add 'node.role==worker' \
  app
  • --constraint-add: obliga a que las nuevas y actuales tareas cumplan la condición.
  • Ajusta el parámetro de update a 0 para sobreescribir el paralelismo por defecto si deseas acelerar la transición.

¿Qué efecto tiene en el replanificado?

  • Docker Swarm detecta tareas que ya no cumplen el constraint y las replanifica automáticamente a workers.
  • Visualizer muestra cómo se eliminan tareas de managers y se crean en workers.
  • Resultado: redistribuyes la carga desde managers a workers con un solo cambio declarativo.

¿Tienes una estrategia para distribuir cargas entre managers y workers? Comparte tus prácticas y dudas en los comentarios.