bakgrunnseffekt

Planlagt skalering med Kubernetes

Ricco Førgaard

Seniorkonsulent

portrait image decoration

Publisert Torsdag 18. februar 2021
Sist oppdatert Fredag 8. oktober 2021

Når man driver et Kubernetes cluster med mange applikasjoner er det ønskelig å kunne begrense ressursbruken når lasten er lav. Kubernetes har allerede gode verktøy for å få dette til som for eksempel Horizontal Pod Autoscaler.

Når man driver en streamingtjeneste som TV 2 Sumo der profilerte direktesendinger som for eksempel Premier League fotball er en sentral del av innholdet er det ikke alltid at ut-av-boksen skalering gjør en god nok jobb. Ved direktesendinger kommer veldig mange brukere ofte i siste liten og gir en enorm økning i ressursbruk. Autoskalereren bruker som regel litt tid på å vurdere om økningen i trafikk er tilstrekkelig permanent til at den rent faktisk skal skalere opp og skal det først startes en node eller to mere så går tiden. Kunder opplever at tjenesten er nede og blir sure.

En måte å løse problemet på er å skalere opp i forkant. Vi vet når fotballkamper og lignende starter, så det er en smal sak å skalere opp clusteret. Men store sendinger går ofte på kvelden og i helgen og ingen har lyst å logge seg på for å skalere opp. Samtidig er det ikke sikkert at de personene som kan skalere opp er de samme som vet hva som er høyprofilert og populært innhold.

En automatisert løsning

For å få til en mer automatisert løsning på problemet kan man benytte external metrics i Kubernetes. External metrics er en API som gjør det mulig å mate Kubernetes' egen metrics server med måltall og bruke de til skalering i clusteret. Ved å koble external metrics til en datakilde som kan si noe om når man kan forvente høy last på tjenesten blir det mulig å skalere opp i avvente av lasten og skalere ned igjen når det er over. I TV 2 har vi vært med på å implementere en slik løsning basert på Google Calendar. Kalenderen gir et brukergrensesnitt som de fleste kjenner til og som ikke krever særlig kompetanse for å bruke og har samtidig gode APIer som gjør det mulig å hente ut den informasjonen man trenger. Endene knyttes sammen i en egen tjeneste som implementerer external metrics APIet slik at Kubernetes kan bruke informasjonen til skalering.

External metrics kobler man til en Horizontal Pod Autoscaler som man muligvis har i forveien basert på for eksempel CPU-bruk. Utenfor de tidsrommene man trenger oppskalering vil måltallet for vår external metric være såpass lav at den ikke vil påvirke skaleringen. Dermed vil for eksempel CPU-bruk sørge for å skalere tjenesten til et passende nivå.

Oppsummering

Kubernetes tilbyr et ganske enkelt API for å skru sammen slik løsning som passer de behovene man måtte ha. Det kan bidra til en mer robust tjeneste med mindre nedetid og det kan være penger å spare på driften ved å unngå å ha et overprovisjonert cluster for lenge om gangen.