En este posts veremos 2 configuraciónes básicas para manejar el estado de salud de nuestros pods. Con estas configuraciones kubernetes de manera automática puede por ejemplo reiniciar un pod o no mandarle tráfico.

Para esto tenemos estas 2 propiedades:

  • livenessProbe: Si esta sonda falla kubernetes puede por ejemplo reiniciar el pod. Es el típico health que solemos tener en otros servicios. Como tal se puede configurar que tiene que hacer kubernetes cuando la sonda falla, como por ejemplo cuantos errores debe dar antes de reiniciar y cosas así
  • readinessProbe: Hasta que esta sonda no funcione kubernetes no enviaría tráfico al POD (no lo añadiría al objeto service que veremos más adelante lo que es) y en el caso de que empiece a devolver errores dejaría de enviarle tráfico (lo quitaría del objeto service)

Para ver como funciona esto, lo primero eliminaremos el pod actual si lo tenemos todavía activo

kubectl delete pods mario-test

Y modificaremos el fichero del POD añadiendo estas propiedades. Primero con la de liveness

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: mario-test
  name: mario-test
spec:
  containers:
  - image: pengbai/docker-supermario:latest
    name: mario-test
    ports:
    - containerPort: 8080
      name: game // <- Esto es nuevo
    resources: 
      requests:
        cpu: 50m 
        memory: 64M
      limits:
        cpu: 50m
        memory: 64M
    livenessProbe:
      httpGet:
        path: /fake
        port: game

  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

Antes de hablar de la configuraciónd de la sonda comentar que hemos añadido un nombre al puerto en cuestión del contenedor para que nos sea más fácil hacer referencia a él y no tener que cambiarlo en un montón de sitios si de repente cambiamos el puerto.

Además del nombre del puerto hemos añadido la propiedad livenessProbe, dentro de esta propiedad podemos incluir comandos, peticiones a http y otras cosas que nos pueden resultar útiles para realizar la comprobación del estado de salud (al final del post pondré el link de la documentación para ampliar información). En nuestro caso hemos añadido una petición get a un path /fake que realmente no existe, para que veamos que ocurre.

Guardamos y creamos el pod como hasta ahora

kubectl create -f mario.yaml

Y veamos que pasa si ejecutamos nuestro comando get pods

kubectl get pods

Captura-de-pantalla-2021-01-09-a-las-14.22.34-1

En un principio parecería que todo esta correcto pero si esperamos veremos como se producen cambios, normalmente a los 30 segundos empezaremos a ver diferencias

Captura-de-pantalla-2021-01-10-a-las-13.19.01

Vemos como se ha reiniciado una vez y si esperamos 5 loops tendremos este error y también ha cambiado el número de contenedores READY a 0

Captura-de-pantalla-2021-01-10-a-las-13.20.50

Por último si comprobamos el describe del pod en cuestión podremos ver el registro de los eventos que se han ido sucediendo

Captura-de-pantalla-2021-01-10-a-las-12.53.08

Este sería el caso usando livenessProbe, como tal hemos visto como ha intentando reiniciar cada 30 segundos hasta que ha confirmado que no funciona. Si analizamos el describe un poco más arriba veremos como en la configuración por defecto se comprueba cada 10 segundos con un máximo de 3 fallos hasta que reinicia (estas son serian algunas de los campos que podemos configurar)

Captura-de-pantalla-2021-01-10-a-las-12.52.55

Hagamos la prueba ahora usando readinessProbe

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: mario-test
  name: mario-test
spec:
  containers:
  - image: pengbai/docker-supermario:latest
    name: mario-test
    ports:
    - containerPort: 8080
      name: game
    resources: 
      requests:
        cpu: 50m 
        memory: 64M
      limits:
        cpu: 50m
        memory: 64M
    readinessProbe:
      httpGet:
        path: /fake
        port: game

  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

Este caso si ejecutamos el get pods podemos ver como ya al inicio cambia un poco, nunca tenemos el pod en READY, si nos fijamos estamos siempre en 0/1

Captura-de-pantalla-2021-01-10-a-las-13.31.21

Y trás algunos reinicios, si esperamos 3 minutos tenemos un error

Captura-de-pantalla-2021-01-10-a-las-13.33.59

Por último veamos que tenemos en nuestro describe. Primero podemos ver la configuración por defecto (la misma que con liveness):

Captura-de-pantalla-2021-01-10-a-las-13.35.37

Y si nos vamos a los eventos que han ido sucediendo tenemos

Captura-de-pantalla-2021-01-10-a-las-13.36.03

Vemos como ha intendado varias veces acceder a el y no ha sido capaz devolviendonos el error que ya hemos visto.

Estas han sido dos configuraciones básicas que podemos hacer, en la documentación oficial tenemos más información sobre la configuración, a que afecta realmente cada caso y otro probe más que es el de startup, recomiendo encarecidamente leerla y hacer más pruebas para ver las posibilidades que nos ofrecen los checks de estado de salud sobre nuestros pods.

Y hasta aquí este post, nos vemos en el siguiente un abrazoooorrrrr