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 usa 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 Kubernetes de manera dinámica para cumplir con una solicitud realizada en un PVC. Un PVC es una solicitud de almacenamiento de una clase de almacenamiento determinada que realiza un usuario y que se puede llevar a cabo mediante un PV. Los PV y los PVC son independientes de los ciclos de vida de los Pods y conservan los datos mediante el reinicio, la reprogramación y la eliminación de Pods. WordPress usa Persistent Disk como almacenamiento para respaldar los PVs.
Fondo
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, el disco persistente (y, por lo tanto, tus datos) no se mueve con tu Pod si el este se reprograma a otro nodo. Existen diferentes maneras de controlar el movimiento de los datos, pero no abordamos 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, se usa la clase de almacenamiento predeterminada para crear un disco persistente de forma 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 documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed 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 región predeterminada para Google Cloud CLI:
gcloud config set compute/region region
Reemplaza lo siguiente:
region
: Elige la región más cercana a ti. Para obtener más información, consulta Regiones y zonas.
Configura la variable de entorno
PROJECT_ID
como el ID de tu proyecto de Google Cloud (project-id).export PROJECT_ID=project-id
Descarga los archivos de manifiesto de la app 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/quickstarts/wordpress-persistent-disks
Establece la variable de entorno
WORKING_DIR
:WORKING_DIR=$(pwd)
Para este instructivo, debes crear objetos de Kubernetes mediante archivos de manifiesto en formato YAML.
Crea un clúster de GKE
Debes crear un clúster de GKE para alojar tu contenedor de app de WordPress.
En Cloud Shell, crea un clúster de GKE llamado
persistent-disk-tutorial
:CLUSTER_NAME=persistent-disk-tutorial gcloud container clusters create-auto $CLUSTER_NAME
Una vez creada, conéctate al clúster nuevo:
gcloud container clusters get-credentials $CLUSTER_NAME --region REGION
Crea un PV y un PVC con el respaldo de Persistent Disk
Crear un PVC como almacenamiento requerido para WordPress
GKE tiene un recurso StorageClass
predeterminado instalado que te permite aprovisionar de manera dinámica los PV con el respaldo de Persistent Disk. Tienes que usar el archivo wordpress-volumeclaim.yaml
a fin de crear los PVC necesarios para la implementación.
Con este archivo de manifiesto se 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. Puedes verificar el estado con el siguiente comando:
kubectl get persistentvolumeclaim
El resultado muestra una PersistentVolumeClaim con un estado de
Pending
, similar al siguiente:NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-volumeclaim Pending standard-rwo 5s
Este PersistentVolumeClaim permanece en el estado
Pending
hasta que lo uses más adelante en este instructivo.
Crea una instancia de Cloud SQL para MySQL
En Cloud Shell, crea una instancia llamada
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 una base de datos para que WordPress almacene sus datos:
gcloud sql databases create wordpress --instance $INSTANCE_NAME
Crea un usuario de base de datos llamado
wordpress
y una contraseña para que WordPress se autentique en 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, perderás 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 app 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 la función
cloudsql.client
a tu cuenta de servicio:gcloud projects add-iam-policy-binding $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.
Con el archivo de manifiesto wordpress_cloudsql.yaml
, se describe una implementación que crea un solo pod, el cual ejecuta 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 la variable de entorno
INSTANCE_CONNECTION_NAME
: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 toma unos minutos mientras Persistent Disk se conecta al nodo de procesamiento.
Mira la implementación para ver el cambio de estado a
running
:kubectl get pod -l app=wordpress --watch
Cuando en el resultado se muestre un estado de
Running
, puedes continuar con el siguiente paso.NAME READY STATUS RESTARTS AGE wordpress-387015-02xxb 2/2 Running 0 2m47s
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 la app de WordPress al tráfico de Internet mediante la creación y la configuración de un servicio de Kubernetes con un balanceador de cargas externo adjunto. Para obtener más información sobre cómo exponer apps mediante servicios en GKE, consulta la guía práctica.
Crea un Service de
type:LoadBalancer
:kubectl create -f $WORKING_DIR/wordpress-service.yaml
La creación de un balanceador de cargas toma unos minutos.
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 en el resultado se muestre una dirección IP externa, puedes continuar con el siguiente paso. Ten en cuenta que tu IP externa es diferente en el siguiente ejemplo.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
Toma nota del campo de dirección
EXTERNAL_IP
para usarlo luego.
Configura tu blog de WordPress
En esta sección, configurarás tu blog de WordPress.
En el navegador, ve a la siguiente URL y reemplaza external-ip-address por la dirección
EXTERNAL_IP
del servicio que expone tu instancia de WordPress:http://external-ip-address
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
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
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 Service
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 $PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
Borra la cuenta de servicio:
gcloud iam service-accounts delete $SA_EMAIL
¿Qué sigue?
- Configura una dirección IP estática y un nombre de dominio para la app.
Configura un balanceador de cargas de aplicaciones externo con Ingress.
Explora otros instructivos de Kubernetes Engine.
Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.