En esta tarea vamos a desplegar una aplicación web que requiere de dos servicios para su ejecución. La aplicación se llama GuestBook y necesita los siguientes servicios:

  • La aplicación GuestBook es una aplicación web desarrollada en python que tenemos guardada en el repositorio https://github.com/josedom24/osv4_guestbook.git.
  • Esta aplicación guarda la información en una base de datos no relacional redis, que utiliza el puerto 6379/tcp para recibir las conexiones. Usaremos la imagen bitnami/redis.

Por lo tanto para desplegar las aplicaciones vamos a ejecutar los siguientes comandos:

oc new-app https://github.com/josedom24/osv4_guestbook.git --name=guestbook
oc new-app bitnami/redis  -e REDIS_PASSWORD=mypass --name=redis

Nota: No hay que indicar la contraseña de la base de datos en el despliegue de la aplicación GuestBook, porque por defecto coincide con la que hemos establecido en el despliegue de Redis.

A continuación, creamos la ruta para acceder a GuestBook y comprobamos que funciona:

oc expose service/guestbook

guestbook

Persistencia de la información

La aplicación funciona de forma correcta, pero tenemos que tener en cuenta que los Pods son efímeros, es decir, cuando se eliminan pierden la información. En nuestro caso si eliminamos el Pod del despliegue redis (por alguna actualización, escalado, …) se perderá la información de la base de datos.

Si estudiamos la documentación de la imagen bitnami/redis en Docker Hub, para que la información de la base de datos sea persistente, tenemos que asociar un volumen al directorio /bitnami/redis/data.

Además como vimos en el Ejercicio 1, tenemos que modificar la estrategia de despliegue a Recreate, para que no exista el Pod antiguo cuando se crea uno nuevo, y se pueda conectar sin problemas al volumen.

En primer lugar vamos a crear un objeto PersistentVolumeClaim que nos va permitir solicitar la creación de un PersistentVolume, para ello usamos la definición del objeto que tenemos en el fichero pvc-redis.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: my-pvc-redis
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Y creamos el objeto, ejecutando:

oc apply -f pvc-redis.yaml

Podemos ver que se ha creado el objeto, pero que no se va asociar a un volumen hasta que no se utilice:

oc get pvc
NAME           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc-redis   Pending                                      gp3            4s

A continuación tenemos que modificar el despliegue de la aplicación GuestBook, para cambiar la estrategia de despliegue, asociar el volumen e indicar el directorio de montaje, para ello editamos el Deployment redis y lo dejamos con las siguientes modificaciones:

oc edit deploy/redis

spec:
...
  strategy:
    type: Recrete
template:
...
  spec:
    containers:
    ...
      volumeMounts:
        - mountPath: /bitnami/redis/data
          name: my-volumen
      ...
    volumes:
      - name: my-volumen
        persistentVolumeClaim:
          claimName: my-pvc-redis

Cuando modificamos el Deployment, se produce una actualización: se creará un nuevo ReplicaSet que creará un nuevo Pod con la nueva configuración.

oc get rs
NAME                   DESIRED   CURRENT   READY   AGE
...
redis-64b4c9d464       0         0         0       26m
redis-7596cbd6d5       0         0         0       26m
redis-7f59bf9479       1         1         1       6s

oc get pod
...
NAME                        READY   STATUS      RESTARTS      
redis-7f59bf9479-mm76b      1/1     Running     0          10s

Puedes ver las características del Pod, ejecutando:

oc describe pod/redis-7f59bf9479-mm76b

Accede de nuevo a la aplicación, introduce algunos mensajes, y vamos a simular la eliminación del Pod:

oc delete pod/redis-7f59bf9479-mm76b

Inmediatamente se creará un nuevo Pod, volvemos acceder y comprobar que la información no se ha perdido:

guestbook

Actualizado: