Een zwerm van Docker nodes
In het kader van de HAN-minor DevOps onderzoek ik de orchestration tool *Docker Swarm*, een onderwerp dat de courses niet standaard behandelen, maar wel te maken heeft met het thema van de vierde week: *orchestration*.
Dit onderzoek heeft als doel kennis van deze technologie op te doen zodat het eventueel gebruikt kan worden in een klein DevOps project. In deze context zou Docker Swarm toegepast kunnen worden om een microservice architectuur te deployen.
Eerst een uitleg wat Docker Swarm nou precies is en waar een cluster uit bestaat. Daarna volgt een hands-on onderdeel met twee verschillende configuraties van een Swarm cluster. Ten slotte een vergelijking van Docker Swarm op een aantal onderwerpen en beschrijving in welke situaties je het beste Docker Swarm kunt toepassen.
Wat is Docker Swarm?
Docker Swarm (Docker, z.d.) is een container orchestration tool waarmee een gebruiker meerdere containers over een aantal verschillende host machines kan deployen (sumo logic, z.d.). Deze fysieke of virtuele nodes vormen samen een cluster vormen. Binnen dit cluster kun je nog steeds je Docker commando’s uitvoeren. Het enige verschil is nu dat deze commando’s worden uitgevoerd door de verschillende nodes in je cluster.
Docker Swarm, of Swarm Mode, draait op de swarming toolkit ‘Swarmkit’. In vroegere versies van Docker was het optioneel om deze software toe te voegen aan je Docker installatie, maar vanaf Docker 1.12 zit Swarmkit standaard bij een Docker installatie ingebakken (Poulton, 2018).
Nodes
Een swarm bestaat uit een groep van machines die samen gebundeld zijn tot een cluster. Als een nieuwe machine aan dit cluster wordt toegevoegd, wordt het een node in de swarm. Het is in principe niets anders dan een Docker node, het enige verschil is dat je vaak bij development te maken hebt met je eigen lokale node. Dit is de machine waar je op werkt. Echter zie je al gauw bij productie swarm deployments dat je te maken hebt met meerdere Docker nodes die zijn verdeeld over meerdere fysieke en virtuele (cloud) machines (Docker, z.d.).
Zoals in Afbeelding 1 staat afgebeeld, bestaat een Swarm uit verschillende soorten groepen en wordt er onderscheid gemaakt tussen verschillende soorten nodes. Hoewel het diagram maar twee soorten nodes laat zien, bestaan er drie typen nodes die ieder een eigen rol spelen in het swarm ecosysteem.
Afbeelding 1. Globaal overzicht van een Docker Swarm.
Manager nodes zijn nodes die voor het cluster management zorgen. Ze zorgen ervoor dat taken worden toegewezen aan worker nodes en dat de swarm zich in de gewenste staat bevindt. Nigel Poulton (2018) stelt dat Docker een minimaal aantal van drie en een maximaal aantal van zeven manager nodes aanbeveelt. Minder dan dit aantal kan nadelig werken op de availability van je cluster en meer dan dit aantal kan voor onnodige complexiteit zorgen. Een van de manager nodes wordt geclassificeerd als de leader node. De leader node maakt alle beslissingen die betrekking hebben tot swarm management en taakverdeling. Als de leader uitvalt, wordt er door middel van het Raft consensus algoritme een nieuwe leader gekozen.
Worker nodes zijn nodes die de de toegewezen taken van de manager nodes uitvoeren. Docker (z.d.) stelt dat de manager nodes standaard ook worker nodes zijn, maar het is eventueel zo te configureren dat deze twee takenpakketten van elkaar worden gescheiden en dat manager nodes exclusief management taken uitvoeren. Gedurende het uitvoeren van de taken wordt de status van de worker node bijgehouden door een agent die bij de worker node draait. Deze agent rapporteert de status van de node en de uit te voeren taken aan de manager nodes zodat deze de gewenste staat van iedere worker node kan bijhouden.
Services
Een Service is de definitie van een taak die wordt uitgevoerd op een manager of een worker node. Docker Swarm hanteert twee soorten services:
- Replicated services: Swarm mode replicated services functioneert op een manier waarop jij als gebruiker aangeeft hoeveel replica’s van een taak uitgevoerd worden. De manager distribueert de replica’s over de beschikbare nodes op basis van de schaal die je hebt aangegeven. Je wilt bijvoorbeeld vier replica’s van een front-end applicatie runnen.
- Global services: Global services funtioneert op een manier waarop de swarm manager de taak op elk van de beschikbare nodes dat aan opgegeven service constraints en resource requirements voldoet.
Hoe werkt Docker Swarm?
Om de werking van docker swarm op een simpele manier toe te lichten, heb ik drie virtuele machines opgezet: manager, worker1 en worker2. Alle drie machines draaien versie 20.10.9. van de Docker engine.
Een swarm configureren
Om een swarm te configureren, voert de eerste node het commando docker swarm init
uit. Afbeelding 2 toont dat het commando een nieuwe swarm aanmaakt en dat de node een manager wordt.
Afbeelding 2. Aanmaken van een docker swarm.
Bovenstaand docker swarm join
commando voer je nu uit op de twee worker machines. Zoals in Afbeelding 3 is te zien, worden deze machines nu nodes in de swarm.
Afbeelding 3. De twee worker nodes joinen de swarm.
Je kunt dit controleren door bij de manager docker node ls
uit te voeren. In Afbeelding 4 zie je dat het een lijst van nodes geeft, waarbij het zichzelf als manager ziet en de twee toegevoegde nodes in het lijstje weergeeft.
Afbeelding 4. De huidige nodes in het cluster.
Een service deployen in Docker Swarm
Om een replicated service te deployen in de swarm, voer je het commando docker service create
uit. Zie onderstaand commando om drie replica’s van een nginx service te maken en deze te publishen op poort 8080.
docker service create --name webapp \
--replicas 3 \
--publish published=8080,target=80 \
nginx
Afbeelding 5 toont drie replica’s van de nginx service gedeployed op het cluster.
Afbeelding 5. Het aanmaken van drie replica’s van een nginx service.
Meerdere services deployen met Docker stack
Poulton (2018) stelt dat het mogelijk is om op een meer declaratieve manier je services in één keer te deployen op de docker swarm. Hiervoor gebruik je stackfiles. Dit zijn niet meer dan docker-compose bestanden met meer informatie om een deployment uit te voeren op een cluster. Voor deze blog heb ik een simplistische NodeJS Express applicatie gebouwd die een aantal resultaten van een MongoDB database teruggeeft. De applicatie vind je hier te vinden, en heeft de volgende structuur:
Als eerst schrijf je een docker-compose.yml
die geschikt is om een docker stack deploy actie uit te voeren. Dit betekent dat de compose file versie 3+ moet zijn (Poulton, 2018).
Ook moet je voor iedere service een deploy onderdeel definiëren. In dit onderdeel geef je aan of je de service global of replicated wilt deployen en hoeveel replica’s je op de nodes moeten komen. Je kunt eigen update- en/of restart configuratie aangeven om in te spelen op wijzigingen in het cluster en hoe je om wilt gaan met crashes. Binnen het deploy blok kun je dus in feite je gewenste state aangeven.
Voor de sample app is het onderstaande stackfile opgesteld. De webapi service deployed de service nu in replicated mode met drie verschillende replica's en de mongo service deployed Docker enkel op een manager node.
version: '3'
services:
webapi:
image: 127.0.0.1:5000/swarm-demo
build: .
ports:
- "3000:3000"
networks:
- swarm-app
deploy:
mode: replicated
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
depends_on:
- db
db:
image: mongo
ports:
- "27017"
volumes:
- mongodata:/data/db
restart: "always"
deploy:
placement:
constraints: [node.role == manager]
networks:
- swarm-app
volumes:
mongodata: {}
networks:
swarm-app:
Om deze applicatie in de docker swarm te deployen, voer je het commando docker stack deploy --with-registry-auth --compose-file docker-compose.yml swarm-demo
uit. Afbeelding 6 toont de gedefinieerde services met bijbehorende aantal replica’s.
Afbeelding 6. Het deployen van een stackfile in de docker swarm.
Het resultaat van de Express applicatie te zien (zie Afbeelding 7) door naar poort 3000 te navigeren.
Afbeelding 7. Resultaat van de Express web applicatie.
Docker Swarm vs. Kubernetes
Docker Swarm en Kubernetes zijn beiden container orchestration software. Waarin verschilt Docker Swarm van Kubernetes en waarin komt het overeen? Hieronder staan de belangrijkste punten op een rijtje.
- Installatie en gebruik — Docker Swarm maakt standaard deel uit van de Docker Engine, waardoor het bij een Docker installatie inbegrepen is. Kubernetes moet apart worden geïnstalleerd en geconfigureerd, dit wordt door sommigen als complex ervaren (Drewel, 2021).
- Leercurve — Met kennis van het gebruik van Docker is de leercurve vrij vlak voor het gebruik van Docker Swarm. Kubernetes daarentegen is een stuk uitgebreider dan Docker Swarm, hierdoor is de leercurve ook stijler. De gebruiker moet bijvoorbeeld leren om de kubectl CLI te gebruiken. Docker swarm kan makkelijk worden gebruikt door gebruikers die kennis hebben van de Docker CLI.
- Scalability — Zowel Kubernetes en Docker Swarm maken gebruik van automatisch opschalen van services (IBM, 2021). De manier waarop ze dit doen verschilt wel. Omdat Kubernetes uitgebreider is, duurt het opschalen langer dan bij Docker Swarm (Sengupta, 2020). Hierdoor is Docker Swarm geschikter voor on-demand scaling.
- High Availability — Het grootste verschil in HA is te vinden in de manier waarop het cluster wordt beheerd. Docker Swarm garandeert HA door op manager node niveau service replication uit te voeren. Kubernetes bevat een geavanceerder controle (control plane) systeem waarbij de Control Plane ‘unhealthy’ nodes direct aanpakt (Rosen, 2020).
- Monitoring — Kubernetes biedt veel meer mogelijkheden voor third-party monitoring software integration zoals Prometheus, Grafana en InfluxDB. Docker Swarm kan op een aantal manieren gemonitored worden, maar over het algemeen ervaart men dit als complex door de vele cross-node objecten en services.
Is Docker Swarm de orchestration tool voor jou?
Zoals in deze blog is aangetoond, kan je op een gemakkelijke manier een Docker Swarm cluster configuren en gebruiken. Een cluster bevat een simpele begrijpbare structuur met manager en worker nodes. Het kent veel overeenkomsten, maar ook verschillen met grotere orchestration tools zoals Kubernetes, met name in onderliggende technologiëen, maar ook in de mogelijkheden van bijvoorbeeld monitoring en het gebruik hiervan.
Bij het kiezen voor een orchestration tool, moet je bepaalde factoren afwegen. Het moet aansluiten op je behoeften. Is je microservice architectuur van kleinere schaal, wil je binnen het domein van Docker blijven werken, heb je geen extra lagen van indirectie nodig en wil je snel on-demand kunnen schalen? Dan is Docker Swarm de tool voor jou.
Bronnen
- Docker. (z.d.). Empowering App Development for Developers. Geraadpleegd op 6 oktober 2021 van https://www.docker.com
- Docker. (z.d.). Deploy a stack to a swarm. Docker Documentation. Geraadpleegd op 6 oktober 2021 van https://docs.docker.com/engine/swarm/stack-deploy
- Docker. (z.d.). Swarm mode key concepts. Docker Documentation. Geraadpleegd op 7 oktober 2021 van https://docs.docker.com/engine/swarm/key-concepts
- Drewel, K. (2021, 26 februari). Kubernetes vs. Docker (Swarm): wat zijn de verschillen? True. Geraadpleegd op 7 oktober 2021 van https://www.true.nl/blog/kubernetes-vs-docker-swarm-verschillen
- Poulton, N. (2018, 4 januari). Docker Deep Dive [Video]. Pluralsight. Geraadpleegd op 6 oktober 2021 van https://www.pluralsight.com/courses/docker-deep-dive-update
- Sengupta, S. (2020, 24 november). Kubernetes vs Docker Swarm: Comparing Container Orchestration Tools. BMC Blogs. Geraadpleegd op 7 oktober 2021 van https://www.bmc.com/blogs/kubernetes-vs-docker-swarm
- Rosen, C. (2021, 3 april). Docker Swarm vs. Kubernetes: A Comparison. IBM. Geraadpleegd op 7 oktober 2021 van https://www.ibm.com/cloud/blog/docker-swarm-vs-kubernetes-a-comparison
- Sumo Logic, Inc. (2021, 1 juni). What is Docker Swarm? Sumo Logic. Geraadpleegd op 6 oktober 2021 van https://www.sumologic.com/glossary/docker-swarm