En este tutorial se muestra cómo configurar un despliegue de WordPress de una sola réplica en Google Kubernetes Engine (GKE) mediante una base de datos MySQL. En lugar de instalar MySQL, puedes usar Cloud SQL, que proporciona una versión gestionada 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 Kubernetes aprovisiona de forma dinámica para satisfacer una solicitud realizada en un PVC. Un PVC es una solicitud de almacenamiento de una determinada clase de almacenamiento por parte de un usuario que puede satisfacer un PV. Los PVs y los PVCs son independientes de los ciclos de vida de los Pods y conservan los datos aunque se reinicien, se vuelvan a programar o incluso se eliminen los Pods. WordPress usa discos persistentes como almacenamiento para respaldar los PVs.
Fondo
WordPress es una herramienta de blogging que usa una base de datos relacional para almacenar los artículos de blog y sus objetos y metadatos relacionados, así como el sistema de archivos local para almacenar recursos, como imágenes en una entrada de blog. En este tutorial se usa la imagen Docker oficial de WordPress de Docker Hub.
Por lo 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 efímeras, y el gestor de clústeres puede eliminar, desalojar o reprogramar cualquier contenedor que deje de estar disponible debido a fallos de nodos u otras causas. Cuando fallan los nodos, se pierden todos los datos guardados en el sistema de archivos raíz de un contenedor.
Si usas PVs respaldados por Persistent Disk, puedes almacenar los datos de tu plataforma WordPress fuera de los contenedores. De esta forma, aunque se eliminen los contenedores, sus datos se conservarán. Con la clase de almacenamiento predeterminada, tu disco persistente (y, por lo tanto, tus datos) no se mueve con tu pod si se vuelve a programar en otro nodo. Hay varias formas de mover los datos, pero no se incluyen en este tutorial. Para obtener más información, consulta Volúmenes persistentes con discos persistentes.
WordPress necesita un PV para almacenar datos. En este tutorial, usarás la clase de almacenamiento predeterminada para crear de forma dinámica un disco persistente y una reclamación de volumen persistente para la implementación.
Configurar un entorno
En Cloud Shell, define la región predeterminada de Google Cloud CLI:
gcloud config set compute/region region
Haz los cambios siguientes:
region
: elige la región que esté más cerca de ti. Para obtener más información, consulta Regiones y zonas.
Asigna a la variable de entorno
PROJECT_ID
el Google Cloud ID de tu proyecto (project-id).export PROJECT_ID=project-id
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 que contiene el archivo
wordpress-persistent-disks
:cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
Define la variable de entorno
WORKING_DIR
:WORKING_DIR=$(pwd)
En este tutorial, crearás objetos de Kubernetes mediante archivos de manifiesto en formato YAML.
Crear un clúster de GKE
Crea un clúster de GKE para alojar el contenedor de tu aplicación 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 creado, conéctate al nuevo clúster:
gcloud container clusters get-credentials $CLUSTER_NAME --location REGION
Crear un PV y un PVC respaldados por un disco persistente
Crea un PVC como almacenamiento necesario para WordPress.
GKE tiene instalado un recurso StorageClass
predeterminado que te permite aprovisionar dinámicamente PVs respaldados por Persistent Disk. Utiliza el archivo wordpress-volumeclaim.yaml
para crear los PVCs necesarios para la implementación.
Este archivo de manifiesto describe un PVC que solicita 200 GB de almacenamiento. No se ha definido ningún recurso StorageClass
en el archivo, por lo que este PVC usa el recurso StorageClass
predeterminado para aprovisionar un PV respaldado por Persistent Disk.
En Cloud Shell, despliega el archivo de manifiesto:
kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
El aprovisionamiento del PV respaldado por Persistent Disk y su vinculación a tu PVC pueden tardar hasta diez segundos. Puedes comprobar el estado con el siguiente comando:
kubectl get persistentvolumeclaim
El resultado muestra un PersistentVolumeClaim con el estado
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 tutorial.
Crear 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
Añade el nombre de conexión de la instancia como 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 la sesión de Cloud Shell, perderás la contraseña. Anota la contraseña, ya que la necesitarás más adelante en el tutorial.
Has completado la configuración de la base de datos de tu nuevo blog de WordPress.
Desplegar WordPress
Antes de implementar WordPress, debes crear una cuenta de servicio. Crea un secreto de Kubernetes para almacenar las credenciales de la cuenta de servicio y otro secreto para almacenar las credenciales de la base de datos.
Configurar una cuenta de servicio y crear secretos
Para permitir que tu aplicación 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
Añade la dirección de correo de la cuenta de servicio como variable de entorno:
SA_EMAIL=$(gcloud iam service-accounts list \ --filter=displayName:$SA_NAME \ --format='value(email)')
Añade el rol
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
Desplegar WordPress
El siguiente paso es implementar el contenedor de WordPress en el clúster de GKE.
El archivo de manifiesto wordpress_cloudsql.yaml
describe un Deployment que crea un solo Pod que 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 has creado.
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 sidecar.
El valor de la dirección del host se define en la variable de entorno WORDPRESS_DB_HOST
.
Prepara el archivo sustituyendo la variable de entorno
INSTANCE_CONNECTION_NAME
:cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \ $WORKING_DIR/wordpress_cloudsql.yaml
Despliega el archivo de manifiesto
wordpress_cloudsql.yaml
:kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
Se tarda unos minutos en implementar este archivo de manifiesto mientras se adjunta un disco persistente al nodo de cálculo.
Supervisa la implementación para ver si el estado cambia a
running
:kubectl get pod -l app=wordpress --watch
Cuando la salida muestre el estado
Running
, puedes pasar al siguiente paso.NAME READY STATUS RESTARTS AGE wordpress-387015-02xxb 2/2 Running 0 2m47s
Exponer el servicio de WordPress
En el paso anterior, has desplegado un contenedor de WordPress, pero actualmente no se puede acceder a él desde fuera del clúster porque no tiene una dirección IP externa. Puedes exponer tu aplicación WordPress al tráfico de Internet creando y configurando un servicio de Kubernetes con un balanceador de carga externo adjunto. Para obtener más información sobre cómo exponer aplicaciones mediante servicios en GKE, consulta la guía práctica.
Crea un servicio de
type:LoadBalancer
:kubectl create -f $WORKING_DIR/wordpress-service.yaml
La creación de un balanceador de carga tarda unos minutos.
Monitoriza la implementación y espera a que se asigne una dirección IP externa al servicio:
kubectl get svc -l app=wordpress --watch
Cuando el resultado muestre una dirección IP externa, puedes pasar al paso siguiente. Ten en cuenta que tu IP externa es diferente del siguiente ejemplo.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
Anota el campo de dirección
EXTERNAL_IP
para usarlo más adelante.
Configurar un blog de WordPress
En esta sección, configurará su blog de WordPress.
En el navegador, ve a la siguiente URL y sustituye 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 haz clic en Continuar.
Completa la página Información necesaria y, a continuación, haz clic en Instalar WordPress.
Haz clic en Log In (Iniciar sesión).
Introduce el nombre de usuario y la contraseña que hayas creado previamente.
Ahora tienes un sitio de blog. Para visitar tu blog, ve a la siguiente URL en tu navegador:
http://external-ip-address