Kubernetes vs serverless: quando scegliere container o funzioni. Guida pratica con pro, contro e casi d'uso per architetti cloud.
Usa Kubernetes** quando servono controllo totale sull'infrastruttura, applicazioni stateful, team con competenze DevOps mature, o necessità di portabilità multi-cloud. Usa le funzioni serverless per carichi di lavoro event-driven, startup che devono scalare rapidamente senza overhead operativo, o microservizi con burst traffic imprevedibili. Non è una scelta binaria: le architetture ibride sono spesso la soluzione più efficace.
Il Momento della Verità: Kubernetes o Serverless?
Tre anni fa ho migrato un sistema di e-commerce per un cliente con 2 milioni di utenti mensili. Il CTO era convinto di dover scegliere una tecnologia e bastava applicarla ovunque. Dopo sei mesi di architettura monolitica su container e tre mesi di refactoring completo, abbiamo scoperto una verità scomoda: la scelta migliore non esiste in assoluto — esiste la scelta giusta per ogni carico di lavoro.
Questo articolo nasce da quel tipo di esperienza diretta. Non troverai solo teorie, ma decisioni che ho preso in produzione, errori che ho pagato in downtime e successi che hanno salvato budget mensili significativi.
Cosa È Kubernetes: L'Orchestrazione dei Container
Kubernetes (spesso abbreviato K8s) è un sistema di orchestrazione dei container nato da un progetto interno di Google (Borg) e rilasciato come open source nel 2015. Oggi è gestito dalla Cloud Native Computing Foundation (CNCF) e rappresenta lo standard de facto per la gestione di applicazioni containerizzate in ambienti enterprise.
Caratteristiche Fondamentali
- Self-healing: Kubernetes riavvia automaticamente i container falliti, sostituisce quelli non rispondenti, e killia quelli che non rispettano le policy di salute configurate
- Auto-scaling: Horizontal Pod Autoscaler (HPA), Vertical Pod Autoscaler (VPA), e Cluster Autoscaler permettono di scalare in base a metriche custom
- Service discovery: DNS interno e load balancing integrato tra i pod
- Rolling updates: Aggiornamenti senza downtime con strategie come Rolling, Blue-Green, o Canary
- Storage orchestration: Supporto nativo per volumi persistenti su AWS EBS, Azure Disk, Google PD, NFS, e oltre 50 plugin CSI
Varianti Managed e Self-Hosted
| Piattaforma | Servizio | Versione K8s | SLA Minimo |
|---|---|---|---|
| AWS | EKS (Elastic Kubernetes Service) | 1.28 | 99.95% |
| Azure | AKS (Azure Kubernetes Service) | 1.28 | 99.95% |
| GCP | GKE Standard/AutoPilot | 1.28 | 99.95% |
| Oracle Cloud | OKE (Oracle Kubernetes Engine) | 1.27 | 99.99% |
I costi variano: EKS addebita $0.10 per ora per ogni cluster più $0.10/GB per storage EBS gestito. GKE AutoPilot elimina la gestione dei nodi ma aggiunge un premium del 30-40% sui compute costs. La scelta tra managed e self-hosted dipende dal trade-off tra controllo e operazioni: con un cluster self-hosted su AWS EC2 (istanze m5.xlarge a $0.192/ora) risparmi il markup managed ma gestisci upgrade, security patches, e availability yourself.
Cosa È il Serverless: Le Funzioni come Unità di Calcolo
Le funzioni serverless rappresentano un paradigma in cui il cloud provider gestisce completamente l'infrastruttura sottostante. Sviluppatori scrivono funzioni atomiche che vengono eseguite on-demand, scalando automaticamente da zero a milioni di istanze in millisecondi. Non si pagano server idle, solo il tempo di esecuzione effettivo.
I Principali Attori del Serverless
- AWS Lambda: Pioneer del settore, supporta Node.js, Python, Go, Java, Ruby, .NET, e runtime custom. Limiti: 15 minuti max per esecuzione, 10GB di memoria, 1000 esecuzioni concorrenti (soft limit)
- Azure Functions: Eco-sistema integrate con Logic Apps, Durable Functions per workflow stateful, e binding con oltre 200 servizi Azure
- Google Cloud Functions (Gen2): Basato su Cloud Run, offre scaling più prevedibile e cold start inferiori rispetto a Lambda
- Oracle Cloud Functions: Basato on Fn Project open source, ideale per chi usa OCI e vuole vendor lock-in minimo
Il Modello di Costo Reale
AWS Lambdapricing è spesso frainteso. Il calcolo base:
- Prime 400.000 GB-secondi/mese: gratuiti
- Prime 400.000 secondi/mese: gratuiti
- Oltre: $0.0000166667 per GB-secondo, $0.20 per milione di richieste
Per una funzione Node.js con 512MB che gira 100ms per richiesta, servono 100.000 richieste giornaliere per spendere circa $1/mese. Ma attenzione: cold start possono aggiungere 100-500ms di latenza, e per workload con traffico consistente (>100 req/sec costante) Lambda diventa più costoso di container预留 (reserved instances).
Kubernetes vs Serverless: Il Confronto Diretto
1. Curva di Apprendimento e Onboarding
Kubernetes richiede settimane per padronanza base, mesi per competenza avanzata. Devo essere onesto: ho visto team enterprise fallire miseramente con K8s perché hanno sottovalutato la complessità. Servono competenze su networking CNI (Calico, Cilium, Flannel), storage CSI, RBAC, Helm charts, operator patterns, e monitoring con Prometheus/Grafana.
Serverless ha una curva molto più dolce. Una Function as a Service (FaaS) può essere deployata in 15 minuti da uno sviluppatore senza esperienza cloud. Questo è il principale vantaggio: democratizza l'accesso al cloud per team piccoli o startup.
2. Performance e Latenza
I container Kubernetes su node dedicato offrono latenza prevedibile nell'ordine dei millisecondi. Per un'API REST tipica: 5-20ms di processing time, indipendentemente dal carico.
Le funzioni serverless soffrono di cold start: la prima invocazione dopo inattività (5-30 minuti) può impiegare 200ms-2 secondi per inizializzare il runtime. Per AWS Lambda con Java, ho misurato cold start di 3-8 secondi su funzioni con 1GB di memoria. Soluzioni esistono (provisioned concurrency su Lambda, warm-up schedulato su Azure), ma aggiungono complessità e costo.
Benchmark reale (test interno su API gateway + microservizio):
| Runtime | Latenza P50 | Latenza P99 | Cold Start |
|---|---|---|---|
| Container K8s (Node.js) | 12ms | 45ms | N/A |
| Lambda Node.js (512MB) | 8ms | 28ms | 180ms |
| Lambda Java (1GB) | 15ms | 120ms | 4.2s |
| Cloud Run (Node.js) | 15ms | 60ms | 800ms |
3. Costo Totale di Proprietà (TCO)
Qui la narrativa "serverless = risparmio" si scontra con la realtà dei numeri.
Per un workload con picchi medi di 100 req/sec e burst fino a 500 req/sec:
- Lambda: ~$450/mese (calcolo basato su pricing AWS, 24/7 workload)
- EKS + Auto Scaling: ~$280/mese (3 nodi m5.large on-demand, scaling da 1 a 6 nodi)
- EKS + Spot Instances: ~$120/mese (mix on-demand per baseline + spot per burst)
Il serverless vince economicamente per workload sporadici o con bassa media: se la tua funzione Lambda gira in media 5 minuti al giorno, il costo è trascurabile rispetto al mantenere un container sempre attivo.
4. Vendor Lock-in e Portabilità
Kubernetes offre la massima portabilità. Un cluster ben strutturato su EKS può essere migrato ad AKS o GKE con modifiche minime usando Helm o Kustomize. La portabilità multi-cloud è il principale argomento per K8s in architetture enterprise.
Serverless introduce lock-in significativo. Le Lambda usano API proprietarie AWS, trigger specifici (S3 events, DynamoDB streams, SQS polling), e extension patterns non trasferibili. Azure Functions sono più portable grazie a Open Function Interface, ma richiedono comunque refactoring per migrare tra cloud provider.
Quando Usare Kubernetes: Casi d'Uso Consigliati
1. Applicazioni con Stato (Stateful)
Se la tua applicazione usa database, file system locali, o connessioni long-lived, i container sono quasi sempre la scelta migliore. StatefulSets su Kubernetes gestiscono volumi persistenti con ordinalità, while serverless functions sono intrinsecamente stateless per design.
Esempio reale: Ho migrato un sistema di video transcoding che richiedeva accesso a filesystem condivisi (NFS) e mantenimento di cache locali. Su Lambda era impossibile; su Kubernetes con StatefulSet e PV NFS-backed, funziona perfettamente con 40% di costi inferiori vs ECS.
2. Requisiti di Latenza Stretta
Per sistemi che richiedono latenza sub-50ms con jitter minimo, i container su node dedicati battono serverless. Trading systems, gaming backends, IoT processing real-time: qui i cold start sono inaccettabili.
3. Team con Competenze DevOps Mature
Se il tuo team ha già esperienza con containerization, CI/CD basato su GitOps (ArgoCD, Flux), e monitoraggio cloud-native, Kubernetes massimizza la loro produttività. Non sottovalutare l'overhead operativo: un cluster K8s richiede almeno 0.5 FTE dedicato per gestione, upgrade, e troubleshooting.
4. Architetture Microservizi Complesse
Per sistemi con decine di microservizi che comunicano tra loro, Kubernetes service mesh (Istio, Linkerd) offre observability, circuit breaking, retry policies, e mTLS automatico che serverless platforms non possono eguagliare.
5. Cost Optimization a Lungo Termine
Per workload permanenti con utilizzo consistente >40%, i container con reserved instances o spot rappresentano l'opzione più economica. Calcola il break-even point: se il workload supera il 60% della capacità costante, i container battono serverless economicamente.
Quando Usare Serverless: Casi d'Uso Consigliati
1. Carichi di Lavoro Event-Driven
Elaborazione di eventi S3, trigger su DynamoDB, code SQS, webhook processing: le funzioni serverless eccellono quando la logica è triggered da eventi esterni con volume variabile.
Caso d'uso tipico: pipeline di image processing. Un'upload su S3 triggera una Lambda che genera thumbnail, watermarks, e metadati. Con 1000 immagini/giorno costi quasi zero; con 1 milione, scalabilità automatica senza provisioning.
2. Batch Processing Intermittente
Job che girano poche volte al giorno, come report generation, data aggregation, o ETL notturno. Lambda pricing al secondo significa pagare solo i secondi effettivi di esecuzione, non ore-machine idle.
3. API per Mobile e Web con Traffico Variabile
Backend mobile con utenti concentrati in fasce orarie specifiche (es. app di food delivery con picchi a meal times). Lambda o Cloud Functions scalano a zero fuori orario, eliminando costi notturni.
4. Sperimentazione e MVP Rapidi
Per prototipare nuove feature senza compromettere l'architettura esistente. Una Lambda può essere deployata in 10 minuti, testata, e deprecata senza lasciare infrastruttura dangling.
5. Background Tasks Non Critici
Logging aggregation, analytics event processing, notification delivery: task che non devono bloccare il flusso principale dell'applicazione e dove latenza elevata è accettabile.
L'Approccio Ibrido: Best of Both Worlds
La decisione binaria tra Kubernetes vs serverless è spesso un false dichotomy. Architetture ibride che combinano entrambi sono la norma in produzione enterprise.
Pattern Comuni di Integrazione
- EKS + Lambda per eventi: Cluster Kubernetes per applicazioni core con Lambda per task asincroni, webhook processing, e background jobs
- Kubernetes come target per deployment: K8s gestisce il deploy e scaling dei container; serverless functions gestiscono la logica trigger-based
- Knative (K8s-based serverless): Platform come Google Cloud Run on GKE, o AWS EKS con Kpack/Knative, offrono auto-scaling to-zero su container K8s — il meglio di entrambi i mondi ma con complessità aggiuntiva
Esempio Architettura Ibrida Reale
Per un marketplace B2B che ho progettato:
- Kubernetes (EKS): Core API (Spring Boot), payment processing, order management, inventory service
- Lambda: Image optimization, email notification, webhook per integration partner, scheduled report generation
- SQS + Lambda: Queue-based processing per batch di transazioni
Questa architettura costa il 35% in meno vs soluzione pure container e offre latenza del core system sotto 30ms vs cold start unpredictibili.
Criteri di Decisione Pratici
Usa questa checklist per la tua decisione:
Scegli Kubernetes se:
- Latenza <50ms con jitter minimo è requisito hard
- Applicazione stateful con database o filesystem
- Team DevOps con esperienza container/K8s
- Workload 24/7 con utilizzo medio >40%
- Necessità di portabilità multi-cloud reale
- Sistema complesso con decine di microservizi interagenti
Scegli Serverless se:
- Latenza non critica (webhook, async processing)
- Traffico burst o sporadico
- Budget limitato per OPS
- Necessità di time-to-market ultraveloce
- Task specifici e circoscritte (image processing, notifications)
- Team small senza competenze infrastructure
Scegli l'approccio ibrido se:
- Applicazione monolitica in fase di graduale decomposizione
- Mix di workload real-time e batch
- Budget OPS limitato ma requisiti performance stringenti per subset di servizi
Errori Comuni da Evitare
1. "Riscrivo tutto in Lambda per risparmiare"
Ho visto refactoring costare $200.000 in engineering e risultare in sistema più lento e più costoso. Serverless non è drop-in replacement per ogni workload.
2. Sottovalutare il Vendor Lock-in
Lambda functions con centinaia di dipendenze AWS-specifiche sono costose da estrarre. Valuta il lock-in prima di impegnarti profondamente.
3. Kubernetes senza Exit Strategy
Deployare su K8s senza comprendere operations e upgrade path porta a cluster abbandonati con security vulnerabilities. Ogni cluster EKS richiede patching costante: ho visto cluster non aggiornati per 18 mesi con CVE critiche non patched.
4. Ignorare i Costi Nascosti di Serverless
I costi Lambda sembrano bassi per funzioni singole, ma con orchestration (Step Functions), provisioned concurrency, e API Gateway costs, la bolletta può crescere esponenzialmente. Monitora sempre il costo per transazione, non solo per funzione.
Conclusioni e Raccomandazioni Finali
Dopo 15 anni di implementazioni cloud enterprise, una verità emerge chiaramente: la scelta migliore dipende dal contesto specifico, e tentare di forzare un paradigma su tutti i workload porta a problemi.
Per la maggior parte delle aziende enterprise, la raccomandazione è un approccio graduale:
- Inizia con serverless per nuovi microservizi con requisiti event-driven chiari
- Usa Kubernetes per workload core che richiedono performance prevedibile e controllo
- Implementa observability per tracciare quale approccio funziona meglio per ogni workload
- Rivaluta periodicamente basandoti su metriche reali, non su trend o pregiudizi
Il cloud hosting di AWS, Azure, GCP, e Oracle Cloud offre entrambe le opzioni. La competenza sta nel sapere quando applicare ciascuno, non nel sceglierne uno in toto.
Nessuna tecnologia vince in assoluto. L'architettura cloud vincente è quella che massimizza il value per il tuo caso d'uso specifico, budget, e capacità del team — che sia Kubernetes, serverless, o la combinazione intelligente di entrambi.
Weekly cloud insights — free
Practical guides on cloud costs, security and strategy. No spam, ever.
Comments