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 utiliza 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 dinámicamente Kubernetes para cumplir con una solicitud realizada en un PVC. Un PVC es una solicitud de almacenamiento de una determinada clase de almacenamiento que realiza un usuario y que se puede cumplir con un PV. PV y PVC son independientes del ciclo de vida del pod y conservan los datos cuando se reinicia, reprograma y hasta cuando se eliminan los pods. WordPress usa Google Persistent Disk como almacenamiento para respaldar los PVs.

Antecedentes

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, 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 Platform:

Usa la calculadora de precios a fin de generar una estimación de los costos según el uso previsto. Los usuarios nuevos de GCP pueden optar a una prueba gratuita.

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar la continuidad de la facturación. Para obtener más detalles, consulta 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. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

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

    Descubre cómo puedes habilitar la facturación

  4. In the Google Cloud Console, go to Cloud Shell.

    Go to Cloud Shell

    At the bottom of the Cloud Console, a Cloud Shell session opens and displays a command-line prompt. Cloud Shell is a shell environment with the Cloud SDK already installed, including the gcloud command-line tool, and with values already set for your current project. It can take a few seconds for the session to initialize.

  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:

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

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

    cd kubernetes-engine-samples/wordpress-persistent-disks
    
  4. Establece la variable de entorno WORKING_DIR:

    WORKING_DIR=$(pwd)
    

    Para este instructivo, crearás objetos Kubernetes mediante archivos de manifiesto en formato YAML.

Crea un clúster de GKE

Crearás un clúster de GKE para alojar tu contenedor de aplicaciones de WordPress.

  • En Cloud Shell, crea un clúster denominado 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 respaldo de Persistent Disk

Con el fin de crear el almacenamiento requerido para WordPress, debes crear un PVC. GKE tiene instalado un recurso predeterminado de StorageClass que te permite aprovisionar dinámicamente los PV con respaldo de Persistent Disk. Usa el archivo wordpress-volumeclaim.yaml con el fin de crear los PVC necesarios para la implementación.

Este archivo de manifiesto 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.

    Cuando se completa ese proceso, el resultado es 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 denominada 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 denominado wordpress y una contraseña para WordPress con el fin de autenticar 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, pierdes 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 el rol cloudsql.client a tu cuenta de servicio:

    gcloud projects add-iam-policy-binding $DEVSHELL_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.

En el archivo de manifiesto wordpress_cloudsql.yaml, se describe una implementación que crea un pod único mediante la ejecución de 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 las variables de entorno:

    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 tarda unos minutos mientras Persistent Disk se adjunta 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 el resultado 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 actualmente, no se puede acceder a este desde fuera del clúster porque no tiene una dirección IP externa. Puedes exponer tu aplicación de WordPress al tráfico de Internet mediante la creación y configuración de un balanceador de cargas.

  • Crea un servicio de type:LoadBalancer: kubectl create -f $WORKING_DIR/wordpress-service.yaml. Se tarda unos minutos en crear un balanceador de cargas.
  1. 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 el resultado muestre una dirección IP externa, puedes continuar con el siguiente paso:

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    

    Toma nota de la dirección IP porque la necesitarás más adelante.

Configura tu blog de WordPress

En esta sección, configurarás tu blog de WordPress.

  1. En tu navegador, dirígete a la siguiente URL:

    http://external-ip-address
    

    Reemplaza lo siguiente:

    • external-ip-address: la dirección IP externa del servicio que expone tu instancia de WordPress
  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:

Cómo borrar el proyecto

  1. En la GCP Console, dirígete a la página Proyectos.

    Ir a la página Proyectos

  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, 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 servicio de 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 $DEVSHELL_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?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Instructivos de Kubernetes Engine