Soy Oscar Mas y hoy os quiero enseñar Pumba. Pero antes de pasar a conocerla, hemos de saber que es el Chaos Engineering.
Chaos Engineering, es la capacidad de resistir eventos o fallos inesperados en nuestra plataforma. Hemos de usar Chaos Engineering, ya que es inevitable que sucedan fallos en nuestros sistemas. Si vuestra aplicación no se puede recuperar de un fallo, nuestros clientes se enfadaran y lo peor de todo, los podemos perder.
Con esta idea surgieron varios proyectos como:
- Chaos Monkey de Netflix
- Dirt (Disaster Recovery Testing Event) de Google
- Pumba, la cual está inspirada en Chaos Monkey
Nosotros nos centraremos en Pumba, ya que es una herramienta sencilla de desplegar y potente. En este caso, os enseñaré un ejemplo para poder aplicarlo en Docker y otro para poder aplicarlo en Kubernetes
Pumba en docker
Todo el procedimiento lo he realizado con el usuario root. Para poder observar el efecto de Pumba, crearemos un container muy simple que haga un ping a google, de la siguiente manera:
root@ub-nodo0-sbd:~# docker run -it --rm --name tryme alpine sh -c "apk add --update iproute2 && ping www.google.es"
Después de crear nuestro contenedor que lanza un ping a google, lanzaremos un contenedor con Pumba, el cual hará una latencia de 3000ms durante un minuto en la interface eth0 de nuestro host. De esta forma podremos ver como responde nuestro sistema ante una latencia provocada por Pumba:
root@ub-nodo0-sbd:~# docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock gaiaadm/pumba pumba netem --interface eth0 --duration 1m delay --time 3000 tryme
Pumba en Kubernetes
Ahora probaremos Pumba con Kubernetes. Lo que haremos es crear un DaemonSet con Pumba, el cual irá provocando errores en nuestros contenedores, así podremos observar que sucede ante un posible error.
root@ub-nodo0-sbd:~# vim pumba-kubernetes.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: pumba
spec:
template:
metadata:
labels:
app: pumba
name: pumba
spec:
containers:
- image: gaiaadm/pumba:master
imagePullPolicy: Always
name: pumba
command: ["pumba"]
args: ["--random", "--debug", "--interval", "30s", "kill", "--signal", "SIGKILL", "re2:.*nginx.*"]
securityContext:
runAsUser: 0
volumeMounts:
- name: dockersocket
mountPath: /var/run/docker.sock
volumes:
- hostPath:
path: /var/run/docker.sock
name: dockersocket
root@ub-nodo0-sbd:~# vim pumba-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Crearemos nuestro pod de test:
root@ub-nodo0-sbd:~# kubectl create -f pumba-nginx.yaml root@ub-nodo0-sbd:~# kubectl get pods
Y posteriormente lanzaremos nuestro puma, para que vaya generando errores en nuestro pods, así podremos verificar que nuestro sistema esta preparado para una caída del sistema.
root@ub-nodo0-sbd:~# kubectl create -f pumba-kubernetes.yaml root@ub-nodo0-sbd:~# kubectl get pods
Si queréis ir observándolo en tiempo real, podéis usar el siguiente comando:
rootdevel@ub-nodo0-sbd:~$ watch kubectl get pods
No te pierdas la serie completa sobre Kubernetes de Oscar Mas:
- Kubernetes – Introducción a Kubernetes
- Kubernetes – Instalación
- Kubernetes – RollingUpdate con Kubernetes
- Kubernetes – Dashboard
- Kubernetes – Volúmenes NFS
- Kubernetes – Registry
- Kubernetes – Traefik
- Kubernetes – Systemd con Traefik y Proxy de Kubernetes
- Kubernetes – Heapster Influx Grafana
- Kubernetes – Labels de Kubernetes
- Kubernetes – API: Swagger
- Kubernetes – API: Creando nuestro primer POD
- Kubernetes – API: Seguridad con Token




Leave a Reply