Chaos Engineering: 5 strumenti open source

Il Chaos Engineering è una disciplina che consiste nell’eseguire esperimenti controllati su sistemi distribuiti in ambiente di produzione, con l’obiettivo di testare la resilienza. Questa pratica prevede l’introduzione deliberata di guasti per valutare la capacità del sistema di affrontare condizioni turbolente e inaspettate, rafforzando così la fiducia nella sua stabilità.

A differenza dei tradizionali test di sistema, il Chaos Engineering si focalizza sull’identificazione e l’analisi dei punti deboli, per scoprire nuove proprietà e comportamenti emergenti nei sistemi complessi mediante la simulazione di scenari di guasto controllati.

L’approccio non consiste nel “rompere le cose a caso”, ma nell’adottare un metodo sistematico che consenta di anticipare e mitigare eventuali criticità prima che possano impattare negativamente l’operatività.

Il Chaos Engineering non sostituisce i test tradizionali, ma li completa, aggiungendo un ulteriore livello di garanzia sulla resilienza del sistema.

Un po’ di storia

Il Chaos Engineering nasce dalla necessità di gestire la crescente complessità dei sistemi distribuiti moderni. La sua formalizzazione viene comunemente attribuita a Netflix, che durante la migrazione verso AWS nel periodo 2009-2010 ha sviluppato lo strumento Chaos Monkey. Questo strumento disattivava casualmente istanze software in ambiente di produzione, consentendo di testare la resilienza del sistema in scenari reali e dinamici.
Nel 2012, Netflix ha reso Open Source Chaos Monkey e ha ufficialmente istituito il ruolo del Chaos Engineer, figura specializzata nella conduzione di esperimenti di resilienza e nell’analisi dei comportamenti emergenti nei sistemi complessi.

Un ulteriore sviluppo è avvenuto nel 2014, quando Kolton Andrus, co-fondatore di Gremlin, insieme al suo team, ha lanciato il metodo del Failure Injection Testing (FIT). Questa tecnica ha offerto agli sviluppatori un controllo più granulare sull’introduzione di guasti, permettendo di definire l’ambito dell’errore e di approfondire le dinamiche dei sistemi, contribuendo a mitigare potenziali criticità.
Nel 2016, Andrus e Matthew Fornaciari hanno fondato Gremlin, la prima soluzione gestita di Chaos Engineering, resa disponibile al pubblico nel 2017. L’anno successivo, Gremlin ha inaugurato la Chaos Conf, la prima grande conferenza interamente dedicata al Chaos Engineering.

L’importanza di questa pratica è stata ulteriormente riconosciuta nel 2020, quando AWS ha integrato il Chaos Engineering nel pilastro dell’affidabilità del proprio AWS Well-Architected Framework (WAF). Sempre nello stesso anno, AWS ha lanciato il Fault Injection Simulator (FIS), un servizio completamente gestito che consente di eseguire esperimenti di caos direttamente sui propri servizi cloud.

Oggi, la crescente complessità dei sistemi e l’importanza della resilienza hanno reso il Chaos Engineering una pratica fondamentale per garantire la sicurezza dei sistemi distribuiti, adottata da aziende di tutte le dimensioni e settori, dalla finanza alla sanità, dal retail ad altri ambiti.

> Leggi anche: “Test Automation: strumenti open source e vantaggi”

Principi Fondamentali del Chaos Engineering

Il Chaos Engineering evidenzia quindi le debolezze nascoste e garantisce un funzionamento ottimale anche in condizioni avverse. Di seguito, analizziamo nel dettaglio i principi chiave che guidano il Chaos Engineering:

Definizione dello “Stato Stabile” (Steady State)

Il primo passo per avviare un approccio di Chaos Engineering consiste nel definire lo “stato stabile” del sistema, ovvero il comportamento normale e atteso in condizioni operative di routine. Questa definizione si basa su indicatori di performance (KPI) che riflettono la reale esperienza dell’utente e la funzionalità complessiva del sistema. Tra le metriche più significative troviamo:

  • Throughput: quantità di lavoro gestito in un determinato intervallo di tempo.
  • Latenza: tempo necessario per completare una richiesta o un’operazione.
  • Tasso di errori: frequenza degli errori rilevati durante l’operatività.
  • Utilizzo delle risorse: consumo di CPU, memoria e altre risorse critiche.
  • Completamento del percorso utente: percentuale di utenti che riescono a completare azioni specifiche.
  • Tempo di risposta: durata che il sistema impiega per fornire una risposta.
  • Disponibilità: percentuale di tempo in cui il sistema è operativo e accessibile agli utenti.

È anche necessario selezionare metriche che rispecchino l’esperienza degli utenti, piuttosto che misurazioni puramente tecniche (ad esempio, il carico della CPU). Queste metriche fungono da benchmark per valutare l’impatto degli esperimenti e determinare se il sistema si comporta come previsto.

Formulazione di un’Ipotesi sul Comportamento del Sistema

Una volta definito lo stato stabile, il passo successivo consiste nel formulare un’ipotesi riguardante il comportamento del sistema in situazioni di stress. L’ipotesi deve essere chiara e guidare la progettazione degli esperimenti, specificando:

  • Aspettative: come ci si aspetta che il sistema reagisca sia in condizioni normali sia in condizioni di stress.
  • Obiettivi del test: quali aspetti della resilienza si intendono verificare.
  • Variabili controllate: quali condizioni e parametri saranno manipolati durante l’esperimento.

L’ipotesi deve essere specifica, misurabile, raggiungibile, rilevante e temporizzata (SMART). Per esempio, si potrebbe ipotizzare che un servizio continui a fornire risposte entro un determinato intervallo di latenza anche quando uno dei suoi server viene spento.

Introduzione di Variabili di “Eventi Reali”

Questo principio si basa sulla simulazione controllata di eventi reali che potrebbero verificarsi in un ambiente di produzione. Questi eventi possono includere, ad esempio:

  • Guasti hardware: arresti anomali dei server, malfunzionamenti di dischi rigidi o problemi con l’alimentazione.
  • Problemi di rete: interruzioni di connettività, ritardi nella trasmissione dei dati o perdita di pacchetti.
  • Picchi di traffico: incrementi improvvisi e massicci nel numero di richieste.
  • Dati malformati: inserimento di input o messaggi non conformi agli standard.
  • Errori di configurazione: utilizzo di parametri errati o non ottimali.
  • Esaurimento delle risorse: simulazioni di consumo eccessivo di CPU o memoria.

L’introduzione di tali variabili deve essere eseguita in maniera controllata, definendo un “blast radius” ( o raggio d’azione) limitato per minimizzare i potenziali danni. L’obiettivo è ricreare condizioni il più possibile simili a quelle reali, garantendo al contempo la sicurezza e la stabilità del sistema durante gli esperimenti.

Esecuzione degli Esperimenti in Produzione

Per ottenere risultati affidabili, gli esperimenti devono essere condotti in produzione o in ambienti che ne riproducano fedelmente le caratteristiche. Testare il sistema con traffico e utenti reali permette di identificare problematiche che non emergerebbero in ambienti isolati o di pre-produzione.
Tuttavia, l’esecuzione in produzione richiede:

  • Pianificazione accurata: definizione chiara degli obiettivi e dei possibili scenari.
  • Controlli di sicurezza robusti: meccanismi di rollback e procedure per interrompere rapidamente gli esperimenti in caso di criticità.
  • Evoluzione graduale: inizialmente, l’approccio manuale per poi passare all’automazione, integrando gli esperimenti nel ciclo di vita del software (CI/CD).

Questa prassi consente di rilevare e correggere in anticipo eventuali anomalie, garantendo una maggiore resilienza operativa.

Automazione Continua degli Esperimenti

Questo principio del Chaos Engineering garantisce che gli esperimenti vengano eseguiti regolarmente e che i risultati siano validi nel tempo.
I benefici dell’automazione includono:

  • Verifica costante: assicurarsi che il sistema mantenga la resilienza anche dopo aggiornamenti e modifiche.
  • Riduzione dell’intervento manuale: minimizzare il carico operativo e l’errore umano.
  • Integrazione nel ciclo di sviluppo: incorporare gli esperimenti come parte integrante dei processi CI/CD.
  • Adattamento dinamico: gestire in modo proattivo l’evoluzione delle infrastrutture e dei servizi.

L’automazione può essere realizzata mediante strumenti di orchestrazione, script personalizzati o piattaforme dedicate di Chaos Engineering, garantendo così una validità costante dei test nel tempo.

Concetto di Chaos, Chaos engineering

5 strumenti Open Source di Chaos Engineering

Chaos Mesh

Chaos Mesh è una piattaforma cloud-native progettata per orchestrare esperimenti di chaos engineering direttamente negli ambienti Kubernetes. Gli esperimenti, che possono simulare scenari di latenza, errori di rete o stress sulle risorse, vengono definiti tramite file YAML o gestiti con un’interfaccia grafica dedicata.

Tra i vantaggi di Chaos Mesh si annovera la sua integrazione nativa con Kubernetes, resa possibile grazie all’uso delle CustomResourceDefinition (CRD), e una dashboard intuitiva che permette il monitoraggio in tempo reale degli esperimenti. Inoltre, la solida community di supporto garantisce aggiornamenti continui. Tuttavia, lo strumento richiede una buona conoscenza di Kubernetes per sfruttare appieno le funzionalità avanzate e l’esecuzione in ambienti di produzione va pianificata con attenzione per evitare impatti indesiderati.

Litmus

Litmus è un framework open source dedicato al Chaos Engineering in ambienti Kubernetes, che consente di orchestrare esperimenti attraverso workflow predefiniti accessibili tramite il portale ChaosHub e di integrarli nelle pipeline CI/CD.

Tra i suoi punti di forza, Litmus offre una vasta libreria di esperimenti già pronti all’uso, pur lasciando spazio alla creazione di scenari personalizzati. L’integrazione con strumenti di monitoraggio come Prometheus e Grafana, unitamente al supporto costante della community CNCF, rende Litmus una soluzione robusta e versatile. D’altro canto, la configurazione iniziale e la personalizzazione di esperimenti complessi possono richiedere tempo, e la gestione in ambienti multi-cloud o eterogenei può presentare alcune sfide.

Toxiproxy

Toxiproxy è un proxy TCP studiato per simulare condizioni di rete avverse, come latenza, perdita di pacchetti e throttling, risultando particolarmente utile per testare la resilienza di servizi distribuiti e microservizi.

La facilità di integrazione di Toxiproxy in test automatizzati e suite di integrazione continua, insieme alla sua leggerezza e alla capacità di offrire un controllo granulare sulle condizioni di rete simulate, rappresentano i principali vantaggi dello strumento. Tuttavia, la configurazione per scenari complessi può richiedere interventi manuali approfonditi e, poiché Toxiproxy non è specifico per Kubernetes, l’integrazione in ambienti containerizzati potrebbe necessitare di configurazioni aggiuntive.

Chaos Toolkit

Chaos Toolkit offre un framework modulare per definire ed eseguire esperimenti di chaos in ambienti eterogenei, che spaziano dal cloud, ai container, fino al bare-metal. Gli esperimenti vengono scritti in un formato dichiarativo e possono essere estesi tramite plugin, garantendo una notevole flessibilità ed estensibilità.

Tra i vantaggi di Chaos Toolkit si evidenziano il controllo completo sugli esperimenti, inclusa la gestione dei rollback per riportare il sistema allo stato stabile e la possibilità di operare interamente tramite interfaccia a riga di comando, ideale per integrazioni in pipeline CI/CD. Di contro, l’uso di questo strumento richiede una maggiore competenza tecnica per scrivere e gestire esperimenti complessi, e l’assenza di un’interfaccia grafica può rendere il monitoraggio meno immediato per gli utenti meno esperti.

KubeInvaders

KubeInvaders è un tool open source che utilizza i principi della gamification per introdurre caos nei cluster Kubernetes. Lo strumento simula un’invasione del cluster, ad esempio terminando casualmente i pod o “attaccando” risorse specifiche, per verificare la resilienza delle applicazioni.

L’aspetto ludico di KubeInvaders lo rende particolarmente accessibile e coinvolgente, ideale per sessioni formative e dimostrazioni, mentre la sua facile integrazione sfrutta le API e le risorse native di Kubernetes, stimolando la consapevolezza sulla resilienza e l’adozione di best practice tra i team. Tuttavia, rispetto ad altri strumenti più flessibili come Chaos Toolkit, KubeInvaders risulta meno personalizzabile, essendo maggiormente orientato a scenari standard, e potrebbe essere considerato più adatto a scopi dimostrativi o formativi piuttosto che a esperimenti in ambienti di produzione ad alta criticità.

Il futuro del Chaos Engineering risiede nell’adozione di strumenti standardizzati sempre più sofisticati, unitamente a una collaborazione stretta tra team multidisciplinari. In un’epoca in cui l’innovazione è sinonimo di competitività, adottare i principi del Chaos Engineering significa non solo prepararsi a fronteggiare i fallimenti, ma trasformarli in opportunità di crescita e miglioramento continuo, contribuendo a creare infrastrutture digitali resilienti e pronte per le sfide del futuro.

Fonti

Ahamed, I. (2023). What is Chaos Engineering: History, Principles and Best Practices. Lambdatest.com; LambdaTest. https://www.lambdatest.com/learning-hub/chaos-engineering-tutorial

Basiri, A., Behnam, N., De Rooij, R., Hochstein, L., Kosewski, L., Reynolds, J., & Rosenthal, C. (2016). Chaos engineering. IEEE Software33(3), 35-41.

Chaos Engineering. (2022). Chaos Engineering. Cncf.io. https://glossary.cncf.io/it/chaos_engineering/

Lafeldt, M. (2017). The Discipline of Chaos Engineering. Gremlin.com. https://www.gremlin.com/blog/the-discipline-of-chaos-engineering

Owotogbe, J., Kumara, I., Heuvel, W. J. V. D., & Tamburri, D. A. (2024). Chaos Engineering: A Multi-Vocal Literature Review. arXiv preprint arXiv:2412.01416.

Ratis, P. (2024). dastergon/awesome-chaos-engineering. GitHub. https://github.com/dastergon/awesome-chaos-engineering

Rinehart, A. (2018). Security Chaos Engineering: A new paradigm for cybersecurity. Opensource.com. https://opensource.com/article/18/1/new-paradigm-cybersecurity