Ingeniería del Caos: El arte de introducir fallos intencionales
¿Qué es la Ingeniería del Caos?
Antes de aprender acerca de esto, podría haber pensado que se trataba de alguna técnica para gestionar el caos en casa, cuando se tienen hijos y/o bebés (lo cual también sería bueno), pero nada más lejos de la realidad. 😊
La ingeniería del caos es un enfoque técnico para probar y mejorar la resiliencia de sistemas complejos (o no tan complejos) mediante la introducción deliberada de fallos y eventos inesperados. Los ingenieros y desarrolladores pueden identificar puntos débiles en el sistema y desarrollar arquitecturas y plataformas más resistentes.
Una de las frases que llamó mi atención cuando empezamos con esto fue "la ingeniería del caos no es una herramienta o un marco de trabajo, es una mentalidad".
En este artículo, vamos a explorar los beneficios y desafíos de implementar la Ingeniería del Caos, proporcionando información sobre cómo podría (y lo hará) ayudarnos, en Santander Consumer Finance, a mejorar la fiabilidad de nuestro sistema.
Beneficios y Desafíos
Nada es perfecto, así que basándonos en esa premisa, analicemos los principales beneficios y desafíos que podríamos encontrar al implementar la ingeniería del caos. Empezando por los beneficios:
- Una mayor resiliencia y fiabilidad del sistema gracias a la identificación y resolución de puntos débiles en el sistema o malas configuraciones.
- Pruebas proactivas de la respuesta del sistema a fallos y otros eventos inesperados, lo que potencialmente evita fallos catastróficos, lo cual es extremadamente útil cuando se trabaja en un plan de recuperación ante desastres. Un plan de DR es muy teórico y difícil de probar y validar, y más difícil aún si necesitas replicar estas pruebas periódicamente. Ahora puedes definirlo programáticamente en diferentes experimentos replicables.
- Mejor comprensión de cómo opera el sistema en condiciones del mundo real, lo que lleva a decisiones de diseño mejor informadas.
- Podrás generar informes después de los diferentes experimentos, lo cual es muy útil como material gráfico de apoyo si tienes una presentación con otros equipos o áreas de negocio.
- La creación de una cultura de mejora continua a través del análisis regular de los resultados del experimento. Al igual que la cultura de CI/CD, la mentalidad de la Ingeniería del Caos pretende ser un ciclo de análisis de los resultados del experimento, mejora de tu plataforma y servicios, definición de nuevos experimentos e innovación, y hacer el proceso de nuevo.
¿Y los desafíos?
- Requiere una inversión significativa de tiempo, recursos y experiencia para implementar y realizar experimentos de manera efectiva, y la coordinación de diferentes equipos como ingenieros de plataformas y software o equipos de prueba y monitoreo. Una buena idea es elegir las herramientas que mejor se adapten a sus requisitos y al conocimiento de sus equipos para hacer que este proceso sea más fácil.
- Introducir fallos controlados en un entorno de producción puede ser arriesgado, y potencialmente causar interrupciones o tiempo de inactividad en ocasiones. Para evitar este riesgo tanto como sea posible, es importante probar los experimentos primero en entornos de sandbox o dev y sólo ejecutarlos en producción real cuando los experimentos tengan suficiente madurez.
- El conocimiento o la comprensión limitada del sistema puede llevar a experimentos ineficaces o incluso dañinos, lo mismo si los diferentes equipos no colaboran. Para evitarlo tanto como sea posible, es importante involucrar a todos los equipos necesarios desde el primer momento para comenzar a construir la mentalidad de Ingeniería del Caos y trabajar juntos para tener la mejor comprensión posible de los sistemas a probar.
- Dificultad para medir la efectividad de la Ingeniería del Caos, ya que es difícil cuantificar el impacto de prevenir un fallo catastrófico. Es por eso por lo que es esencial elegir las pruebas adecuadas y que estas pruebas sean cuantificables tanto como sea posible.
Herramientas y marcos de trabajo
Lo que necesitas hacer antes de implementar la Ingeniería del Caos es elaborar diferentes experimentos para analizar las herramientas y marcos de trabajo disponibles que puedan ayudarnos en esta aventura.
Código abierto
Ampliable mediante complementos, soporta varios tipos de pruebas y puede probar la resiliencia en plataformas y servicios.
Código abierto
Enfocado en Kubernetes. Se puede conectar a Chaos Toolkit.
Código abierto y versión de pago
Enfocado en servicios. Se puede conectar a Chaos Toolkit.
De pago. 0,10 $/acción por minuto
Herramienta nativa de AWS. Muy buena integración con los servicios de AWS. Actualmente tiene tipos de prueba muy limitados, pero está mejorando rápidamente.
https://aws.amazon.com/es/fis/
De pago. Comienza en 300 $/mes por servicio
Herramienta para inyectar fallos controlados y probar la resiliencia, mejorando la fiabilidad y resiliencia de sistemas distribuidos.
Después de realizar diferentes pruebas, comenzamos con el Chaos Toolkit y definimos diferentes experimentos iniciales. Los puntos clave para empezar con este marco de trabajo son:
- Flexible: El Chaos Toolkit está diseñado para ser flexible. Puedes crear experimentos y flujos de trabajo personalizados que se adapten a tus necesidades específicas.
- Extensible: Por diseño, puedes ampliar el toolkit mediante múltiples plugins.
- Multiplataforma: Para evitar la necesidad de usar múltiples herramientas para diferentes entornos en nuestra empresa y la necesidad de tener muchos planes de salida para cada uno, este toolkit es multiplataforma, lo que nos permite ejecutar experimentos en una amplia gama de sistemas operativos, plataformas en la nube y componentes mediante diferentes controladores.
- Impulsado por la comunidad: Hay una amplia comunidad de desarrolladores y usuarios que contribuyen a su desarrollo, comparten conocimientos y brindan soporte, lo que reduce la sensación inicial de incertidumbre y la curva de aprendizaje.
- Informes: Es posible exportar los resultados de los experimentos en formato HTML o PDF utilizando el "informe de caos".
Experimentos iniciales
¡Como en todo en la vida, siempre hay que empezar en algún lugar! Decidimos entonces trabajar con la herramienta Chaos Toolkit utilizando 2 experimentos base para comenzar a avanzar en el ciclo de ingeniería del caos.
Experimento de fallo de pod de Kubernetes: Este experimento simula un fallo de pod de Kubernetes matando un porcentaje específico (50%) de pods en un despliegue y observando cómo responde el sistema al fallo:
{
"title": " Kubernetes Pod Failure Experiment",
"description": "We expect Kubernetes to handle the situation and create new pods to solve the experiment correctly ",
"tags": ["kubernetes", “pods-failure”],
"steady-state-hypothesis": {
"title": "Verifying service are healthy after 20 seconds",
"probes": [
{
"name": "helloworld-should-be-healthy",
"type": "probe",
"tolerance": true,
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "deployment_available_and_healthy",
"arguments": {
"ns": "default",
"name": "helloworld"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-helloworld-pod",
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"ns": "default",
"name_pattern": "helloworld",
"rand": true,
"mode": "percentage",
"qty": 50
}
},
"pauses": {
"after": 20
}
}
]
}
Experimento de fallo de instancia de RDS: Este experimento simula un fallo de instancia en un clúster de RDS deteniendo la instancia, incluyendo la reversión de volver a iniciar la instancia. Luego, el Chaos Toolkit observa cómo responde el sistema al fallo y si el estado es correcto después del experimento.
{
"title": "Simulate AWS RDS failure",
"description": "Simulates an AWS RDS failure by stopping the RDS instance",
"tags": [
"aws",
"rds",
"failure",
"chaosengineering"
],
"version": "1.0.0",
"configuration": {
"rds": {
"identifier": "helloworld"
}
},
"steady-state-hypothesis": {
"title": "RDS instance is running",
"probes": [
{
"type": "probe",
"name": "rds-instance-state",
"provider": {
"type": "python",
"module": "chaosaws.rds.probes",
"func": "instance_status",
"arguments": {
"instance_id": "helloworld-instance-1"
}
},
"tolerance": {
"type": "jsonpath",
"path": "$.DBInstances[0].DBInstanceStatus",
"tolerance": "running"
}
}
]
},
"method": [
{
"type": "action",
"name": "stop-rds-instance",
"provider": {
"type": "python",
"module": "chaosaws.ec2.actions",
"func": "stop_instance",
"arguments": {
"instance_id": "helloworld-instance-1"
}
},
"pause": {
"after": "10s"
}
}
],
"rollbacks": [
{
"type": "action",
"name": "start-rds-instance",
"provider": {
"type": "python",
"module": "chaosaws.ec2.actions",
"func": "start_instances",
"arguments": {
"instance_ids": ["helloworld-instance-1"]
}
}
}
]
}
Con estos experimentos, puedes empezar a implementar los fundamentos de la Ingeniería del Caos y a construir la cultura y la mentalidad necesarias en tu equipo y empresa.
Conclusión
En conclusión, la Ingeniería del Caos se ha convertido en una práctica cada vez más crítica para garantizar la fiabilidad y la resiliencia de los sistemas distribuidos, y la herramienta Chaos Toolkit es esencial para implementar esta técnica de manera efectiva.
Al automatizar el proceso de introducir el caos controlado en un sistema, el Chaos Toolkit permite a los ingenieros identificar y abordar proactivamente las debilidades. Con su amplio ecosistema de plugins e integraciones con tecnologías populares, el Chaos Toolkit ofrece un alto nivel de flexibilidad y personalización para satisfacer las necesidades únicas de diferentes sistemas. La naturaleza de código abierto de la herramienta fomenta la colaboración y la innovación, permitiendo a la comunidad de ingeniería mejorar continuamente la práctica de la Ingeniería del Caos.
Artículo elaborado por Jesús Gil Nombela, empleado de SCFGS, Cloud & Devops platform engineer