Swarm
Swarm es el conjunto de nodos que forman la orquestra. Como mínimo hay un nodo que hace de manager y worker, los demás nodos que se añadan serán workers a no ser que se añada mas de un manager pero se especificará uno como lider.
La gestión de las tareas y donde repartirlas, se encarga el manager, siempre se trabaja contra el manager.
Swarm trabaja con el puerto 2377
para su comunicación interna.
Stack: Es una app que corre dentro de swarm ( un docker-compose.yml forma una stack ), los contenedores que forman la app corren dentro de los nodos.
Service: ( routing mesh ) red de todos a todos es la manera que tiene swarm de gestionar los puertos y el repartidor de carga en un stack, una vez expuesto un puerto puedes consultar cualquier nodo que te contestaran por igual.
Comandos básicos
# swarm ------------------------------------------------
docker swarm init # iniciar swarm
# iniciar worker
docker swarm join --token SWMTKN-1-4qagsse8jlngffwmce3epujd7ws8supro93iik25cu634w9szv-a94ktkie6xekc9xp883sj0jbv 192.168.88.2:2377
docker node ls # ver nodos
docker swarm join-token manager # token para añadir managers
docker swarm join-token worker # token para añadir worker
# stack ----------------------------------------------------
docker stack deploy -c docker-compose.yml app # desplegar stack con nombre app
docker stack ps app # visualizar contenedores
docker stack ls # visualizar stack
docker stack services app # visualizar servicios de stack
docker service ps app_hello # visualizar contenedores de un servicio
docker service inspect app_hello # visualizar servicio detallado
docker service scale app_hello=4 # escalar numero de replicas
docker stack rm app # borrar stack
# nodos --------------------------------------------------
docker node ls
docker node inspect pc02 --pretty
docker node update --availability pause pc03
docker node update --availability drain pc03 # vaciar nodo
docker node update --availability active pc03
docker node update --label-add lloc=local pc03 # añadir label
docker node rm node-2
docker swarm leave # quitar worker
docker swarm leave --force # quitar manager
Iniciar swarm
Al iniciar el manager indica el token con el que agrupar los workers
➜ docker swarm init
Swarm initialized: current node (yuc0or5k3izprm0go81keye7u) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4qagsse8jlngffwmce3epujd7ws8supro93iik25cu634w9szv-a94ktkie6xekc9xp883sj0jbv 192.168.88.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
iniciar worker
[jorge@pc03 ~]$ docker swarm join --token SWMTKN-1-4qagsse8jlngffwmce3epujd7ws8supro93iik25cu634w9szv-a94ktkie6xekc9xp883sj0jbv 192.168.88.2:2377
This node joined a swarm as a worker.
nodos activos
➜ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
yuc0or5k3izprm0go81keye7u * pc02 Ready Active Leader 19.03.6
retgjptxz1di57xc85qym6atv pc03 Ready Active 19.03.7
➜ docker swarm join-token manager # token para añadir managers
➜ docker swarm join-token worker # token para añadir worker
Gestión stack
version: "3"
services:
hello:
image: edtasixm11/k19:hello
deploy:
replicas: 3
ports:
- "80:80"
networks:
- mynet
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
- mynet
networks:
mynet:
# desplegar stack con nombre app
➜ docker stack deploy -c docker-compose.yml app
# visualizar contenedores
➜ docker stack ps app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
oan9jbh0co9w app_portainer.1 portainer/portainer:latest pc02 Running Running 7 seconds ago
wp48mobq8uve app_hello.1 edtasixm11/k19:hello pc03 Running Preparing 43 seconds ago
ps1wx40lopar app_hello.2 edtasixm11/k19:hello pc02 Running Running 7 seconds ago
ltiaa8qrz1kp app_hello.3 edtasixm11/k19:hello pc03 Running Preparing 43 seconds ago
# visualizar stack
➜ docker stack ls
NAME SERVICES ORCHESTRATOR
app 3 Swarm
# visualizar servicios de stack
➜ docker stack services app
ID NAME MODE REPLICAS IMAGE PORTS
nxo472jynnbt app_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
y1feo3pbnb83 app_hello replicated 3/3 edtasixm11/k19:hello *:80->80/tcp
ybau52gmcszq app_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
# visualizar contenedores de un servicio
➜ docker service ps app_hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wp48mobq8uve app_hello.1 edtasixm11/k19:hello pc03 Running Running 8 minutes ago
ps1wx40lopar app_hello.2 edtasixm11/k19:hello pc02 Running Running 8 minutes ago
ltiaa8qrz1kp app_hello.3 edtasixm11/k19:hello pc03 Running Running 8 minutes ago
# visualizar servicio detallado
➜ docker service inspect app_hello
# escalar numero de replicas
➜ docker service scale app_hello=4
app_hello scaled to 4
overall progress: 4 out of 4 tasks
1/4: running [==================================================>]
2/4: running [==================================================>]
3/4: running [==================================================>]
4/4: running [==================================================>]
verify: Service converged
Gestión nodos
➜ docker node ls # listar nodos
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
yuc0or5k3izprm0go81keye7u * pc02 Ready Active Leader 19.03.6
retgjptxz1di57xc85qym6atv pc03 Ready Active 19.03.7
# pausar nodo, en modo pausa no acepta nuevas tareas pere ejcuta las existentes.
➜ docker node update --availability pause pc03
pc03
➜ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
yuc0or5k3izprm0go81keye7u * pc02 Ready Active Leader 19.03.6
retgjptxz1di57xc85qym6atv pc03 Ready Pause 19.03.7
# nodo drain, se desace de todos sus contenedores pasandolos a otros nodos
➜ docker node update --availability drain pc03
# nodo active, se reactiva el nodo.
➜ docker node update --availability active pc03
Cuando vuelve a configurar el nodo en Disponibilidad activa, puede recibir nuevas tareas:
- durante una actualización de servicio para escalar
- durante una actualización continua
- cuando configura otro nodo para Drenar disponibilidad
- cuando una tarea falla en otro nodo activo
Labels
# añadir label a nodo
➜ docker node update --label-add lloc=local pc03
...
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.labels.lloc == local]
networks:
- mynet
...
deploy:
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
- node.labels.lloc == local
apagar stack y quitar nodos
# borrar stack
➜ docker stack rm app
Removing service app_hello
Removing service app_portainer
Removing service app_visualizer
Removing network app_mynet
# quitar worker
[jorge@pc03 ~]$ docker swarm leave
Node left the swarm.
# quitar manager y parar swarm
➜ docker swarm leave --force
puertos
Obrir ports en el worker:
● 80
● 8080
● 9000
● 2377 per gestio de nodes
● Port 7946 UDP for container network discovery.
● Port 7946 TCP for container network discovery.
● Port 4789 UDP for the container ingress network.
Obrir ports en manager:
● Port 7946 UDP for container network discovery.
● Port 7946 TCP for container network discovery.
● Port 4789 UDP for the container ingress network.
Modo global
El modo global es un modo en el que se hará un despliegue de un contenedor en cada nodo, si hay 3 nodos se crearán tres replicas.
version: "3.7"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global