====== Docker Swarm: treballant amb stacks =====
Prerequisits: conèixer [[Docker]] i [[Docker Swarm]].
Els //stacks// son arxius de configuració de serveis per a Docker Swarm, amb la mateixa sintaxi que el ''docker-compose'' però amb alguns paràmetres afegits, en particular a través de l'**etiqueta //deploy//**.
{{ docker-swarm-3.png }}
{{tag> #FpInfor #Ceti #CetiMp03 #Ciber #CiberMp03 docker swarm stack contenidors traefik load_balancer DevOps}}
\\
===== Primer docker stack amb traefik =====
Anem a posar en marxa una xarxa amb dos serveis:
* **whoami** : container que mostra la IP i algunes dades internes per a fer proves.
* **traefik** : conegut //load balancer// i proxy invers per gestionar el balanceig de càrrega.
[[https://doc.traefik.io/traefik/|Traefik]] és un balancejador de càrrega i proxy invers basat en el llenguatge de programació Go! de Google molt emprat en orquestradors de contenidors.
{{ traefik-architecture.png?400 }}
Podràs visualitzar 2 webs (l'exemple és amb la IP que tenim configurada al Vagrantfile de [[Docker Swarm]]:
* 10.100.199.200:8080 : veuràs el panell d'administració de //traefik//.
* 10.100.199.200 : port 80 on podràs veure el //frontend// de traefik, però de moment ens mostra un ''Error 404: page not found''.
* **Si volem veure la web, caldrà que configureu l'arxiu ''/etc/hosts'' i apuntar el domini ''whoami.docker.local'' a la IP de la màquina //swarm//**.
* OJU perquè el ''/etc/hosts'' que s'ha d'actualitzar és el de la màquina on estiguem executant el //browser//, probablement serà la teva màquina física.
* Ara sí que podem visualitzar la web de ''whoami'' al navegador a: http://whoami.docker.local
version: '3'
services:
traefik:
image: traefik:v1.7
command: --web \
--docker \
--docker.swarmmode
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
networks:
- net
deploy:
placement:
constraints: [node.role==manager]
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
deploy:
labels:
- "traefik.enable=true"
- "traefik.backend=whoami"
- "traefik.docker.network=net"
- "traefik.port=80"
- "traefik.frontend.rule=Host:whoami.docker.local"
#- "traefik.backend.loadbalancer.sticky=true"
networks:
- net
networks:
net:
Per posar en marxa el //stack// ho podem fer d'aquestes dues maneres (amb una basta!):
docker stack deploy --compose-file whoami.stack.yml who
docker stack deploy -c whoami.stack.yml who
I ara, escalem el servei ''whoami'':
docker service scale who_whoami=5
docker stack ls
==== Sticky sessions ====
Mira el //backend// d'administració del ''traefik''
Posa en marxa el servei whoami a través del //stack// i visualitza la web del whoami.
* Quan refresques t'apareix una IP diferent?
Ara descomenta la línia amb ''- "traefik.backend.loadbalancer.sticky=true"'' i posa en marxa de nou el stack.
* Quan refresques t'apareix ara una IP diferent?
* Canvia la IP si accedeixes a la web via ''curl''?
* **ULL SPOILER ;) amb el ''curl'' la IP ha de variar. Si no ho fa pot ser que no hagis escalat el servei ''whoami'' (o que hagis actualitzat amb ''docker stack deploy'' i s'haurà resetejat a 1 instància).**
* Assegura't que tens diverses instàncies del servei ''whoami''.
* Què creus que significa el paràmetre //sticky// i perquè creus que funciona al //browser// però no amb ''curl''?
\\
===== Wordpress en swarm =====
Anem a fer una implementació de Wordpress amb Docker Swarm seguint l'arquitectura proposada en aquest diagrama:
{{ wordpress_swarm.png?580 }}
Elabora un //stack// per allotjar una configuració de Wordpress.
Tingues en compte que **la BD cal que estigui fixa al mateix node**, ja que **els volums NO es comparteixen entre màquines**. Busca quina restricció ens ho permet realitzar.
Com a //load balancer// pots optar entre fer servir el propi de Docker Swarm (no cal crear cap servei específic, el mateix sistema ho facilita) o bé pots afegir un //load balancer// propi com //traefik// (en aquest cas sí que cal crear un servei, tens un exemple en l'anterior configuració).
* Escala a, al menys, 3 instàncies del contenidor wp.
* Instal·la el Wordpress i entra al panell d'administració.
* Entra Penja un post amb una imatge.
* Comprova què passa si visualitzem el post des de diferents finestres privades. Què creus que està passant?
* Explica perquè es dona aquest error i proposa alguna solució raonant-la.
\\
===== Docker secrets =====
Docker Swarm ens permet no deixar la contrasenya en els arxius de configuració, utilitzant [[https://docs.docker.com/engine/swarm/secrets/|DOCKER SECRETS]]. Mitjançant aquest mecanisme posarem les contrasenyes, claus i altres dades sensibles a la RAM del Swarm, el què significarà un nivell més alt de seguretat.
Aquest és un exemple:
$ echo "micontraseña" | docker secret create mysql_password -
Els contenidors poden veure les contrasenyes accedint a, per exemple: ''/run/secrets/mysql_password''.
Les podem utilitzar al fitxer de //stack// així:
services:
...
db:
...
environment:
...
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/mysql_password
secrets:
- mysql_password
...
secrets:
- mysql_password
- external: true
\\
===== Gluster Filesystem =====
Per tal de facilitar la interoperativitat dels nodes en un Swarm es pot utilitzar un sistema d'arxius distribuit com GlusterFS.
Tens aquí algunes referències per instal·lar-lo:
* https://thenewstack.io/tutorial-create-a-docker-swarm-with-persistent-storage-using-glusterfs/
* [[https://docs.gluster.org/en/v3/Administrator%20Guide/Start%20Stop%20Daemon/|Documentació oficial Gluster FS]].
\\