Usa Kubernetes Engine para implementar apps con discos persistentes regionales

En este instructivo, se muestra cómo implementar una app con alta disponibilidad mediante la implementación de WordPress con discos persistentes regionales en Google Kubernetes Engine. Los discos persistentes regionales proporcionan replicación síncrona entre dos zonas.

Los discos persistentes regionales proporcionan replicación síncrona entre dos zonas

Objetivos

  • Crear un clúster GKE regional
  • Crear un recurso StorageClass de Kubernetes configurado para zonas repetidas
  • Implementar WordPress con un disco regional que utiliza StorageClass
  • Borrar un nodo para simular un error en la zona
  • Verificar que la aplicación de WordPress y los datos migren correctamente a otra zona repetidas.

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.

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 Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyecto

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

    Descubre cómo puedes habilitar la facturación

  4. Habilita las API de Compute Engine and GKE.

    Habilita las API

Crea el clúster de GKE

  1. Abre Cloud Shell:

    Abrir Cloud Shell

    El resto de este instructivo se ejecuta desde Cloud Shell.

  2. Crea un clúster de GKE regional que abarque dos zonas en la región us-west1:

    CLUSTER_VERSION=$(gcloud container get-server-config \
      --region us-west1 --format='value(validMasterVersions[0])')
    gcloud container clusters create repd \
      --cluster-version=${CLUSTER_VERSION} \
      --machine-type=n1-standard-4 \
      --region=us-west1 \
      --num-nodes=1 \
      --node-locations=us-west1-b,us-west1-c
    

Ahora tienes un clúster regional con un nodo en cada zona. El comando gcloud también configuró de manera automática el comando kubectl para conectarse al clúster.

Implementa la app con un disco regional

En esta sección, instalas Helm, creas el StorageClass de Kubernetes, que utiliza el disco persistente regional y luego implementas WordPress.

Instalar e inicializar Helm para instalar el paquete de tablas

El paquete de tablas, que se instala con Helm, contiene todo lo necesario para ejecutar WordPress.

  1. Instala Helm de manera local en tu instancia de Cloud Shell:

    curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get-helm-3 > get_helm.sh
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  2. Agrega el repositorio de Bitnami:

    helm repo add bitnami https://charts.bitnami.com/bitnami
    

Helm ya está instalado en tu clúster.

Crear el StorageClass

En esta sección, creas el StorageClass utilizado por la tabla para definir las zonas del disco regional. Las zonas detalladas en el StorageClass coincidirán con las zonas del clúster de GKE.

  1. Crea un StorageClass para el disco regional:

    kubectl apply -f - <<EOF
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: repd-west1-b-c
    provisioner: kubernetes.io/gce-pd
    parameters:
      type: pd-ssd
      replication-type: regional-pd
    volumeBindingMode: WaitForFirstConsumer
    allowedTopologies:
    - matchLabelExpressions:
      - key: failure-domain.beta.kubernetes.io/zone
        values:
        - us-west1-b
        - us-west1-c
    EOF
    

Ahora tienes una StorageClass capaz de aprovisionar PersistentVolumes que se replican en las zonas us-west1-b y us-west1-c.

Implementa WordPress

En esta sección, Kubernetes adjunta automáticamente el disco persistente a un nodo apropiado en una de las zonas de disponibilidad.

  1. Implementa la tabla de WordPress configurada para utilizar el StorageClass que creaste anteriormente:

    helm install wp-repd \
      --set persistence.storageClass=repd-west1-b-c \
      --set global.storageClass=repd-west1-b-c \
      bitnami/wordpress
    
  2. Ejecuta el siguiente comando, que espera la creación de la dirección IP externa del balanceador de cargas de servicio:

    while [[ -z $SERVICE_IP ]]; \
      do SERVICE_IP=$(kubectl get svc wp-repd-wordpress \
      -o jsonpath='{.status.loadBalancer.ingress[].ip}'); \
      echo "Waiting for service external IP..."; sleep 2; \
    done;
    echo http://$SERVICE_IP/admin
    
  3. Controla que el disco persistente se haya creado:

    while [[ -z $PV ]]; do PV=$(kubectl get pvc \
      wp-repd-wordpress -o jsonpath='{.spec.volumeName}'); \
      echo "Waiting for PV..."; sleep 2; \
    done
    kubectl describe pv $PV
    
  4. Abre la página de administrador de WordPress en el navegador desde el vínculo que muestra el resultado del comando:

    echo http://$SERVICE_IP/admin
  5. Accede con el nombre de usuario y la contraseña que muestra el resultado del comando:

    cat - <<EOF
    Username: user
    Password: $(kubectl get secret \
      --namespace default wp-repd-wordpress \
      -o jsonpath="{.data.wordpress-password}" | base64 --decode)
    EOF
    

Ahora tienes una implementación funcional de WordPress respaldada con los discos persistentes regionales en dos zonas.

Simular un error en la zona

En esta sección, debes simular un error en la zona y observar cómo Kubernetes traslada tu carga de trabajo a otra zona y adjunta el disco regional a un nuevo nodo.

Si el escalador automático del clúster está habilitado para el clúster, no uses el procedimiento que se describe en esta sección a fin de simular una falla en la zona.

  1. Obtén el nodo actual del pod de WordPress:

    NODE=$(kubectl get pods \
      -l app.kubernetes.io/name=wordpress \
      -o jsonpath='{.items..spec.nodeName}')
    
    ZONE=$(kubectl get node $NODE -o jsonpath="{.metadata.labels['failure-domain\.beta\.kubernetes\.io/zone']}")
    
    IG=$(gcloud compute instance-groups list --filter="name~gke-repd-default-pool zone:(${ZONE})" --format='value(name)')
    
    echo "Pod is currently on node ${NODE}"
    
    echo "Instance group to delete: ${IG} for zone: ${ZONE}"
    
  2. Simula un error de zona; para ello, quita el grupo de instancias del nodo en donde se está ejecutando WordPress:

    gcloud compute instance-groups managed delete ${IG} --zone ${ZONE}
  3. Verifica que tanto el pod de WordPress como el volumen persistente migren al nodo ubicado en la otra zona:

    kubectl get pods -l app=wp-repd-wordpress -o wide

    Asegúrate de que el nodo que se muestra difiera del noto en el paso anterior:

  4. Abre la página de administración de WordPress en tu navegador desde el vínculo que se muestra en el resultado del comando:

    echo http://$SERVICE_IP/admin

    Has adjuntado un disco persistente regional a un nodo que está en una zona diferente.

Realice una limpieza

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.

  1. Quita la aplicación de WordPress y el disco persistente:

    helm uninstall wp-repd
  2. Espera a que se quiten todos los volúmenes persistentes:

    while [[ $(kubectl get pv  | wc -l) -gt 1 ]]; \
      do echo "Waiting for PV deletion..."; sleep 2; \
    done
  3. Borra el clúster de GKE:

    gcloud container clusters delete repd --region=us-west1

Pasos siguientes