K3s… Weer een buzzword of best in class Kubernetes distributie voor lokale development?
In deze blogpost onderzoek ik een nieuwe technologie die mijn samenwerkingsgroep kan gebruiken tijdens een tweeweeks DevOps project. Dit doe ik door een blog te schrijven met een 'hands on' karakter.
Deze blog bevat daarom configuratie en code en zorgt ervoor dat medestudenten hiermee aan de slag kunnen. Op basis van de AIM-methodekaarten beantwoord ik een hoofdvraag uit. Voor het beantwoorden van de deelvragen maak ik gebruik van drie onderzoeksgebieden: bibliotheek, veld en werkplaats.
De hoofdvraag van mijn onderzoek is:
Hoe kunnen de Ingress en LoadBalancer resources in K3s effectief worden ingezet binnen een tweeweeks DevOps project op een lokaal development cluster?
Per deelvraag geef ik aan welke onderzoeksmethode ik ga gebruiken. Ook motiveer ik waarom ik voor die onderzoeksmethode heb gekozen.
-
Deelvraag 1: Wat is K3s, en waarin verschilt dit met de standaard Kubernetes distributie? Voor het beantwoorden van deze vraag voor ik een Literature Study (HBO-i, 2021) uit. Op internet is veel informatie over K3s te vinden in de vorm van blogs en documentatie. Deze informatie kan ik goed gebruiken om een antwoord te geven op deze deelvraag.
-
Deelvraag 2: Welk besturingssysteem gebruikt mijn samenwerkingsgroep en hoe installeer je daar K3s op? Om deze vraag te beantwoorden voer ik eerst een kleine Survey (HBO-i, 2021) uit. Ik wil namelijk dat deze vraag zo beantwoord wordt dat hij relevant is voor mijn samenwerkingsgroep. Praktische voorbeelden voor Linux terwijl de samenwerkingsgroep Windows gebruikt is onwenselijk.
-
Deelvraag 3: Op welke wijze kan een applicatie, draaiend in een K3s cluster, opengesteld worden zodat verbinding van buitenaf mogelijk is? Voor deze deelvraag voer ik een werkplaats onderzoek uit. Ik heb gekozen voor de Prototyping methode (HBO-i, 2021). Dit zal een zeer praktisch hoofdstuk worden waarin ik aan de hand van een prototype aantoon hoe verbinding van buitenaf mogelijk is. Op dit prototype kan verder gebouwd worden in het twee weken durend DevOps project.
Ik heb voor K3s gekozen omdat deze technologie in het verlengde ligt van Kubernetes gebruikt in lesweek 4 – Orchestration. Ik merkte van studenten om mij heen dat ze het gebruiken van een LoadBalancer en Ingress lastig vonden. Uit vorige ervaring wist ik dat K3s het gebruik van een LoadBalancer en Ingress makkelijk maakt. Door het schrijven van deze blog hoop ik mijn medestudenten te overtuigen K3s toe te passen als lokaal development cluster binnen een klein DevOps project.
Ik heb variëteit in de onderzoeksmethodes gezocht om zo de kwaliteit van het onderzoek te verhogen. Door eerst online materiaal te bestuderen, daarna een enquête af te nemen en dan pas een prototype te bouwen kan ik het onderzoek zo relevant mogelijk opstellen. Mijn mix van onderzoeksmethodes past het meest bij het “Choose fitting technology” pattern (HBO-i, 2021).
Aan het eind van deze blog weet je wat K3s is en heb je een K3s cluster draaiend op Windows of MacOs. Binnen dit cluster maak je gebruik van een LoadBalancer en Ingress om naar containers te verbinden.
Relatie tussen K3s en Kubernetes
K3s is een lichtgewicht en door de CNCF gecertificeerde Kubernetes distributie. Deze is productieklaar, gemakkelijk om te installeren en komt in een binary van minder dan 100 MB. De ontwikkelaars van K3S geven aan dat het geweldig werkt voor Internet of Things, Continuous Integration, Development en op ARM gebaseerde devices (k3s-io, 2021). Om dit te bereiken hebben de ontwikkelaars een aantal wijzingen aangebracht, hieronder een opsomming van de belangrijkste.
- Het is verpakt in één binary.
- Het voegt ondersteuning toe voor sqlite3, MySQL en Postgres als default storage backend.
- Het heeft minimale tot geen OS-afhankelijkheden.
- Storage drivers zijn verwijderd.
- Cloud provider drivers zijn verwijderd.
Doordat het een lichtgewichte Kubernetes distributie is kun je deze gebruiken op minder krachtige hardware zoals een Raspberry Pi (Roy, 2021). Met de standaard Kubernetes zou dit niet mogelijk zijn vanwege zijn grote voetafdruk voor zowel geheugen als CPU (Boyd, 2021). Om het geheugengebruik in K3s te verminderen worden alle componenten, voor een Kubernetes cluster, in één proces uitgevoerd. K3s is daarom ook geschikt als development cluster omdat het snel en eenvoudig op te zetten is en weinig resources op je laptop gebruikt. K3s levert daarbij add-ons met standaardinstellingen die ervoor zorgen dat het cluster “out of the box” gebruikt kan worden (Boyd, 2021). Als je dit vergelijkt met Kubernetes ben je zelf verantwoordelijk om dependencies te installeren. Om gebruik te maken van een LoadBalancer ben je met de standaard Kubernetes afhankelijk van een Cloud Provider. K3s bundelt Klipper-lb als ingebouwde LoadBalancer provider. Ook wordt Traefik meegeleverd als Ingress provider. Iets wat in de standaard Kubernetes niet aanwezig is (k3s-io, 2021).
Installeren van K3s en het opzetten van een cluster
Ik heb eerst onderzocht welke besturingssystemen de studenten in mijn samenwerkingsgroep gebruiken. Ik heb de opties Windows, MacOs en Linux in een enquête verstuurd. De enquête heb ik zelf ook ingevuld zodat er compleet beeld ontstaat. In de tabel onder deze tekst staan de resultaten. Drie studenten gebruiken Windows en één student MacOs. Aan de hand van deze resultaten heb ik besloten om te zoeken naar een manier om K3s te installeren voor zowel Windows als MacOs gebruikers.
Besturingssysteem | Aantal gebruikers |
---|---|
Windows | 3 |
MacOs | 1 |
Linux | 0 |
De installatiestappen op de officiële K3s website geven aan dat K3s op elke moderne Linux distributie geïnstalleerd kan worden (Rancher, 2021). Echter is Windows geen Linux distributie dus heb ik gezocht naar een vervangende oplossing. Via de blogpost van Jason Yee (Yee, 2020) en de officiële K3s documentatie ben ik bij k3d uitgekomen (Rancher, 2021). K3d is een wrapper om K3s heen zodat het in Docker containers gedraaid kan worden. De enige requirements zijn Docker en kubectl (“K3d”, 2021). Deze dependencies kunnen op zowel Windows als MacOs geïnstalleerd worden. Om k3d op MacOs te installeren moet je het commando brew install k3d
uitvoeren. Op Windows maak je gebruik van chocolatey. Door het commando choco install k3d
uit te voeren wordt k3d op Windows geïnstalleerd. Alle commando’s die volgen in deze blog kunnen op zowel Windows als MacOs uitgevoerd worden in de terminal.
Je eerste K3s cluster
Nu we K3d geïnstalleerd hebben kunnen we ons eerste cluster aanmaken. Dit doen we door gebruik te maken van het commando k3d cluster create <clusternaam>
. Ik kies ervoor om “mijncluster” als naam te gebruiken. Door het volgende commando uit te voeren wordt een K3s cluster met één node aangemaakt: k3d cluster create mijncluster
.
Als we daarna kubectl get nodes
uitvoeren krijgen we te zien dat ons cluster uit één node bestaat.
Om te demonstreren dat K3s ook met meerdere nodes werkt gaan we een cluster aanmaken met drie nodes. We gebruiken hetzelfde create commando als eerst maar geven nu één extra optie mee. Verwijder eerst de zojuist aangemaakt cluster door het volgende commando uit te voeren: k3d cluster delete mijncluster
. Om een cluster aan te maken met 1 server node en 2 agent nodes voer je het volgende commando uit: k3d cluster create mijncluster --agents 2
. Als we nu kubectl get nodes
uitvoeren zien we 2 extra nodes.
Nu we op hoofdlijnen weten wat K3s is en hoe we een cluster aan kunnen maken is het tijd om het cluster daadwerkelijk te gaan gebruiken.
Verbinding maken met een applicatie in K3s.
Om aan te tonen hoe we verbinding kunnen maken met een applicatie draaiend in K3s ga ik een klein prototype bouwen. Stap voor stap beschrijf ik mijn handelingen zodat je zelf ook mee kunt doen. Aan het einde van deze sectie heb je een whoami
(https://hub.docker.com/r/containous/whoami) applicatie geïnstalleerd op je K3s cluster. Deze applicatie kun je bereiken door te navigeren naar whoami.localhost. Hiermee demonstreren we dat de LoadBalancer en Ingress naar behoren werkt. In de afbeeldingen hieronder is de eindsituatie te zien waar we naartoe gaan werken.
We beginnen met het aanmaken van een nieuw cluster. Omdat we nu applicaties in het cluster willen benaderen moeten we het create commando iets aanpassen. Voer het volgende commando uit: k3d cluster create -p "80:80@loadbalancer" mijncluster
. Met de p optie geven we aan dat poort 80 lokaal doorverwijst naar poort 80 op de ingebouwde Klipper-lb (LoadBalancer) van K3s.
Als eerste maken we een nieuwe deployment voor de whoami applicatie. Laten we het aantal replicas op 3 zetten zodat we kunnen verifiëren of de Ingress wisselt tussen de verschillende pods die aangemaakt worden met deze deployment. De deployment krijgt een label whomai zodat we ernaar kunnen verwijzen in de service die we zo dadelijk aanmaken.
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami-container
image: containous/whoami
De volgende stap is het aanmaken van een service. We specifiëren hier dat we een service van het type ClusterIP willen. De pods die we targeten hebben het label app: whoami. Dat hebben we zojuist in de deployment ook gespecificeerd. Als laatst geven aan dat poort 80 doorverwijst naar poort 80 in de pod.
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
type: ClusterIP
ports:
- targetPort: 80
port: 80
selector:
app: whoami
De laatste stap is het configureren van de Ingress. In de spec geven we aan dat we als host whoami.localhost
willen gebruiken. Aan het einde van de spec specificeren we op welke service en poort we aan willen sluiten.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: whoami.localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
Door al deze yaml bestanden uit te voeren zou in theorie de whoami applicatie op whoami.localhost benaderbaar moeten zijn. Laten we dat testen. Als ik in mijn browser navigeer naar whoami.localhost krijg ik een pagina te zien met daarop de hostname van de pod. Wanneer ik de pagina ververs krijg ik een andere hostname te zien. We kunnen dus concluderen dat het prototype werkt en we nu gebruik maken van een LoadBalancer en Ingress om onze whoami applicatie te benaderen.
Hostname bij eerste bezoek. | Hostname na het verversen van de pagina. |
Afsluiting
In deze blog heb ik geschreven dat K3s een lichtgewicht Kubernetes distributie is die “out of the box” direct gebruikt kan worden. Om dit te bewijzen heb ik laten zien hoe je K3s gemakkelijk op MacOs en Windows kan installeren en hoe je effectief gebruik kunt maken van de meegeleverde LoadBalancer en Ingress. Ik ben ervan overtuigd dat we deze technologie in kunnen zetten tijdens het beroepsproduct als lokaal development cluster.
Bronnen
- Yee, J. (2020, 6 december). Kubernetes & Rancher 2.5 on a Win 10 laptop with k3d & k3s to deploy nginx locally. Geraadpleegd op 6 oktober 2021 van https://itnext.io/kubernetes-rancher-2-5-on-your-windows-10-laptop-with-k3d-and-k3s-7404f288342f
- k3s-io. (2021, 12 juli). GitHub - k3s-io/k3s: Lightweight Kubernetes. Geraadpleegd op 6 oktober 2021 van https://github.com/k3s-io/k3s
- HBO-i. (2021, 2 juli). ICT research methods. Geraadpleegd op 6 oktober 2021 van https://ictresearchmethods.nl
- Roy, H. (2021, 23 september). K8s vs k3s: The Comprehensive Difference. Geraadpleegd op 6 oktober 2021 van https://www.p3r.one/k8s-vs-k3s
- Boyd, W. (2021, 17 juni). 5 Reasons to Use K3s. Geraadpleegd op 6 oktober 2021 van https://acloudguru.com/blog/engineering/5-reasons-to-use-k3s
- Rancher. (2021, 9 augustus). K3s - Lightweight Kubernetes. Geraadpleegd op 6 oktober 2021 van https://rancher.com/docs/k3s/latest/en/
- K3d. (2021, 17 september). Geraadpleegd op 6 oktober 2021 van https://k3d.io/v5.0.0