Implementa WordPress en GKE con Persistent Disk y Cloud SQL

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 Google Persistent Disk como almacenamiento para respaldar los PVs.

Información general

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 a fin de almacenar recursos, como las fotos 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 el 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:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

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

  1. 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. Por ejemplo: us-west1-a Para obtener más información, consulta Regiones y zonas.
  2. Configura la variable de entorno PROJECT_ID como el ID de tu proyecto de Google Cloud (project-id).

    export PROJECT_ID=project-id
    

  3. Descarga los archivos de manifiesto de la app desde el repositorio de GitHub:

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

    cd kubernetes-engine-samples/wordpress-persistent-disks
    
  5. 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 llamado 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 el respaldo de Persistent Disk

A fin de crear el almacenamiento necesario para WordPress, debes crear un PVC. 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.

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

    Cuando se complete el proceso, deberías ver un resultado 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

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

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 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)')
    
  3. 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

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

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.

Mediante este archivo de manifiesto también se 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.

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

  3. Mira la implementación para ver el cambio de estado a running:

    kubectl get pod -l app=wordpress --watch
    

    Cuando en la salida se 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, por el momento, no se puede acceder a él 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.

  1. Crea un servicio de type:LoadBalancer:

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    La creación de un balanceador de cargas toma unos minutos.

  2. Mira la implementación y espera a que el servicio tenga asignada una dirección IP externa:

    kubectl get svc -l app=wordpress --watch
    
  3. Cuando en el resultado se muestre una dirección IP externa, puedes continuar con el siguiente paso. Ten en cuenta que tu IP externa será diferente a la del ejemplo que se muestra a continuación.

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 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.

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

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

  4. Haz clic en Acceder.

  5. Ingresa el nombre de usuario y la contraseña que creaste anteriormente.

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

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y 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.

  1. Borra el servicio:

    kubectl delete service wordpress
    

    Espera a que se borre el balanceador de cargas aprovisionado para el servicio 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.
    
  2. Borra la implementación:

    kubectl delete deployment wordpress
    
  3. 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.

  4. Borra el clúster de GKE:

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Borra la instancia de Cloud SQL:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. 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
    
  7. Borra la cuenta de servicio:

    gcloud iam service-accounts delete $SA_EMAIL
    

Próximos pasos