Kubernetes. Desplegando WordPress con MariaDB
Antes de introducir el concepto de almacenamiento persistente, en esta entrada vamos a realizar un despliegue de una aplicación Wordpress y una base de datos MariaDB, para concluir con las consecuencias que tiene que nuestros pods sean efímeros, es decir, cuando se eliminan se pierde la información almacenada. Puedes encontrar todos los ficheros con los que vamos a trabajar en el directorio wordpress
.
Vamos a trabajar en un namespace
llamado wordpress:
kubectl create -f wordpress-ns.yaml
namespace "wordpress" created
Desplegando la base de datos MariaDB
A continuación vamos a crear los secrets
necesarios para la configuración de la base de datos, vamos a guardarlo en el fichero mariadb-secret.yaml
:
kubectl create secret generic mariadb-secret --namespace=wordpress \
--from-literal=dbuser=user_wordpress \
--from-literal=dbname=wordpress \
--from-literal=dbpassword=password1234 \
--from-literal=dbrootpassword=root1234 \
-o yaml --dry-run > mariadb-secret.yaml
kubectl create -f mariadb-secret.yaml
secret "mariadb-secret" created
Creamos el servicio, que será de tipo ClusterIP:
kubectl create -f mariadb-srv.yaml
service "mariadb-service" created
Y desplegamos la aplicación:
kubectl create -f mariadb-deployment.yaml
deployment.apps "mariadb-deployment" created
Comprobamos los recursos que hemos creado hasta ahora:
kubectl get deploy,service,pods -n wordpress
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.extensions/mariadb-deployment 1 1 1 1 20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mariadb-service ClusterIP 10.98.24.76 <none> 3306/TCP 20s
NAME READY STATUS RESTARTS AGE
pod/mariadb-deployment-844c98579-cgp84 1/1 Running 0 20s
Desplegando la aplicación Wordpress
Lo primero creamos el servicio:
kubectl create -f wordpress-srv.yaml
service "wordpress-service" created
Y realizamos el despliegue:
kubectl create -f wordpress-deployment.yaml
Y vemos los recursos creados:
kubectl get deploy,service,pods -n wordpress
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.extensions/mariadb-deployment 1 1 1 1 6m
deployment.extensions/wordpress-deployment 1 1 1 1 25s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mariadb-service ClusterIP 10.98.24.76 <none> 3306/TCP 6m
service/wordpress-service NodePort 10.111.158.165 <none> 80:30331/TCP,443:30015/TCP 25s
NAME READY STATUS RESTARTS AGE
pod/mariadb-deployment-844c98579-cgp84 1/1 Running 0 6m
pod/wordpress-deployment-866b7d9fd8-wf5t4 1/1 Running 0 25s
Por último creamos el recurso ingress
que nos va a permitir el acceso a la aplicación utilizando un nombre:
kubectl create -f wordpress-ingress.yaml
ingress.extensions "wordpress-ingress" created
kubectl get ingress -n wordpress
NAME HOSTS ADDRESS PORTS AGE
wordpress-ingress wp.172.22.200.178.nip.io 80 20s
Y accedemos:
Problemas que nos encontramos
En realidad no son problemas, son la consecuencia de que los pods son efímeros, cuando se elimina un pod su información se pierde. Por lo tanto nos podemos encontrar con algunas circunstancias:
- ¿Qué pasa si eliminamos el despliegue de mariadb?, o, ¿se elimina el pod de mariadb y se crea uno nuevo?. En estas circunstancias se pierde la información de la base de datos y el proceso de instalación comenzará de nuevo.
- ¿Qué pasa si escalamos el despliegue de la base de datos y tenemos dos pods ofreciendo la base de datos?. En cada acceso a la aplicación se va a balancear la consulta a la base de datos entre los dos pods (uno que tiene la información de la instalación y otro que que no tiene información), por lo que en los accesos consecutivos nos va a ir mostrando la aplicación y en el siguiente acceso nos va a decir que hay que instalar el wordpress.
- Si escribimos un post en el wordpress y subimos una imagen, ese fichero se va a guardar en el pod que está corriendo la aplicación, por lo tanto si se borra, se perderá el contenido estático.
- En el caso que tengamos un pods con contenido estático (por ejemplo imágenes) y escalamos el despliegue de wordpress a dos pods, en uno se encontrará la imagen pero en el otro no, por lo tanto en los distintos accesos consecutivos que se hagan a la aplicación se ira mostrando o no la imagen según el pod que este respondiendo.
Para solucionar estos problemas veremos en las siguientes entradas la utilización de volúmenes en Kubernetes.
Índice de entradas sobre Kubernetes
Este artículo corresponde a una serie de entradas donde he hablado sobre Kubernetes:
- Instalación de kubernetes con kubeadm
- Desplegando una aplicación en Kubernetes
- Recursos de Kubernetes: Pods
- Recursos de Kubernetes: ReplicaSet
- Recursos de Kubernetes: Deployment
- Kubernetes: Desplegando la aplicación Mediawiki
- Kubernetes: Desplegando la aplicación GuestBook (Parte 1)
- Recursos de Kubernetes: Services
- El servicio DNS en Kubernetes
- Kubernetes: Desplegando la aplicación GuestBook (Parte 2)
- Kubernetes: Desplegando la aplicación LetsChat
- Recursos de Kubernetes: Ingress
- Accediendo a nuestras aplicaciones Kubernetes con Ingress
- Recursos de Kubernetes: Namespaces
- Kubernetes. Configurando nuestras aplicaciones: variables de entornos, ConfigMap, Secrets
- Kubernetes. Desplegando WordPress con MariaDB
- Almacenamiento en Kubernetes. PersistentVolumen. PersistentVolumenClaims
- Kubernetes. Desplegando WordPress con MariaDB con almacenamiento persistente
- Integración de Kubernetes con OpenStack
Leave a Comment
Your email address will not be published. Required fields are marked *