Attendere...
Una delle insidie più nascoste quando si lavora in ambito Kubernetes riguarda il corretto dimensionamento, in termini di utilizzo di CPU e memoria, dei POD applicativi.
Molto spesso tale tematica viene sottovalutata e si tende a dare poca importanza all’assegnazione delle risorse ai container.
In questo breve articolo cercheremo di dare delle nozioni utili alla comprensione del problema e dei suggerimenti su come operare e come accorgersi tempestivamente se stiamo andando nella direzione sbagliata.
Requests e Limits: cosa sono?
In Kubernetes, i "Limits" sono definiti come la quantità massima di una risorsa che può essere utilizzata da un container. Questo significa che il contenitore non può mai consumare più della quantità di memoria o CPU indicata.
D'altra parte, le "Requests" sono la quantità minima garantita di una risorsa riservata per un container.
Un esempio pratico
Prendiamo ad esempio il seguente deployment:
Possiamo dedurne quanto segue:
Precisazioni sullo scheduling dei POD
Kubernetes definisce le requests come una quantità minima garantita di una risorsa.
Quando un POD viene programmato, il kube-scheduler verifica le requests di Kubernetes per assegnarlo a un particolare Nodo che possa soddisfare almeno quella quantità per tutti i container presenti nel POD. Se l'importo richiesto è superiore alla risorsa disponibile, il POD non verrà mandato in esecuzione e rimarrà in stato di "Pending" (in attesa).
Kubernetes definisce i limits come la quantità massima di una risorsa che può essere utilizzata da un container, ciò significa che non può mai consumare più della quantità di memoria o CPU indicata come limite.
Tuttavia, occorre fare distinzione nel comportamento tra CPU e memoria.
La CPU è una risorsa comprimibile, il che significa che può essere estesa per soddisfare tutta la domanda. Nel caso in cui i processi richiedano troppa CPU, alcuni di essi verranno rallentati (throttled).
A differenza della CPU, la memoria non può essere condivisa o estesa per soddisfare tutte le richieste in modo dinamico. Se la memoria disponibile sul nodo del cluster Kubernetes è insufficiente per soddisfare tutte le richieste dei processi in esecuzione, alcuni di essi verranno terminati. Il processo terminato a causa di mancanza di memoria verrà segnalato come "OOM killed", dove "OOM" sta per "Out of Memory".
Performance
Il corretto utilizzo e dimensionamento di requests e limits non solo è importante per la salute del cluster Kubernetes, ma influisce tantissimo anche sul concetto di performance.
Kubernetes classifica i POD che vengono eseguiti e assegna a ciascuno una specifica classe di livello di servizio (QoS - Quality of Service). Kubernetes utilizza questa classificazione per influenzare come vengono gestiti i diversi POD. La classificazione avviene in base alle richieste di risorse dei container, insieme a come queste richieste sono correlate ai limiti di risorse.
Esistono le seguenti classi QoS, in ordine decrescente di priorità:
Molto spesso si vedono POD senza valori di soglia specificati, quindi in classe BestEffort, con la speranza che utilizzino tutte le risorse disponibili del nodo e che quindi vadano “più forte”. In realtà in ambiente produttivi a medio/alta densità questa si rivela una falsa speranza, perché saranno POD instabili che potranno essere “sacrificati” in qualsiasi momento.
Come scegliere Requests e Limits
Non esiste un vero e proprio algoritmo matematico agnostico per la scelta di valori corretti. Tuttavia, ci si può basare sull’esperienza, alcune best practice e strumenti che possono aiutare nell’osservazione dei consumi.
Riguardo quest’ultimo punto, è bene sottolineare come l’utilizzo all’interno della propria architettura infrastrutturale di un adeguato strumento di monitoraggio e osservabilità semplifichi enormemente la scelta corretta di tali parametri.
Solo tramite la costante osservazione delle metriche di consumo di CPU e memoria e il trend degli andamenti nel tempo (andando a storicizzare per esempio picchi di utilizzo) si può essere in grado di avere idee certe e anche andare a scoprire preventivamente e tempestivamente eventuali errori di configurazione di tali soglie.
Strumenti evoluti come Sysdig vanno proprio in questa direzione, abilitando il corretto rightsizing dell’infrastruttura e fornendo uno strumento fondamentale per il troubleshooting sia in ottica di funzionamento operativo che di performance analysis.
Link utili:
Credits: https://sysdig.com/blog/kubernetes-limits-requests/
Via Paolo di Dono, 73
00142 Roma
Piazza Indro Montanelli, 20
20099 Sesto San Giovanni
Via Giovanni Porzio,
Centro Direzionale Isola F/3, SNC
80143 Napoli