Desplegar WordPress en GKE con Persistent Disk y Cloud SQL

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

  1. 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.
  2. Asigna a la variable de entorno PROJECT_ID el Google Cloud ID de tu proyecto (project-id).

    export PROJECT_ID=project-id
    

  3. Descarga los archivos de manifiesto de la aplicación desde el repositorio de GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Cambia al directorio que contiene el archivo wordpress-persistent-disks:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. 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.

  1. 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

  1. En Cloud Shell, crea una instancia llamada mysql-wordpress-instance:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 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)')
    
  3. Crea una base de datos para que WordPress almacene sus datos:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. 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

  1. 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
    
  2. 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)')
    
  3. 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
    
  4. 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.

  5. 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
    
  6. 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.

  1. Prepara el archivo sustituyendo la variable de entorno INSTANCE_CONNECTION_NAME:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. 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.

  3. 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.

  1. 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.

  2. Monitoriza la implementación y espera a que se asigne una dirección IP externa al servicio:

    kubectl get svc -l app=wordpress --watch
    
  3. 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
    
  4. 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.

  1. 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
    
  2. En la página Instalación de WordPress, selecciona un idioma y haz clic en Continuar.

  3. Completa la página Información necesaria y, a continuación, haz clic en Instalar WordPress.

  4. Haz clic en Log In (Iniciar sesión).

  5. Introduce el nombre de usuario y la contraseña que hayas creado previamente.

  6. Ahora tienes un sitio de blog. Para visitar tu blog, ve a la siguiente URL en tu navegador:

    http://external-ip-address