Ingeniería del Caos en GKE con Litmus

Yury Niño
google-cloud-hispanoamerica
5 min readMar 28, 2023

La palabra caos suele asociarse con desorden, confusión, desconcierto y anarquía; lo que no se menciona en ese contexto, es que las situaciones caracterizadas por la desorganización y los problemas son las que mayores aprendizajes ofrecen. Y probablemente sea por esto, que a la experimentación con fallas en ambientes de hardware y software se le reconozca formalmente como Ingeniería del Caos.

Antes de continuar y con el ánimo de no generar una falsa expectativa, es importante aclarar, que esta entrada no es una discusión teórica sobre Ingeniería del Caos, en cambio es una aplicación de sus principios en la consola de Google Cloud.

Desde que los constructores no proveen herramientas destructoras, hay un tercer actor que se suma a la ecuación: Litmus, una tecnología para generar fallas en clusters de kubernetes.
En ese orden de ideas, a continuación las instrucciones para aplicar Ingeniería del Caos sobre un cluster en Google Kubernetes Engine [GKE], mediante saturación generada con Litmus.

Paso 1. Cree un clúster de GKE en Cloud Shell

gcloud container clusters create <NOMRE_DEL_CONTENEDOR> \
--zone "us-central1-c" --machine-type "e2-custom-4-4096" \
--image-type "UBUNTU_CONTAINERD" --num-nodes "2" \
--node-locations "us-central1-c"

Paso 2. Conecte la consola con el cluster

gcloud container clusters get-credentials <NOMBRE_DEL_CLUSTER> \
--zone us-central1-c --project <NOMBRE_DEL_PROYECTO>

Paso 3. Verifique la instalación, listando los nodos y namespaces

kubectl get nodes 
kubectl get ns

La salida debería verse así:

Paso 4. Instale Litmus haciendo uso de Helm y Kubectl

helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
helm repo list

La salida debería verse así:

Cree un namespace para litmus

kubectl create ns litmus
helm install chaos litmuschaos/litmus --namespace=litmus

La salida debería verse así:

Finalice la instalación con el siguiente comando:

kubectl apply -f https://litmuschaos.github.io/litmus/2.12.0/litmus-2.12.0.yaml

Paso 5. Verifique la instalación

kubectl get pods -n litmus
kubectl get svc -n litmus

En la salida debería ver el servicio litmusportal-frontend-service y otros cuatro servicios corriendo como pods:

Paso 6. Recupere la URL y el puerto del ChaosCenter a través de los comandos

LITMUS_PORTAL_NAMESPACE=litmus
export NODE_NAME=$(kubectl -n $LITMUS_PORTAL_NAMESPACE \
get pod -l "component=litmusportal-frontend" \
-o=jsonpath='{.items[*].spec.nodeName}')
export EXTERNAL_IP=$(kubectl -n $LITMUS_PORTAL_NAMESPACE \
get nodes $NODE_NAME -o \
jsonpath='{.status.addresses[?(@.type=="ExternalIP")].address}')
export NODE_PORT=$(kubectl -n $LITMUS_PORTAL_NAMESPACE \
get -o jsonpath="{.spec.ports[0].nodePort}" \
services litmusportal-frontend-service)
echo "URL: http://$EXTERNAL_IP:$NODE_PORT"

Paso 7. Cree reglas de firewall para el frontend-service y el server-service que permitan conexiones desde Internet hacía el Chaos Litmus Center usando el puerto recuperado en el paso anterior

gcloud compute firewall-rules create <NAME_FRONTEND_SERVICE> - allow tcp:<TCP_PORT>
gcloud compute firewall-rules create <NAME_SERVER_SERVICE> - allow tcp:<FIRST_TCP_PORT>

Si la creación es exitosa, la salida debería verse así:

Paso 8. Acceda a la consola usando la URL recuperada y las credenciales por defecto

Username: admin

Password: litmus

Paso 9. Una vez cambie las credenciales por defecto, debería ver una consola como esta

Paso 10. Configure un escenario de caos siguiendo los siguientes pasos en la consola de Litmus

Paso 10.1. Haga clic sobre Schedule a Chaos Scenario y seleccione self-agent como un delegate.

Paso 10.2. Puede elegir entre los escenarios predefinidos, clonar uno desde un template, seleccionar uno desde el Chaos Hub o importar uno usando un YAML. A continuación las instrucciones para seleccionar uno desde el Chaos Hub:

Paso 10.3. Ingrese un nombre y una descripción:

Paso 10.4. Haga clic en Add a new Chaos Experiment y seleccione generic/node-pcu-hog para el primer experimento. Repita luego los pasos hasta aquí para saturar la memoria generic/node-memory-hog:

Paso 10.5. Ajuste los valores de resiliencia para el escenario, considerando que los tres niveles de prioridad corresponden a 0–3 (prioridad baja), 4–6 (prioridad media), 7–10 (prioridad alta).

Paso 10.6. Elija una fecha para lanzar el ataque

Paso 10.7. Verifique la configuración y lance el ataque

Paso 10.8. Para este caso puede hacer uso del siguiente comando para verificar la saturación:

kubectl top nodes

Paso 10.9. Los detalles de la ejecución se pueden encontrar en la opción Show the chaos escenario:

Conclusion

Considerando que las aplicaciones de software están desplegadas en ambientes donde la probabilidad de falla existe, es crítico que las organizaciones desarrollen y adopten estrategias de resiliencia que garanticen niveles confiables de disponibilidad.

Ambientes como Google Cloud y particularmente, servicios como Google Kubernetes Engine no están exentos de fallar. La buena noticia es que el estado del arte en la evolución de desarrollo de software, incluye ya una disciplina conocida como Ingeniería del Caos, que permite el logro de los objetivos de nivel de servicio establecidos, mediante la experimentación y el método científico.

Este artículo presentó el protocolo de instalación de Litmus 2.0 sobre Google Kubernetes Engine y describió cómo configurar un escenario de falla y cómo seguir un flujo de ejecución desde el portal de Litmus.

Referencias:

https://principlesofchaos.org/

https://litmuschaos.io/

https://cloud.google.com/kubernetes-engine

--

--

Yury Niño
google-cloud-hispanoamerica

Cloud Infrastructure Engineer @Google. Chaos Engineer Advocate. Loves building software applications, DevOps, Security and SRE