====== 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]]. \\