
Bouw je eigen Python Kubernetes operator
Ja, je leest het goed – we gaan een K8s operator in Python bouwen! Vaak volgen reacties zoals: "Maar moet het niet in Golang?" Gelukkig is dat niet nodig als je een voorkeur hebt voor Python. Laat ons je daarom door deze how-to leiden, zodat je je eigen operator kunt bouwen.

Waarom een operator gebruiken?
Een operator is als een slimme assistent die de complexiteit van je Kubernetes-cluster begrijpt en specifieke taken kan automatiseren. Het stelt je in staat om aangepaste automatisering voor je (custom) applicaties te creëren, waardoor handmatige interventie wordt geminimaliseerd.
De kracht van een operator ligt in het vermogen om zelfstandig taken uit te voeren zoals schaalbaarheid, onderhoud en zelfherstel. Dit verhoogt de efficiëntie en minimaliseert fouten.
Hoewel sommige taken kunnen worden uitgevoerd met deployments, et cetera, als je op zoek bent naar extra logica, is een operator een uitstekende keuze.
Automatiseren op Kubernetes maakt het leven op de lange termijn een stuk gemakkelijker voor je team.
Laten we beginnen
Nu we weten dat je een operator in Python kunt bouwen en ook snappen waarom dat handig is, kunnen we beginnen met het bouwen van een operator.
De operator is een lichtgewicht monitoring-tool die de status van pods en containers controleert. Als er iets mis is, stuurt het een Teams-bericht naar je MS Teams-kanaal. Beschouw dit als een tool voor scenario's waar Grafana of andere monitoring-tools misschien overkill zijn voor jouw project.
We gaan ervan uit dat je enigszins bekend bent met Python, maar laten we vanaf het begin beginnen.
CODE
# Creating a folder
mkdir fullstaq-operator
Een venv maken om de Python-versie en packages te controleren en te beperken.



In config.py gebruiken we het om omgevingsvariabelen te laden en een logging-functie op te zetten, waardoor je niet steeds opnieuw hoeft te definiëren. Het lijkt nu misschien een beetje overkill, maar er een gewoonte van maken loont zich.

We maken een Config
class waarin de benodigde omgevingsvariabelen voor onze operator worden geplaatst. Als je niet alles in één keer weet, kun je later extra details toevoegen.
Vervolgens gaan we naar logging. Een statische methode in Python is een speciaal type methode in een klasse die geen impliciete referentie naar het object (de klasse-instantie) ontvangt wanneer deze wordt aangeroepen. In plaats daarvan gedraagt het zich als een reguliere functie die aan de klasse is gekoppeld en kan worden aangeroepen zonder een instantie van de klasse te maken.
Dit is ook zo gedaan met de cluster. Je kunt het in Config plaatsen zonder een statische methode, maar in dit geval is ervoor gekozen om het gescheiden te houden om te voorkomen dat de hele klasse herhaaldelijk wordt aangeroepen.
Laten we nu doorgaan naar ons hoofdscript waar we deze waarden kunnen oppakken en gebruiken.

Bovenaan beginnend, importeer de benodigde bibliotheken. Stel daarnaast de logger in vanuit Config.py
en stel vervolgens de cluster in. Kies de cluster die je wilt gebruiken, vooral voor lokale ontwikkeling waar je mogelijk meerdere clusters in je context hebt.
Vervolgens heb je kubeconfig
, waarmee je de operator lokaal kunt draaien voor testen en in je cluster. Dit bespaart je de moeite van het herbouwen of opzetten van een lokale cluster voor testen. Je kunt nu elke willekeurige cluster online/offline gebruiken om je script te testen.
Laten we nu duiken in functies om pods te inspecteren, onderverdeeld in drie variaties: namespace, label of het hele cluster. Je kunt de reikwijdte van onze monitoring-tool bepalen met een omgevingsvariabele.

In de volgende stap maken we een functie om te bepalen welke actie we moeten ondernemen wanneer we merken dat een pod of container niet werkt. <Br><br>
<img src="https://objectstore.true.nl/truesite:truefullstaq-com/09/build-python-kubernetes-operator-7.webp" alt="Python Kubernetes Operator afbeelding" width="100%" height="auto">
We kijken naar de pods, en in de tweede lus kijken we naar de mislukte containers, gedefinieerd in een andere functie.
In handle_failed_pods
definiëren we hoe we een verzoek naar het Teams-kanaal kunnen doen.

Definieer waar we naar zoeken in de containers in de pod. Maak vervolgens een functie om de reikwijdte van onze operator te bepalen.

Nu beginnen we met de kopf component. kopf is een operator-framework met decorators die je kunt gebruiken voor operator-taken. We maken er twee – één bij het opstarten om de gedefinieerde taken te starten wanneer de executable draait in de pod, en een andere op een timer om taken op specifieke intervallen uit te voeren.
Laten we nu een Dockerfile maken. Het is een eenvoudige Dockerfile die we vaak gebruiken voor Python-gebaseerde zijprojecten.

Er wordt een werkmap gemaakt, de juiste scripts worden gekopieerd en vereisten worden gedownload. Er zijn geen commando's. Je kunt die meestal in de yaml plaatsen. Wanneer je meerdere scripts in één zijproject hebt, en je wilt ze per container draaien, heb je meestal maar één dockerfile nodig.
Nu kunnen we beginnen met de YAML-bestanden om te deployen en de nodige rechten te verschaffen.

Het gaat hier om een deployment waarin je de waarden kunt invullen die nodig zijn om de K8s-operator te draaien.
De deployment is eenvoudig; de service-account is benoemd, en we definiëren de omgevingsvariabelen. Met deze setup zijn de variabelen geen secrets. Als je dit in een productieomgeving draait, is het raadzaam om secrets te gebruiken.
Nu hebben we een service-account, een binding en de rechten voor de service-account nodig. Deze rechten zijn nodig om de pods te monitoren; anders zal de operator niet werken.

Nu je alle YAML's hebt, kun je de Docker-image bouwen en deployen met behulp van de YAML's. Je lichtgewicht monitoring-tool is nu gedeployed.
Voel je vrij om te forken en het te gebruiken volgens je behoeften. Veel succes!
TL;DR
Je hebt geleerd hoe je een eenvoudige K8s-operator kunt maken en deployen.
Wat kun je toevoegen om de operator volwassener te maken?
- Voeg waarden toe als secrets
- Maak een Helm-chart
- Maak de code volwassener, bijv. door de kubeconfig in config.py te plaatsen
- Voeg tests toe 😉