Ga naar hoofdinhoud

Introductie Kubernetes

Wat is Kubernetes

Kubernetes is een open-source platform voor het automatiseren van de deployment, het beheer en de schaalbaarheid van containerized applicaties.

Kubernetes biedt de tools om applicaties op schaal te beheren en te optimaliseren. Het kan onder meer:

  • Containers orchestreren: Kubernetes beheert en distribueert containers over meerdere nodes binnen een cluster.
  • Schaalbaarheid: Het kan automatisch resources toevoegen of verminderen (autoscaling) afhankelijk van de vraag, wat kosten en efficiëntie optimaliseert.
  • Zelfherstelend: Als een container uitvalt, kan Kubernetes deze automatisch opnieuw opstarten. Het zorgt ervoor dat er altijd een bepaalde, door de gebruiker gedefinieerde, status behouden blijft.
  • Load balancing en service discovery: Kubernetes verdeelt de belasting van applicaties en zorgt ervoor dat het verkeer naar de juiste containers wordt gestuurd.
  • Geautomatiseerde deployments en rollbacks: Kubernetes kan updates aan applicaties soepel implementeren, zonder dat eindgebruikers hier last van hebben, en kan bij problemen automatisch terugkeren naar een eerdere versie.

Kernconcepten

Pod

Een Pod is de kleinste en eenvoudigste eenheid in Kubernetes. Het is een abstractie van één of meerdere containers die samen draaien op dezelfde host (node) en gedeelde resources gebruiken (zoals netwerk en opslag). Meestal bevat een pod één container, maar het kan meerdere containers bevatten die nauw samenwerken, bijvoorbeeld voor het delen van data of een specifieke taak.

Voorbeeld: Stel je voor dat je een webserver hebt die met een database communiceert. Je kunt beide containers in één pod plaatsen zodat ze eenvoudig kunnen communiceren via de gedeelde netwerkbronnen.

Deployment

Een Deployment is een hogere abstractie die helpt bij het beheren van de levenscyclus van pods. Het definieert hoe een bepaalde versie van een applicatie moet draaien en zorgt voor automatische updates, schaalbaarheid en rollbacks van de pods. Een deployment binnen Kubernetes zorgt er altijd voor dat het gewenste aantal pods draait en automatisch nieuwe pods creëert als er eentje faalt of verwijderd wordt.

Voorbeeld: Als je een applicatie wilt bijwerken naar een nieuwe versie, kun je een Deployment gebruiken die de update beheert zonder downtime. Het zal ervoor zorgen dat de nieuwe pods eerst worden gestart en "gezond" zijn voor hij de oude pods stopt. Op deze manier is er altijd een minimale beschikbaarheid, die je zelf kan instellen.

Service

Een Service in Kubernetes is een abstractie die een stabiel netwerkadres biedt voor toegang tot een set van pods. Omdat pods dynamisch kunnen worden toegevoegd, verwijderd of herstart, zorgt een Service ervoor dat gebruikers altijd toegang hebben tot de juiste pods, ongeacht hun onderliggende IP-adressen.

Voorbeeld: Stel je een microservice-architectuur voor waar verschillende pods verantwoordelijk zijn voor verschillende delen van je applicatie. Een Service zorgt ervoor dat de communicatie tussen deze verschillende pods en van buitenaf naar binnen soepel verloopt.

ConfigMap

Een ConfigMap is een Kubernetes-object waarmee je configuratiegegevens kunt opslaan die door je applicatie gebruikt worden. Deze gegevens kunnen bijvoorbeeld instellingen zijn die je applicatie nodig heeft, zoals database-verbindingen of omgevingsvariabelen. ConfigMaps worden vaak gebruikt om de applicatieconfiguratie van de containerconfiguratie te scheiden.

Voorbeeld: In plaats van de databaseverbinding in je code te coderen, kun je deze informatie in een ConfigMap opslaan, zodat de applicatie deze tijdens runtime kan ophalen.

Secret

Een Secret is vergelijkbaar met een ConfigMap, maar het wordt gebruikt om gevoelige informatie, zoals wachtwoorden, certificaten of API-sleutels, op een veilige manier op te slaan. Secrets worden gecodeerd (meestal in base64) en kunnen alleen door geautoriseerde pods worden gelezen, wat bijdraagt aan de beveiliging van je applicatie.

Voorbeeld: Het wachtwoord voor toegang tot een externe database kan als een Secret worden opgeslagen en door je applicatie worden opgehaald zonder dat het hardcoded in de code zit.

Kubernetes architectuur

Hieronder zie je een schets van de architectuur van Kubernetes. We zullen in de volgende secties elk deel van de tekening in meer detail bespreken.

kubernetes_architecture

Master Node

De Master Node is de centrale controle-eenheid van een Kubernetes-cluster. Het is verantwoordelijk voor het beheren en coördineren van alle activiteiten in de cluster, zoals het plannen van workloads, het beheren van de staat van de cluster, en het reageren op veranderingen in de omgeving.

De Master Node bevat de volgende belangrijke componenten:

  • API Server: Het toegangspunt voor interactie met het Kubernetes-cluster. Alle requests van gebruikers, applicaties, en tools worden via de API Server verwerkt.
  • Controller Manager: Beheert verschillende controllers die verantwoordelijk zijn voor het handhaven van de gewenste status van de cluster, zoals het beheren van pods, replica's, en nodes.
  • Scheduler: Deze bepaalt op welke Worker Node een pod moet draaien, op basis van resources en andere vereisten. Zie ook het stukje over kube-scheduler hieronder.
  • etcd: Een gedistribueerde key-value store die de configuratie en de status van de cluster opslaat. Zie ook het stukje over etcd hieronder.

Worker Nodes

Worker Nodes zijn de machines waarop de daadwerkelijke applicaties en containers draaien. Elke Worker Node draait de kubelet, kube-proxy, en de containers die deel uitmaken van de pods. De Worker Nodes zorgen ervoor dat de gewenste containers draaien, de netwerkcommunicatie tussen pods wordt geregeld, en resources zoals CPU en geheugen efficiënt worden toegewezen.

Een Worker Node bevat de volgende componenten:

  • kubelet: De kubelet is verantwoordelijk voor het draaien van de containers in de pods op de Worker Node. Het zorgt ervoor dat de juiste containers draaien zoals gedefinieerd in de Kubernetes-specificaties, en dat de containers in goede staat blijven ("healthy"). Zie ook het stukje over kubelet hieronder.
  • kube-proxy: De kube-proxy zorgt voor netwerkverbindingen binnen de cluster en externe toegang tot de services van de cluster. Het zorgt ervoor dat het netwerkverkeer goed wordt omgeleid naar de juiste pod, en maakt load balancing mogelijk voor services. Zie ook het stukje over kube-proxy hieronder.
  • Container runtime: Dit is de software die daadwerkelijk de containers runt (zoals Docker, containerd, of CRI-O).

etcd

etcd is een gedistribueerde key-value store die wordt gebruikt door Kubernetes om configuratie-instellingen en de status van de cluster op te slaan. Het is de "bron van waarheid" voor de hele Kubernetes-omgeving. Alle belangrijke gegevens, zoals de status van pods, services, deployments, en andere clusterconfiguraties, worden hierin bewaard. Etcd is een cruciaal onderdeel voor de betrouwbaarheid en consistentie van de cluster, omdat het ervoor zorgt dat alle nodes dezelfde status en configuratie van de cluster kennen.

  • Functie: Opslaan van de configuratie, status van de pods, en andere belangrijke gegevens van de cluster.
  • Kenmerk: Het is geconfigureerd om gegevens op te slaan in een gedistribueerde manier, zodat de gegevens beschikbaar blijven, zelfs als er een failure optreedt op één van de nodes.

kube-scheduler

De kube-scheduler is een component van de Master Node en is verantwoordelijk voor het plannen van de pods op de Worker Nodes. Wanneer een pod wordt aangemaakt (via een Deployment of andere resources), beslist de kube-scheduler op welke Worker Node de pod het beste kan worden geplaatst, op basis van de beschikbare resources (zoals CPU, geheugen) en andere vereisten zoals labels, affiniteit, en anti-affiniteit.

  • Functie: Bepalen op welke Worker Node een pod draait op basis van de resources en de clusterbeleid.
  • Kenmerk: De scheduler houdt rekening met de toestand van de cluster, zoals overbelasting van nodes of netwerkverbindingen, en maakt geoptimaliseerde beslissingen.

kube-proxy

De kube-proxy draait op elke Worker Node en is verantwoordelijk voor het beheren van de netwerkverkeer binnen de Kubernetes-cluster. Het zorgt ervoor dat netwerkverkeer tussen pods correct wordt omgeleid naar de juiste bestemming (bijvoorbeeld een Service) en voert load balancing uit voor inkomend verkeer naar de juiste pods.

  • Functie: Beheer van netwerkverkeer en load balancing binnen Kubernetes.
  • Kenmerk: Het ondersteunt verschillende netwerkstrategieën (zoals iptables of IPVS) om netwerkverkeer effectief te routeren en te balanceren over de pods die bij een service horen.

kubelet

De kubelet is een agent die draait op elke Worker Node en zorgt ervoor dat de containers die in de pods draaien, op de juiste manier worden beheerd en uitgevoerd. De kubelet haalt de gewenste toestand (bijv. welke pods draaien) op van de Master Node via de API Server en zorgt ervoor dat de containers in de pods correct draaien en voldoen aan de specificaties.

  • Functie: Zorgt ervoor dat de containers in de pods draaien zoals opgegeven door de gebruiker.
  • Kenmerk: De kubelet houdt de containers en pods in de gaten en meldt eventuele problemen aan de API Server voor herstelacties.

Docker en kubernetes in de praktijk

In een Kubernetes-cluster werkt Docker als de container runtime die de containers uitvoert, terwijl Kubernetes verantwoordelijk is voor het coördineren en beheren van de containers in een gedistribueerde omgeving.

Container images bouwen met Docker

Docker Images: Ontwikkelaars bouwen container images met Docker, waarin de applicatiecode, afhankelijkheden en configuratie zijn verpakt.

Docker Registry: Deze images worden vaak geüpload naar een Docker registry (zoals Docker Hub of een privé registry), vanwaar ze door Kubernetes kunnen worden gedownload en uitgevoerd.

Pods in Kubernetes

In Kubernetes worden containers gegroepeerd in Pods. Een Pod is de kleinste eenheid in Kubernetes en kan één of meer containers bevatten die samen draaien op dezelfde node. Deze containers delen dezelfde netwerkbronnen en opslagvolume.

Kubernetes en de container runtime

Kubernetes Nodes draaien de container runtime (in dit geval Docker) via de kubelet. De kubelet is verantwoordelijk voor het beheren van containers op de Worker Nodes en zorgt ervoor dat de juiste containers draaien in de juiste pods. Kubernetes kan meerdere container runtimes ondersteunen, maar Docker is een van de meest populaire keuzes.

Deployment van containers

Wanneer een gebruiker een Kubernetes Deployment definieert, geeft de gebruiker aan welke Docker Image moet worden uitgevoerd en hoe de containers moeten worden beheerd (bijvoorbeeld, hoeveel replica's). De kube-scheduler van Kubernetes plant de pods op de beschikbare Worker Nodes. De kubelet binnen de de Worker Node communiceert met Docker om de containers in de juiste pod te starten en te beheren.

Networking en load balancing

Kubernetes zorgt voor de netwerkinfrastructuur tussen containers via kube-proxy. Dit zorgt ervoor dat de containers onderling kunnen communiceren en dat verkeer naar de juiste pods wordt geleid via services. Docker zorgt voor de isolatie van netwerken op node-niveau, maar Kubernetes biedt een meer geavanceerde netwerklaag voor de communicatie tussen containers op verschillende nodes in de cluster.

Schalen en beheren van containers

Schaalbaarheid: Kubernetes maakt het eenvoudig om het aantal replica's van een bepaalde pod te schalen op basis van de vraag. Als je bijvoorbeeld 10 replica’s van een container nodig hebt voor een applicatie, kan Kubernetes dit automatisch beheren. Zelfherstel: Kubernetes zorgt ervoor dat, als een container of pod crasht, de gewenste status wordt hersteld door een nieuwe container te starten. Dit wordt gedaan door de ReplicaSets binnen Kubernetes.

Opslag en Configuratiebeheer

Kubernetes biedt mechanismen zoals ConfigMaps en Secrets om configuratie en gevoelige gegevens te beheren, zodat ze veilig aan de containers kunnen worden geleverd. Voor opslag biedt Kubernetes Volumes die door containers in verschillende pods kunnen worden gedeeld, zodat ze persistent zijn (zelfs als containers opnieuw worden opgestart).

Rolling updates en rollbacks

Rolling updates: Kubernetes kan nieuwe versies van containers implementeren zonder downtime door geleidelijk nieuwe pods met de nieuwe image te lanceren terwijl oude pods worden verwijderd. Rollbacks: Als er een probleem is met een nieuwe versie van de applicatie, kan Kubernetes automatisch terugkeren naar een vorige versie van de container zonder dat de gebruikerservaring wordt onderbroken.