====== 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.8' services: traefik: image: traefik:v3.4 command: - --api.insecure=true - --providers.docker=true - --providers.swarm=true - --providers.docker.exposedbydefault=false - --providers.swarm.exposedbydefault=false - --entrypoints.web.address=:80 ports: - "80:80" - "8080:8080" # Dashboard volumes: - /var/run/docker.sock:/var/run/docker.sock:ro deploy: placement: constraints: - node.role == manager whoami: image: traefik/whoami deploy: replicas: 4 labels: - traefik.enable=true - traefik.http.routers.whoami.rule=Host(`whoami.docker.local`) - traefik.http.routers.whoami.entrypoints=web - traefik.http.services.whoami.loadbalancer.server.port=80 #- traefik.http.services.whoami.loadbalancer.sticky=true #- traefik.http.services.whoami.loadbalancer.sticky.cookie.name=whoami_cookie #- traefik.http.services.whoami.loadbalancer.sticky.cookie.secure=false ULL si treballes amb aquesta versió obsoleta de Traefik v1, ja que és incompatible amb les APIs de Docker actuals. És preferible utilitzar la v3 de la qual teniu un exemple aquí mateix. Si vols poder-la emprar igualment, pots fer-ho fent un //tunning// del motor de Docker Swarm per activar la compatibilitat amb APIs antigues. Caldria **crear aquest arxiu i reiniciar els serveis de Docker a tots els nodes del Swarm**: { "min-api-version": "1.24" } Després pots reiniciar els serveis amb: $ sudo systemctl restart docker.service docker.socket 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 les línies del final referents a ''sticky'' 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]]. \\