Instalando WordPress con Kubernetes en Google Cloud usando persistent disks

Recursos a utilizar


Preparación

  • Utilizaremos Persistent Disks para preservar los datos que se guarden en la Base de Datos y en el aplicativo de Postgres. De no usarlo cada vez que los containers dejan de funcionar toda la data se pierde.
  • Se harán 2 Deployments  Deployments: uno para MySQL y otro para WordPress, ambos ejecutándose en una single replica en cada pod.
  • Definir configuración de Project y Zone en tu entorno de trabajo, desde tu Cloud Shell :
    • gcloud config set project PROJECT_ID
    • gcloud config set compute/zone us-central1-b
  • Descargar los Application Manifest que describen cada uno de los recursos a utilizar por Kubernetes; desde tu Cloud Shell
    • git clone https://github.com/GoogleCloudPlatform/container-engine-samples
    • cd container-engine-samples/wordpress-persistent-disks
  • Deberán haber 5 archivos con la descripción de cada :
    • mysql.yaml: The MySQL deployment configuration file.
    • mysql-service.yaml: The MySQL service configuration file.
    • wordpress.yaml: The WordPress deployment configuration file.
    • wordpress-service.yaml: The WordPress service configuration file

Paso 1 Create a Container Engine cluster

Crear un Cluster de Container Engine para instalar la los containers de aplicación de WordPress y MySQL; se usa el siguiente comando :
gcloud container clusters create hello --num-nodes=3

Paso 2 Crear los persistent disks

Utilizaremos los Persistent Disks, para que la aplicación preserve su storage cuando los Pods tengan que ser reinicializados o re-agendados en su stop/start debido a incidentes de interrupción, o daños en los Nodes.
Necesitaremos en este ejemplo 2 disks :  
  • Uno para la Database en MySQL para guardar los datos
  • Para que WordPress pueda guardar sus assets en el filesystem.
Para crear los Persistent Disks usamos los siguientes comandos :
gcloud compute disks create --size 200GB mysql-disk
gcloud compute disks create --size 200GB wordpress-disk


Step 3: Configurar  MySQL

Implementar MySQL

Lo primero que hay que hacer al implementar MySQL es crear un Kubernetes Secret para guardar de manera segura la pwd de la base de datos; esto lo hacemos con el siguiente comando (asegurese de modificar YOUR_PASSWORD con la contraseña que mejor le convenga y de resguardarla para uso futuro)
kubectl create secret generic mysql --from-literal=password=YOUR_PASSWORD

Luego utilizaremos el manifest file mysql.yaml para implementar la instance de MySQl application corriendo en el port 3306.  El archivo se redacta así :
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: wordpress
 labels:
   app: wordpress
spec:
 replicas: 1
 selector:
   matchLabels:
     app: wordpress
 template:
   metadata:
     labels:
       app: wordpress
   spec:
     containers:
       - image: wordpress
         name: wordpress
         env:
         - name: WORDPRESS_DB_HOST
           value: mysql:3306
         - name: WORDPRESS_DB_PASSWORD
           valueFrom:
             secretKeyRef:
               name: mysql
               key: password
         ports:
           - containerPort: 80
             name: wordpress
         volumeMounts:
           - name: wordpress-persistent-storage
             mountPath: /var/www/html
     volumes:
       - name: wordpress-persistent-storage
         gcePersistentDisk:
           pdName: wordpress-disk
           fsType: ext4
El manifest describe un Deployment con una instance única de MySQL pod que tendrá la password en la variable de entorno MYSQL_ROOT_PASSWORD cuyo valor si se recuerda fue definida usando kubernetes secret para efectos de seguridad.  El container MySQL usará un persistent disk mounted en /var/lib/mysql
Para deploy este manifest file, ejecute el comando :
kubectl create -f mysql.yaml

Para verificar si el pod se esta ejecutando, lo que podrá tomar en preparar unos minutos para que el pod pase al status Running mientras se le attach los persistent disk al compute node, use el comando
kubectl get pod -l app=mysql

Crear el service MySQL

El siguiente paso es crear un Service de Kubernet para exponer el container MySQL y hacerlo accesible para el container wordpress que crearemos a continuación.
Se usaá el Service manifest que esta definido en mysql-service.yaml, cuyo contenido lo puedes ver en la carpeta que descargaste de git en la fase de preparación.
El manifest describe un Service que crea un Cluster IP en el port 3306 para los pods que tengan el label app: mysql  Como recordaras el container que implementamos anteriormente tiene este label.
En este caso podemos usar type:ClusterIP  para el Service ya que el Service será accesible unicamente dentro del cluster.
El Cluster IP crea routes  traffic al container MySQL de todos los compute nodes en el cluster y no es accesible a clientes que estén afuera del cluster.  Una vez el Service es creado, el container wordpress puede usar el nombre DNS del mysql container para comunicarse, aunque no se encuentren creados en el mismo compute node.  Esto es muy parecido a Docker compose.
Para implementar el manifest file debemos ejecutar :
kubectl create -f mysql-service.yaml
Para verificar si el servicio se creó :
kubectl get service mysql


Paso 4  Configurar WordPress

Deploy el WordPress container

El siguiente paso es deploy su WordPress container al cluster de container, para lo cual utilizará el wordpress.yaml  que descargamos en la preparación.  El manifest describe un Deployment con una sola instance de WordPress pod,  este container lee la variable de entorno WORDPRESS_DB_PASSWORD  del Secret database password que definimos en el paso anterior.   También se configura que el container WordPress se comunicara con MySQL con la address mysql:3306, este valor se puede ver definido en la variable de entorno WORDPRESS_DB_HOST,  lo que nos permite referirnos a la database como mysql es el Kubernetes DNS que permite a los pods comunicarse con un Service por su nombre.
Para implementar el manifest file debemos ejecutar el comando
kubectl create -f wordpress.yaml

Verifique al finalizar que el pod este funcionando luego de que se le attach el persistent disk al compute node,  puede tomar unos minutos; use el comando
kubectl get pod -l app=wordpress

Exponer o publicar el WordPress Service

En los pasos previos se ha implementado un container WordPress que no puede ser accesado desde afuera del cluster ya que no posee una IP Externa.  Para exponer su aplicación WordPress a tráfico público desde internet usando un load balancer (cuidado, genera costos en su facturación) será necesario un Service de type:LoadBalancer

El wordpress-service.yaml contiene el manifest para este servicio y se redacta así :
apiVersion: v1
kind: Service
metadata:
 labels:
   app: wordpress
 name: wordpress
spec:
 type: LoadBalancer
 ports:
   - port: 80
     targetPort: 80
     protocol: TCP
 selector:
   app: wordpress
Para implementar este manifest file, ejecutar el comando :
kubectl create -f wordpress-service.yaml

La ejecución de este manifest creará un load balancer, que puede tomar algunos minutos.  Para verificar la IP externa por la que puede acceder a su blog desde cualquier lugar de internet utilice este comando :
kubectl get svc -l app=wordpress

Paso 5: Visita tu nuevo Blog usando WordPress

Asegurate de anotar la EXTERNAL_IP que aparece en tu cluster y abre un navegador para ver funcionando la pantalla de instalación de WordPress.
Instala WordPress y guarda la ip, a continuación haremos una prueba de verificación del funcionamiento de los Persistent Disk.
Para poder validar mejor la siguiente prueba te sugiero escribas un post en el Wordpress recién creado, guardes la ip externa y continuemos con el siguiente paso.

Paso 6 :  Test el resguardo de la Data en caso de Fallos

Con persistent disks, la data vive afuera del application container(similar a los docker data volume containers); cuando un container no es accesible/funcional y se reschedule a otra compute instance por Kubernetes, la Engine Container permitirá que el persistent disk este disponible para la instancia que inicie ejecución en el pod.

Veamos los pod que se estan ejecutando en el project con
kubectl get pods -o=wide

Podrá observar a los 2 pod ejecutandose :  el mysql y el wordpress (cada uno tendrá un nombre automaticamente asignado por el sistema) es importante que esten READY 1/1,  con su STATUS de Running.

Ahora el momento de la verdad !!!,      
Vamo a hacer algo impensable, borraremos el mysql pod con el comando
kubectl delete pod -l app=mysql

Una vez eliminado el mysql pod, el Deployment controller se dará cuenta de que el pod ya no esta funcional y comenzará a recrear el pod. Es muy probable que un nuevo mysql pod inicie en un node diferente al que estaba ejecutándose anteriormente.
Ejecute nuevamente el comando para ver los pod que están activos y verá que el mysql pod esta ya scheduled en una compute instance diferente.  

Paso 7: Actualizar la application images

Cuando se implementa software, es muy importante mantenerlo actualizado;  por ejemplo pueden surgir vulnerabilidades en la versión de WordPress que tienes instalado,  y deberás entonces actualizar la versión en producción.  Para hacerlo solo tienes que encontrar una nueva image en Docker hub de Wordpress y actualizar tu image:value en el manifest wordpress.yaml
Una vez has hecho el cambio, lo puedes actualizar con el siguiente comando
kubectl apply -f wordpress.yaml

Paso 8: Limpieza, borrar todos los objetos creados en este tutorial.

Despues de que has finalizado el tutorial y te has maravillado de lo que Google Cloud y Kubernets es capaz, te recomiendo consideres seguir los siguientes pasos para prevenir cargos a tu facturación de tu cuenta.  Este servidor no se hace responsable bajo ninguna circunstancia por cargos surgidos por seguir y aplicar este tutorial.
  • Delete the service: Este paso quitará y borrara el Cloud Load Balancer que se cre para el Service,  ejecutar :
    kubectl delete service wordpress
  • Espera que el Load Balancer que se provisiono para WordPress Service sea borrado,  asegurate de que haya finalizado la tarea de eliminación usando el siguiente comando
    gcloud compute forwarding-rules list
  • Borra el container cluster.  Este paso eliminará los recursos que hacen el cluster de containers, como por ejemplo las compute instances,  disks y network resources.
    gcloud container clusters delete hello
  • Delete the persistent disks: Este paso borra los disks creado para las aplicaciones WordPress y MySQL
    gcloud compute disks delete mysql-disk wordpress-disk


Quiero compartirte este video que explica de una manera sencilla Kubernete :



Espero este tutorial te sea útil,  apreciaré lo compartas y tus opiniones al respecto.




Comments

Popular posts from this blog

Guía de instalación y configuración de Elixir Phoenix en Linux Pop 21 o Ubuntu 20.04

Instalar Frappe y ErpNext usando Docker developer mode en Linux y Mac

Configurar entorno de desarrollo para Django y Postgres con VSCode plugins