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 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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

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

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

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

    Descubre cómo puedes habilitar la facturación

  4. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

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

    Descubre cómo puedes habilitar la facturación

  6. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, 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 con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  7. 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 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.
  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/quickstarts/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 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.

  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
    

    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

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

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.

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

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

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

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

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el 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.

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

¿Qué sigue?