Scripten/programmeren in Kubernetes

Scripten en programmeren kan je in veel talen maken. In mijn vorige artikel had ik het over Python Er zijn veel argumenten om juist niet of wel voor een taal te kiezen. De wereld van programmeer/scripttalen is groot en het landschap verandert. Aan de keuze voor Python ging in ons team een discussie vooraf die in dat artikel niet besproken is. In dit artikel neem ik je mee in de besluitvorming. Je ziet dat de keuze voor de “beste” taal zowel op technische als culturele argumenten gebaseerd is en vervolgens ook nog sterk afhankelijk is van de use case.

Eigenschappen van talen

Zoveel talen, zoveel verschillen. Ondanks hun verschillen zijn er globaal 2 groepen te vinden:
programmeertalen en scripttalen. Daarnaast concentreren de talen zich vaak op een bepaald doel. Zo heb low level talen als Assembly en high level talen als JAVA. De focus van zo’n taal verschilt vaak ook. Is de taal goed voor html frontends of juist in middleware taken? Los van de focus zijn sommige talen ook afhankelijk van een aanwezige runtime, binaries of libararies waar anderen volledig zelfstandig kunnen opereren als single binary. Tot slot is performance ook belangrijk. Waar vooraf gecompileerde talen over het algemeen beter presteren omdat er in runtime geen beslissingen genomen hoeven te worden, zullen scripttalen doorgaans iets trager zijn.

Je voelt aankomen dat met deze beschreven eigenschappen er grote verschillen zijn in performance, eenvoud bij lezen/schrijven, portabiliteit, de footprint op de resources en security. Bij het maken van een keuze is niet alleen de use case maar ook de achtergrond van je team belangrijk. Kubernetes is op zichzelf complex. Voor een operations team zal er mogelijk meer affiniteit zijn met de scripttalen, waar een team van developers zich mogelijk beter thuis voelt bij de echte programmeertalen.

Integratie met Kubernetes

Hoewel je in Kubernetes vrij bent in de keuze van je taal waarin je de workloads wil uitvoeren, zijn er naast eerder genoemde eigenschappen nog meer dingen om rekening mee te houden.

Images
Je applicatie staat op een docker image. Over het algemeen is te zeggen dat het goed is om te streven naar een zo klein mogelijk image. Wat niet op het image staat, kan ook niets fout doen. Bedenk dat als je bijvoorbeeld Python gebruikt, de python runtime en mogelijk pip modules aanwezig zijn om de uitvoering van je script mogelijk te maken. Naast dat dit soms relatief veel schijfruimte kost kan een kwaadwillende met shell access tot de container eigen python code inladen. In het geval er slechts 1 binary aan een alpine image toegevoegd wordt zoals vaak met Go het geval is, zul je zien dat je image klein blijft en het risico op misbruik beperkter is.

Integratie met Opentracing
In Kubernetes heb je te maken met gedistribueerde workloads. Je weet niet op welke worker node je applicatie draait. Als het goed gaat maakt dit niet zo veel uit. De ervaring leert dat dit niet altijd het geval is. Kies een programmeertaal die goed integreert met Jaeger en het Opentracing framework: https://opentracing.io en https://www.jaegertracing.io . in een eerder artikel kwam dit aan bod: https://denit.nl/media/technische-blogs/tracing-met-jaeger/ . Debuggen is een stuk eenvoudiger op deze manier.

De beste keuze

De te gebruiken programmeertaal voor je project is afhankelijk van veel zaken. Naast alle technische argumenten is het ook belangrijk om te kijken naar het team. Go lijkt in Kubernetes de ideale taal te zijn. Doordat de binaries gelijk alle afhankelijkheden bevatten wordt het image slechts vergroot met 1 file. Het is echter ook fijn dat het geen one man show wordt. Zowel aan de beheer als ontwikeklkant moet collega’s ermee kunnen werken. Daarnaast is de grootte van een image of performance niet altijd belangrijk. Kijk goed welk probleem je wil oplossen met het programmeren. Hou in de gaten wie er mee moet werken en bespreek het met je team. De technisch hipste taal is leuk maar een team dat er mee kan werken is misschien wel handiger.

 

Auteur: Geurt Hakfoort – Cloud Specialist Denit