Instalando WordPress con Kubernetes en Google Cloud usando persistent disks
Recursos a utilizar
- Cuenta funcional de Google Cloud.
- Google Cloud Shell
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