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.

    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. 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 debe ejecutar desde Cloud Shell.

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

    CLUSTER_VERSION=$(gcloud beta container get-server-config --region us-west1 --format='value(validMasterVersions[0])')
    
    export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
    gcloud beta 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, instalarás Helm, crearás la StorageClass de Kubernetes que usa el disco persistente regional y, luego, implementarás 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 > get_helm.sh
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  2. Inicializa Helm:

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-cluster-rule \
      --clusterrole=cluster-admin \
      --serviceaccount=kube-system:tiller
    helm init --service-account=tiller
    until (helm version --tiller-connection-timeout=1 >/dev/null 2>&1); do echo "Waiting for tiller install..."; sleep 2; done && echo "Helm install complete"
    

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 una 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-standard
      replication-type: regional-pd
    volumeBindingMode: WaitForFirstConsumer
    allowedTopologies:
    - matchLabelExpressions:
      - key: failure-domain.beta.kubernetes.io/zone
        values:
        - europe-west1-b
        - europe-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 --name wp-repd \
      --set persistence.storageClass=repd-west1-b-c \
      stable/wordpress \
      --set mariadb.persistence.storageClass=repd-west1-b-c
    
  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.

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

    NODE=$(kubectl get pods -l app=wp-repd-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.

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:

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

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

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

    export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
    gcloud beta container clusters delete repd --region=us-west1

Próximos pasos