En este instructivo, se muestra cómo configurar una implementación de WordPress de una sola réplica en Google Kubernetes Engine (GKE) mediante una base de datos MySQL. En lugar de instalar MySQL, usa Cloud SQL, que proporciona una versión administrada de MySQL. WordPress utiliza PersistentVolumes
(PV) y PersistentVolumeClaims
(PVC) para almacenar datos.
Un PV es una representación del volumen de almacenamiento en el clúster que aprovisiona un administrador o que aprovisiona dinámicamente Kubernetes para cumplir con una solicitud realizada en un PVC. Un PVC es una solicitud de almacenamiento de una determinada clase de almacenamiento que realiza un usuario y que se puede cumplir con un PV. PV y PVC son independientes del ciclo de vida del pod y conservan los datos cuando se reinicia, reprograma y hasta cuando se eliminan los pods. WordPress usa Google Persistent Disk como almacenamiento para respaldar los PVs
.
Antecedentes
WordPress es una herramienta de blog que usa una base de datos relacional para almacenar los artículos de blog y sus metadatos y objetos relacionados, y el sistema de archivos local para almacenar elementos, como las imágenes en una entrada de blog. En este instructivo, se usa la imagen oficial de Docker de WordPress que se encuentra en Docker Hub.
En general, el sistema de archivos raíz de un contenedor no es adecuado para almacenar datos persistentes. Los contenedores que ejecutas en GKE suelen ser entidades desechables; y el administrador del clúster puede borrar, expulsar o reprogramar cualquier contenedor que deje de estar disponible debido a una falla en el nodo a otras causas. Cuando los nodos fallan, se pierden todos los datos almacenados en el sistema de archivos raíz de un contenedor.
El uso de PV con respaldo de Persistent Disk te permite almacenar los datos de la plataforma de WordPress fuera de los contenedores. De esta manera, los datos se mantienen constantes, incluso si se borran los contenedores. Con la clase de almacenamiento predeterminada, tu disco persistente (y, por lo tanto, tus datos) no se mueve con tu pod si se reprograma a otro nodo. Existen diferentes maneras de manejar el movimiento de los datos, pero no tratamos ese tema en este instructivo. Para obtener más información, consulta Volúmenes persistentes con Persistent Disk.
WordPress requiere un PV para almacenar datos. En este instructivo, usas la clase de almacenamiento predeterminada con el fin de crear un disco persistente de Google de manera dinámica y crear un PVC para la implementación.
Objetivos
- Crear un clúster de GKE
- Crear un PV y un PVC con respaldo de Persistent Disk
- Crear una instancia de Cloud SQL para MySQL
- Implementar WordPress
- Configurar tu blog de WordPress
Costos
En este instructivo se usan los siguientes componentes facturables de Google Cloud Platform:
Usa la calculadora de precios a fin de generar una estimación de los costos según el uso previsto. Los usuarios nuevos de GCP pueden optar a una prueba gratuita.
Cuando finalices este instructivo, puedes borrar los recursos creados para evitar la continuidad de la facturación. Para obtener más detalles, consulta Limpieza.
Antes de comenzar
-
Accede a tu Cuenta de Google.
Si todavía no tienes una cuenta, regístrate para obtener una nueva.
-
Selecciona o crea un proyecto de GCP.
-
Comprueba que la facturación esté habilitada en tu proyecto.
-
In the Google Cloud Console, go to Cloud Shell.
At the bottom of the Cloud Console, a Cloud Shell session opens and displays a command-line prompt. Cloud Shell is a shell environment with the Cloud SDK already installed, including the
gcloud
command-line tool, and with values already set for your current project. It can take a few seconds for the session to initialize. - En Cloud Shell, habilita las API de administrador de GKE y Cloud SQL:
gcloud services enable container.googleapis.com sqladmin.googleapis.com
Configura tu entorno
En Cloud Shell, configura la zona predeterminada para la herramienta de línea de comandos de
gcloud
:gcloud config set compute/zone zone
Reemplaza lo siguiente:
zone
: Elige la zona más cercana a ti. Para obtener más información, consulta Geografía y regiones.
Descarga los archivos de manifiesto de la aplicación desde el repositorio de GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Cambia al directorio con el archivo
wordpress-persistent-disks
:cd kubernetes-engine-samples/wordpress-persistent-disks
Establece la variable de entorno
WORKING_DIR
:WORKING_DIR=$(pwd)
Para este instructivo, crearás objetos Kubernetes mediante archivos de manifiesto en formato YAML.
Crea un clúster de GKE
Crearás un clúster de GKE para alojar tu contenedor de aplicaciones de WordPress.
En Cloud Shell, crea un clúster denominado
persistent-disk-tutorial
que tenga tres nodos:CLUSTER_NAME=persistent-disk-tutorial gcloud container clusters create $CLUSTER_NAME \ --num-nodes=3 --enable-autoupgrade --no-enable-basic-auth \ --no-issue-client-certificate --enable-ip-alias --metadata \ disable-legacy-endpoints=true
Crea un PV y un PVC con respaldo de Persistent Disk
Con el fin de crear el almacenamiento requerido para WordPress, debes crear un PVC. GKE tiene instalado un recurso predeterminado de StorageClass
que te permite aprovisionar dinámicamente los PV con respaldo de Persistent Disk. Usa el archivo wordpress-volumeclaim.yaml
con el fin de crear los PVC necesarios para la implementación.
Este archivo de manifiesto describe un PVC que solicita 200 GB de almacenamiento. No se definió un recurso StorageClass
en el archivo, por lo que este PVC usa el recurso predeterminado StorageClass
para aprovisionar un PV con el respaldo de Persistent Disk.
En Cloud Shell, implementa el archivo de manifiesto:
kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
Puede tardar hasta diez segundos en aprovisionar el PV con el respaldo de Persistent Disk y vincularlo a tu PVC.
Cuando se completa ese proceso, el resultado es similar al siguiente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-volumeclaim Bound pvc-89d49350-3c44-11e8-80a6-42010a800002 200G RWO standard 5s
Crea una instancia de Cloud SQL para MySQL
En Cloud Shell, crea una instancia denominada
mysql-wordpress-instance
:INSTANCE_NAME=mysql-wordpress-instance gcloud sql instances create $INSTANCE_NAME
Agrega el nombre de la conexión de la instancia como una variable de entorno:
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \ --format='value(connectionName)')
Crea un usuario de base de datos denominado
wordpress
y una contraseña para WordPress con el fin de autenticar la instancia:CLOUD_SQL_PASSWORD=$(openssl rand -base64 18) gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \ --password $CLOUD_SQL_PASSWORD
Si cierras tu sesión de Cloud Shell, pierdes la contraseña. Anótala porque la necesitarás más adelante en este instructivo.
Terminaste de configurar la base de datos para tu nuevo blog de WordPress.
Implementa WordPress
Antes de implementar WordPress, debes crear una cuenta de servicio. Debes crear un secreto de Kubernetes que contenga las credenciales de la cuenta de servicio y otro para las credenciales de la base de datos.
Configura una cuenta de servicio y crea secretos
Para permitir que tu aplicación de WordPress acceda a la instancia de MySQL a través de un proxy de Cloud SQL, crea una cuenta de servicio:
SA_NAME=cloudsql-proxy gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
Agrega la dirección de correo electrónico de la cuenta de servicio como una variable de entorno:
SA_EMAIL=$(gcloud iam service-accounts list \ --filter=displayName:$SA_NAME \ --format='value(email)')
Agrega el rol
cloudsql.client
a tu cuenta de servicio:gcloud projects add-iam-policy-binding $DEVSHELL_PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
Crea una clave para la cuenta de servicio:
gcloud iam service-accounts keys create $WORKING_DIR/key.json \ --iam-account $SA_EMAIL
Este comando descarga una copia del archivo
key.json
.Crea un secreto de Kubernetes para las credenciales de MySQL:
kubectl create secret generic cloudsql-db-credentials \ --from-literal username=wordpress \ --from-literal password=$CLOUD_SQL_PASSWORD
Crea un secreto de Kubernetes para las credenciales de la cuenta de servicio:
kubectl create secret generic cloudsql-instance-credentials \ --from-file $WORKING_DIR/key.json
Implementa WordPress
El siguiente paso es implementar tu contenedor de WordPress en el clúster de GKE.
En el archivo de manifiesto wordpress_cloudsql.yaml
, se describe una implementación que crea un pod único mediante la ejecución de un contenedor con una instancia de WordPress. Este contenedor lee la variable de entorno WORDPRESS_DB_PASSWORD
que contiene el secreto cloudsql-db-credentials
que creaste.
Este archivo de manifiesto también configura el contenedor de WordPress para que se comunique con MySQL a través del proxy de Cloud SQL que se ejecuta en el contenedor del archivo adicional.
El valor de la dirección del host se configura en la variable de entorno WORDPRESS_DB_HOST
.
Para preparar el archivo de implementación, reemplaza las variables de entorno:
cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \ $WORKING_DIR/wordpress_cloudsql.yaml
Implementa el archivo de manifiesto
wordpress_cloudsql.yaml
:kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
La implementación de este archivo de manifiesto tarda unos minutos mientras Persistent Disk se adjunta al nodo de procesamiento.
Mira la implementación para ver el cambio de estado a
running
:kubectl get pod -l app=wordpress --watch
Cuando el resultado muestre el siguiente estado, podrás continuar con el siguiente paso.
NAME READY STATUS RESTARTS AGE wordpress-387015-02xxb 2/2 Running 0 9h
Expón el servicio de WordPress
En el paso anterior, implementaste un contenedor de WordPress, pero actualmente, no se puede acceder a este desde fuera del clúster porque no tiene una dirección IP externa. Puedes exponer tu aplicación de WordPress al tráfico de Internet mediante la creación y configuración de un balanceador de cargas.
- Crea un servicio de
type:LoadBalancer
:kubectl create -f $WORKING_DIR/wordpress-service.yaml
. Se tarda unos minutos en crear un balanceador de cargas.
Mira la implementación y espera a que el servicio tenga asignada una dirección IP externa:
kubectl get svc -l app=wordpress --watch
Cuando el resultado muestre una dirección IP externa, puedes continuar con el siguiente paso:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
Toma nota de la dirección IP porque la necesitarás más adelante.
Configura tu blog de WordPress
En esta sección, configurarás tu blog de WordPress.
En tu navegador, dirígete a la siguiente URL:
http://external-ip-address
Reemplaza lo siguiente:
external-ip-address
: la dirección IP externa del servicio que expone tu instancia de WordPress
En la página Instalación de WordPress, selecciona un idioma y, luego, haz clic en Continuar.
Completa la página Información necesaria y, luego, haz clic en Instalar WordPress.
Haz clic en Acceder.
Ingresa el nombre de usuario y la contraseña que creaste anteriormente.
Ahora tienes un sitio de blog. Para visitar tu blog, en el navegador, dirígete a la siguiente URL:
http://external-ip-address
Limpieza
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:
Cómo borrar el proyecto
- En la GCP Console, dirígete a la página Proyectos.
- En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar.
- En el cuadro de diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra los recursos individuales
Si usaste un proyecto existente y no quieres borrarlo, borra los recursos individuales.
Borra el servicio:
kubectl delete service wordpress
Espera a que se borre el balanceador de cargas aprovisionado para el servicio de
wordpress
. El balanceador de cargas se borra de forma asíncrona en segundo plano.Mira el proceso de eliminación:
watch gcloud compute forwarding-rules list
Cuando aparezca el siguiente resultado, sabrás que el balanceador de cargas se borró:
Listed 0 items.
Borra la implementación:
kubectl delete deployment wordpress
Borra el PVC para WordPress:
kubectl delete pvc wordpress-volumeclaim
Este comando también borra de manera automática el PV y el disco persistente.
Borra el clúster de GKE:
gcloud container clusters delete $CLUSTER_NAME
Borra la instancia de Cloud SQL:
gcloud sql instances delete $INSTANCE_NAME
Quita la función de la cuenta de servicio:
gcloud projects remove-iam-policy-binding $DEVSHELL_PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
Borra la cuenta de servicio:
gcloud iam service-accounts delete $SA_EMAIL
¿Qué sigue?
- Usa GKE para implementar aplicaciones con discos persistentes regionales.
- Configura una dirección IP estática y un nombre de dominio para tu aplicación.
Explora otros instructivos de Kubernetes Engine.
Prueba otras funciones de Google Cloud Platform por tu cuenta. Consulta nuestros instructivos.