Kubernetes uitgelegd voor iedereen
Je hebt misschien gehoord van Kubernetes en Docker, maar er nooit mee gewerkt. Je zit bijvoorbeeld nog in een organisatie waar alle applicaties in virtuele machines worden gehost. Kubernetes en Docker zijn buzzwords, maar je bent nieuwsgierig, en wilt meer weten. Waar begin je?
Docker en containers
We beginnen bij containers. Containers kan je kort door de bocht zien als een licht gewicht virtual machine (VM). Waar een VM als een complete computer werkt, inclusief eigen besturingssysteem, gebruiken containers delen van het besturingssysteem van de host machine. Het grote voordeel hiervan is dat je meer containers kan draaien dan VM’s op dezelfde hardware. Er zijn meer verschillen tussen containers en VM’s, maar daar ga ik nu niet op in. Docker is simpelweg een van vele implementaties van container technologie.
Docker in productie
Om met Docker te werken type je commando's in een terminal of Powershell. Dit werkt goed wanneer je op je eigen machine ontwikkelt, Maar wat gebeurt er als je naar productie wilt met je containers? Ga je dan op je server met de hand Docker commando's intypen voor elke release? Hoe zit het met de downtime? Wat gebeurt er als je wilt opschalen, en meerdere servers wilt gebruiken om je applicatie te draaien? Er zijn veel vragen te bedenken in deze situatie. Docker alleen is niet praktisch in een productie omgeving. Er is meer tooling nodig.
Wat is Kubernetes?
Kubernetes is een tool, ontwikkeld door Google, die je kan gebruiken om containers op grote schaal te beheren, over meerdere servers. Voordelen voor ontwikkelaars zijn onder andere dat Kubernetes de uptime van je applicatie verbetert, deployments vergemakkelijkt, automatisch schaalt, en meer.
Met Kubernetes kan je onder andere:
- Automatisch het aantal containers van je applicatie omhoog en omlaag schalen. Handig als je in de cloud werkt, waar je bij minder traffic minder resources wilt gebruiken om de kosten te drukken.
- Je containers automatisch over je hele cluster verspreiden voor hogere uptime, of specifiek toekennen aan enkele nodes (meer over clusters en nodes hieronder) die geschikte hardware hebben. Meerdere servers aan elkaar knopen voor high-availability. Kubernetes kan je containers automatisch verspreiden over meerdere servers als deze aanwezig zijn.
- Releases met 1 command uitrollen over al je servers die automatisch je oude containers een voor een vervangen met nieuwe containers (geen downtime!).
- Automatisch checken of je containers nog correct werken.
- Verkeer tussen containers beperken tot bepaalde ports.
Het Kubernetes cluster
Als je ergens leest over Kubernetes, is de kans groot dat men het heeft over een Kubernetes cluster. Onder een cluster verstaan we een aantal nodes. Nodes zijn simpelweg de servers waar containers op draaien. Deze servers kunnen fysieke machines zijn, of virtual machines, of zelfs (docker) containers. Er zijn ook één of meerdere master nodes, die de rest van het cluster in de gaten houden. Elke node heeft een aantal Kubernetes-gerelateerde processen lopen, om communicatie met andere nodes mogelijk te maken.
Op elke node in je cluster draaien pods: een pod is een verzameling van 1 of meer (Docker) containers. Een pod kan ook een volume bevatten: een manier voor containers om persistent data op te slaan op bijvoorbeeld een NFS schijf. Op deze manier kan je een database hebben die data wegschrijft naar een locatie buiten het cluster. Zo kan je bv van deze NFS schijf meerdere malen per dag een backup maken zodat klantgegevens niet verloren gaan.
Hier komt de kracht van Kubernetes naar voren: een of meerdere master nodes houden het hele cluster (en ook elkaar) in de gaten. Als een pod problemen geeft (bijvoorbeeld crasht), zorgt de master node ervoor dat er weer een nieuwe pod beschikbaar komt. Als een hele node offline gaat, worden de pods die daar op draaiden automatisch herverdeeld over de nodes die nog wel online zijn. Afhankelijk van de hoeveelheid traffic kunnen automatisch meer of minder pods opgezet worden. Handig als je in de cloud draait, en ’s nachts minder gebruikers hebt. Om kosten te besparen schaal je dan terug, en betaal je minder voor je resources. Overdag heb je automatisch weer meer pods.
Een goed opgezet cluster kan dus aardig wat klappen verduren voordat de gebruikers merken dat er iets aan de hand is.
Ook releases gaan geruisloos in Kubernetes. Bij het uitrollen worden pods standaard een voor een uitgezet en vervangen met een nieuwe versie. Op deze manier heb je nooit downtime. Als je als developer je CI/CD pipeline goed hebt ingericht, zijn deployments nooit meer zo pijnlijk als toen je het nog handmatig moest doen.
Nadelen
- Een groot nadeel is dat Kubernetes ervan uit gaat dat je applicaties stateless (geschiedenis wordt niet opgeslagen)zijn: de levensduur van een pod is onvoorspelbaar, en je kan ook niet voorspellen op welke pod een HTTP request binnen komt. Als je legacy applicaties hebt die niet over meerdere servers kunnen draaien, gaat Kubernetes je niet helpen.
- Voor eenvoudige applicaties kan Kubernetes overkill zijn.
- Er is goed lesmateriaal te vinden over Kubernetes, maar je hebt wel tijd nodig om het te leren gebruiken: Kubernetes is niet een tool die je in een paar uur onder de knie hebt.