Kubernetes. Wat is het en hoe zetten wij het in?

Heb je met softwareontwikkeling te maken dan heb je vast en zeker wel eens van Kubernetes gehoord. Kubernetes is hip en door de open source community helemaal omarmd. Kubernetes is ook “here to stay”: er wordt volop aan ontwikkeld en eigenlijk alle grote cloud-aanbieders (Azure, Amazon, Google, etc) ondersteunen deze techniek al. Als je voorbereid wilt zijn op de toekomst kun je er dus eigenlijk niet omheen.

Bij Netvlies willen wij hét voorbeeld zijn voor organisaties om te blijven innoveren op het gebied van business, mens en technologie, door het zelf te doen. Wij maken ook gebruik van Kubernetes in ons ontwikkelproces. Wij delen dan ook graag de door ons opgedane kennis. Wat is het nou precies? Waar zet je het voor in? In dit blog lees je er meer over.Containers

Bij de ontwikkeling van onze websites, webshops en webapplicaties maken we gebruik van zgn. “container-virtualisatie”. Container-virtualisatie is een techniek waarbij de meeste resources worden gedeeld met het host-systeem, in tegenstelling tot de vroeger veel gebruikte virtual machines. Bij virtual machines wordt een hele computer geëmuleerd, bij een container is dat anders: Een container lijkt op een volledig geëmuleerde computer, maar is in werkelijkheid weinig meer dan een afgebakend stukje op het host-systeem. Containers zijn hierdoor erg lichtgewicht en bevatten alleen de dependencies die de desbetreffende applicatie nodig heeft.

Een container is verplaatsbaar, stabiel, makkelijk te reproduceren en te isoleren. Door het gebruik van containers kunnen verschillende developers met verschillende machines, operating systems en/of configuraties toch onder exact dezelfde omstandigheden aan een applicatie werken.

Je kunt meerdere containers naast elkaar laten draaien, elk met hun eigen doel en een andere applicatie, of juist meerdere containers met dezelfde applicatie waarmee je de load op die applicatie kunt verdelen. Je kunt alleen niet eindeloos veel containers naast elkaar plaatsen. De virtuele, afgescheiden omgevinkjes delen samen de kernel (de basis van een operating system) en de resources van de machine waar ze op draaien.

Bekijk het plaatje van de haven hierboven. Je kunt je voorstellen dat het opzetten, verplaatsen, laden en lossen en beheren van containers een behoorlijke klus is. Bij development is dat eigenlijk ook zo: bij een klein aantal applicaties en containers is dit nog wel te overzien, maar zeker wanneer je -zoals wij- met grote hoeveelheden servers, applicaties en typen containers te maken hebt, is het nodig dit beheer van containers te automatiseren. Je moet het samenspel van containers als het ware “orkestreren”. En daar komt Kubernetes bij om de hoek kijken.

Wat is Kubernetes?
Kubernetes is een techniek voor het organiseren van containers, de zogenoemde “Container Orchestration”. Oorspronkelijk ontwikkeld door Google maar gereleased aan de open source community. Kubernetes start de containers op, zorgt voor o.a. load balancing, failover, routering netwerkverkeer bij grote drukte, makkelijke (automatische) opschaling, maar ook voor downscalen van resources als het rustig is. Loopt een container vast, dan zorgt Kubernetes voor een nieuwe.

Deze taken automatiseren scheelt developers en DevOps engineers ontzettend veel tijd. Doordat Kubernetes je heel veel configuratiewerk uit handen neemt kun je ook sneller ontwikkelen: Sneller nieuwe applicaties schaalbaar uitrollen, maar ook sneller nieuwe features uitrollen naar bestaande.

Services, Deployments & Pods
In Kubernetes bestaan veel verschillende resource typen, die samen een complexe, maar flexibele keten van schakels vormen. Er zijn een paar belangrijke resources die eigenlijk overal terugkomen:

  • Pods: de laagste abstractie-laag om de docker-containers heen. Meestal heeft een pod één container, maar het is ook mogelijk om meerdere containers aan een pod toe te voegen. De functie van de pod is eigenlijk puur het doorsturen van acties voor de container. In onze architectuur kiezen we ervoor om de vertaling van pods naar containers zo direct mogelijk te houden, en dus bij een pod één container toe te voegen.
  • Deployments: de middelste abstractie-laag in de container-virtualisatie van Kubernetes. Deployments regelen alles met betrekking tot scaling en monitoring van pods. Als een pod faalt, zorgt de deployment ervoor dat er een nieuwe wordt opgespind. Up- en down-scaling gebeurt ook hier. Deployments kunnen verschillende soorten pods hebben, maar over het algemeen is het beter om dit per deployment bij één type te houden. Dit komt de beheersbaarheid en overzichtelijkheid ten goede.
  • Services: de hoogste abstractie-laag van de container-virtualisatie. In onze architectuur worden services puur gebruikt om communicatie te faciliteren tussen deployments, en om communicatie van buitenaf mogelijk te maken (port forwarding bijvoorbeeld) via Ingress. Wanneer er vanuit een pod gecommuniceerd wordt naar een andere container, gaat dit altijd via de service. Intern wordt de communicatie dan weer via de deployment doorgestuurd naar de pod. Services kunnen ook direct pods aansturen, maar dat wordt door Netvlies niet gedaan: Deployments zijn hiervoor verantwoordelijk.

Data-opslag binnen Kubernetes
Net als bij iedere webapplicatie, wordt er ook bij een applicatie die binnen Kubernetes draait allerlei data opgeslagen. Hoe we hiermee omgaan verschilt per type data. We zullen hieronder op een paar voorbeelden ingaan.

Projectcode
De code van het project wordt bij ons in de PHP- en nginx-containers geplaatst, en dus niet op een apart shared volume gezet. Waarom wij daarvoor kiezen:

  • Snelheid- en performance-problemen wanneer er gebruik wordt gemaakt van code op een shared volume.
  • Eenvoudiger om zero-downtime updates uit te rollen. Pas nadat een nieuwe deployment helemaal goed staat, kan de service worden aangepast om naar een nieuwe deployment te verwijzen. Als er van shared code gebruik wordt gemaakt, heeft een update hiervan ook impact op de draaiende website.
  • Door de code in de containers te plaatsen, is er altijd sprake van volledige releases (inclusief infrastructuur), waardoor versioning en rollbacks ook eenvoudiger zijn.

Database
Je kunt een database opzetten binnen Kubernetes en deze via een shared volume beschikbaar maken voor meerdere containers. Shared volumes staan er om bekend dat ze niet altijd even stabiel zijn wanneer er sprake is van veel lees- en schrijfacties (zoals bij een database het geval is). Wij kiezen er daarom vooralsnog voor om databases als een service af te nemen. Dit vanwege de betere schaalbaarheid, stabiliteit, geautomatiseerde backups, en garanties op uptime die bij een database als service zijn inbegrepen.

CDN
Je applicatie gebruikt assets en resources (bijvoorbeeld afbeeldingen, video’s). Je wilt deze resources zo efficiënt mogelijk in kunnen zetten, over meerdere containers. Hiervoor wordt een CDN (Content Delivery Network) gebruikt. Hier zijn diverse mogelijkheden voor, maar in de basis komt het altijd op hetzelfde neer: er wordt geprobeerd om data op te halen vanuit het CDN en wanneer deze niet bestaat, wordt deze gegenereerd en daarna naar het CDN gepusht. Andere containers hoeven hierdoor niet opnieuw deze assets te genereren, waardoor de applicatie beter schaalbaar is. Het gebruik van een CDN-achtige oplossing is een must voor een schaalbare Kubernetes-applicatie, zeker wanneer er gebruik wordt gemaakt van asset-heavy applicaties als WordPress of Drupal.

Shared File Storage
Op het moment van schrijven is het nog onduidelijk hoe het onderdeel van shared files binnen Kubernetes gaat worden aangepakt. Het realtime lezen/schrijven van gedeelde bestanden is complex. Zeker met grote hoeveelheden containers die dit gelijktijdig willen doen kan dit voor problemen zorgen. Het is dus een uitdaging waar wij binnen Kubernetes nog verschillende opties in onderzoeken. Daar zullen we in een volgend blog zeker dieper op in gaan.

Kubernetes is “here to stay” en zit boordevol mogelijkheden. Een infrastructuur gebouwd op containers en georkestreerd met Kubernetes is super krachtig, schaalbaar, redundant en efficiënt. De ontwikkelaar of IT-beheerder die zich volledig wil laten gaan met zijn containers, kan met Kubernetes zijn hart ophalen.

Wij gaan er in ieder geval zeker mee door. Door het schrijven van deze blogs zullen we je op de hoogte houden van de laatste ontwikkelingen en de ervaring die wij daarmee opdoen. Heb je tussendoor al vragen en/of wil je dieper de inhoud in? Laat het ons weten, vinden we leuk!

Medewerker foto
DevOps Engineer Martin Dieleman

Martin is een aardige gast: enthousiast, gedreven, informeel en communicatief. Voor complexe DevOps vraagstukken is hij je man. Hij is dol op muziek – zowel als stille luisteraar op de bank als tijdens festivals – en gezelligheid. Een biertje met collega’s slaat hij niet af!

Over Martin Dieleman