Usar la reparación automática con aplicaciones de alta disponibilidad


En este tutorial interactivo se muestra cómo usar la reparación automática para crear aplicaciones de alta disponibilidad en Compute Engine.

Las aplicaciones de alta disponibilidad están diseñadas para satisfacer las necesidades de los clientes con una latencia y un tiempo de inactividad mínimos. La disponibilidad se ve comprometida cuando una aplicación falla o se bloquea. Los clientes de una aplicación vulnerada pueden experimentar una latencia alta o un tiempo de inactividad.

La reparación automática te permite reiniciar automáticamente las aplicaciones que se hayan visto comprometidas. Detecta rápidamente las instancias de máquinas virtuales (VMs) que han fallado y las vuelve a crear automáticamente para que se pueda volver a atender a los clientes. Con la reparación automática, ya no es necesario volver a poner en funcionamiento una aplicación manualmente después de un fallo.

Objetivos

  • Configura una comprobación del estado y una política de recuperación automática.
  • Configura un servicio web de demostración en un grupo de instancias gestionado (MIG).
  • Simula fallos en las comprobaciones del estado y observa el proceso de recuperación de la reparación automática.

Costes

En este tutorial se usan componentes facturables de Google Cloud , entre los que se incluyen los siguientes:

  • Compute Engine

Antes de empezar

    Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

    Verify that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

    Verify that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

    Si prefieres trabajar desde la línea de comandos, instala Google Cloud CLI.

    Arquitectura de la aplicación

    La aplicación incluye los siguientes componentes de Compute Engine:

    Arquitectura del sistema para una comprobación del estado y un grupo de instancias.

    Cómo comprueba el estado el servicio web de demostración

    Una comprobación de estado envía solicitudes de sondeo a una VM mediante un protocolo especificado, como HTTP(S), SSL o TCP. Para obtener más información, consulta cómo funcionan las comprobaciones del estado y las categorías, protocolos y puertos de las comprobaciones del estado.

    La comprobación del estado de este tutorial es una comprobación del estado de HTTP que comprueba la ruta HTTP /health en el puerto 80. En el caso de las comprobaciones del estado HTTP, la solicitud de sondeo solo se supera si la ruta devuelve una respuesta HTTP 200 (OK). En este tutorial, el servidor web de demostración define la ruta /health para devolver una respuesta HTTP 200 (OK) cuando está en buen estado o una respuesta HTTP 500 (Internal Server Error) cuando no lo está. Para obtener más información, consulta los criterios de éxito de HTTP, HTTPS y HTTP/2.

    Crear la comprobación del estado

    Para configurar la reparación automática, crea una comprobación del estado personalizada y configura el cortafuegos de red para permitir las sondas de comprobación del estado.

    En este tutorial, creará una comprobación del estado regional. Para la reparación automática, puedes usar una comprobación del estado regional o global. Las comprobaciones del estado regionales reducen las dependencias entre regiones y ayudan a conseguir la residencia de datos. Las comprobaciones del estado globales son útiles si quieres usar la misma comprobación del estado para MIGs de varias regiones.

    Consola

    1. Crea una comprobación del estado.

      1. En la Google Cloud consola, ve a la página Crear comprobación del estado.

        Ir a Crear comprobación del estado

      2. En el campo Name (Nombre), introduce autohealer-check.

      3. Define el ámbito en Regional.

      4. En el desplegable Región, selecciona europe-west1.

      5. En Protocolo, selecciona HTTP.

      6. Asigna el valor /health a Ruta de solicitud. Indica qué ruta HTTP usa la comprobación de estado. En este tutorial, el servidor web de demostración define la ruta /health para devolver una respuesta HTTP 200 (OK) cuando el estado sea correcto o una respuesta HTTP 500 (Internal Server Error) cuando no lo sea.

      7. Defina los criterios de estado:

        1. Define Intervalo de comprobación en 10. Define el tiempo que transcurre desde el inicio de una comprobación hasta el inicio de la siguiente.
        2. Define Tiempo de espera en 5. Define el tiempo queGoogle Cloud espera una respuesta a una petición. Este valor debe ser inferior o igual al intervalo de comprobación.
        3. Define el Umbral en buen estado en 2. Define el número de sondeos secuenciales que deben completarse correctamente para que la VM se considere en buen estado.
        4. Define Umbral en mal estado en 3. Define el número de comprobaciones secuenciales que deben fallar para que la VM se considere en mal estado.
      8. Deja los valores predeterminados de las demás opciones.

      9. En la parte inferior, haz clic en Crear.

    2. Crea una regla de cortafuegos para permitir que las sondas de comprobación del estado hagan solicitudes HTTP.

      1. En la Google Cloud consola, ve a la página Crear regla de cortafuegos.

        Ir a Crear regla de cortafuegos

      2. En Nombre, escribe default-allow-http-health-check.

      3. En Red, selecciona default.

      4. En Objetivos, selecciona All instances in the network.

      5. En Filtro de origen, selecciona IPv4 ranges.

      6. En Intervalos IPv4 de origen, introduce 130.211.0.0/22, 35.191.0.0/16.

        .
      7. En Protocolos y puertos, selecciona TCP e introduce 80.

      8. Deja los valores predeterminados de las demás opciones.

      9. Haz clic en Crear.

    gcloud

    1. Crea una comprobación del estado con el comando health-checks create http.

      gcloud compute health-checks create http autohealer-check \
          --region europe-west1 \
          --check-interval 10 \
          --timeout 5 \
          --healthy-threshold 2 \
          --unhealthy-threshold 3 \
          --request-path "/health"
      
      • check-interval define el tiempo que transcurre desde el inicio de una comprobación hasta el inicio de la siguiente.
      • timeout define el tiempo que Google Cloud espera una respuesta a una petición de sondeo. Este valor debe ser inferior o igual al intervalo de comprobación.
      • healthy-threshold define el número de sondeos secuenciales que deben realizarse correctamente para que la VM se considere en buen estado.
      • unhealthy-threshold define el número de sondeos secuenciales que deben fallar para que la VM se considere en mal estado.
      • request-path indica qué ruta HTTP usa la comprobación de estado. En este tutorial, el servidor web de demostración define la ruta /health para devolver una respuesta HTTP 200 (OK) cuando está en buen estado o una respuesta HTTP 500 (Internal Server Error) cuando no lo está.
    2. Crea una regla de cortafuegos para permitir que las sondas de comprobación del estado hagan solicitudes HTTP.

      gcloud compute firewall-rules create default-allow-http-health-check \
          --network default \
          --allow tcp:80 \
          --source-ranges 130.211.0.0/22,35.191.0.0/16
      
      .

    Qué hace que una comprobación del estado de recuperación automática sea buena

    Las comprobaciones del estado que se usan para la reparación automática deben ser conservadoras para que no eliminen y vuelvan a crear tus instancias de forma preventiva. Si una comprobación del estado de la reparación automática es demasiado agresiva, es posible que la reparación automática confunda las instancias ocupadas con las instancias fallidas y las reinicie innecesariamente, lo que reducirá la disponibilidad.

    • unhealthy-threshold. Debe ser superior a 1. Lo ideal es que este valor sea 3 o más. De esta forma, se protege frente a fallos poco frecuentes, como la pérdida de paquetes de red.
    • healthy-threshold. Un valor de 2 es suficiente para la mayoría de las aplicaciones.
    • timeout. Asigna a este valor de tiempo una cantidad generosa (cinco veces o más que el tiempo de respuesta esperado). De esta forma, se evitan retrasos inesperados, como instancias ocupadas o una conexión de red lenta.
    • check-interval. Este valor debe estar entre 1 segundo y el doble del tiempo de espera (no debe ser demasiado largo ni demasiado corto). Cuando un valor es demasiado largo, no se detecta una instancia fallida con la suficiente antelación. Si un valor es demasiado corto, las instancias y la red pueden estar muy ocupadas, dado el gran número de sondeos de comprobación de estado que se envían cada segundo.

    Configurar el servicio web

    En este tutorial se usa una aplicación web almacenada en GitHub. Si quieres obtener más información sobre cómo se ha implementado la aplicación, consulta el repositorio de GitHub GoogleCloudPlatform/python-docs-samples.

    Para configurar el servicio web de demostración, crea una plantilla de instancia que inicie el servidor web de demostración al iniciarse. A continuación, usa esta plantilla de instancia para desplegar un grupo de instancias gestionado y habilitar la reparación automática.

    Consola

    1. Crea una plantilla de instancia. Incluye una secuencia de comandos de inicio que inicie el servidor web de demostración.

      1. En la Google Cloud consola, ve a la página Crear plantilla de instancia.

        Ir a Crear plantilla de instancia

      2. Asigna el valor webserver-template a Nombre.

      3. En la sección Ubicación, en el menú desplegable Región, selecciona europe-west1.

      4. En la sección Configuración de la máquina, en el menú desplegable Tipo de máquina, selecciona e2-medium.

      5. En la sección Cortafuegos, marca la casilla Permitir el tráfico HTTP.

      6. Despliega la sección Opciones avanzadas para ver la configuración avanzada. Aparecerán varias subsecciones.

      7. En la sección Gestión, busca Automatización e introduce la siguiente secuencia de comandos de inicio:

        apt-get update
        apt-get -y install git python3-pip python3-venv
        git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
        python3 -m venv venv
        ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
        ./venv/bin/pip3 install gunicorn
        ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
        

      8. Deja los valores predeterminados de las demás opciones.

      9. Haz clic en Crear.

    2. Despliega el servidor web como un grupo de instancias gestionado.

      1. En la consola, ve a la página Crear grupo de instancias. Google Cloud

        Ir a Crear grupo de instancias

      2. Asigna el valor webserver-group a Nombre.

      3. En Plantilla de instancia, selecciona webserver-template.

      4. En Región, selecciona europe-west1.

      5. En Zona, selecciona europe-west1-b.

      6. En la sección Autoescalado, en Modo de autoescalado, selecciona Desactivado: no autoescalar.

      7. Vuelve al campo Número de instancias y asigna el valor 3.

      8. En la sección Autorreparación, haga lo siguiente:

        1. En el menú desplegable Comprobación del estado, selecciona autohealer-check.
        2. Define Retraso inicial en 300.

      9. Deja los valores predeterminados de las demás opciones.

      10. Haz clic en Crear.

    3. Crea una regla de cortafuegos que permita las solicitudes HTTP a los servidores web.

      1. En la Google Cloud consola, ve a la página Crear regla de cortafuegos.

        Ir a Crear regla de cortafuegos

      2. En Nombre, escribe default-allow-http.

      3. En Red, selecciona default.

      4. En Objetivos, selecciona Specified target tags.

      5. En Etiquetas de destino, introduzca http-server.

      6. En Filtro de origen, selecciona IPv4 ranges.

      7. En Intervalos IPv4 de origen, introduzca 0.0.0.0/0 para permitir el acceso a todas las direcciones IP.

      8. En Protocolos y puertos, selecciona TCP e introduce 80.

      9. Deja los valores predeterminados de las demás opciones.

      10. Haz clic en Crear.

    gcloud

    1. Crea una plantilla de instancia. Incluye una secuencia de comandos de inicio que inicie el servidor web de demostración.

      gcloud compute instance-templates create webserver-template \
          --instance-template-region europe-west1 \
          --machine-type e2-medium \
          --tags http-server \
          --metadata startup-script='
        apt-get update
        apt-get -y install git python3-pip python3-venv
        git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
        python3 -m venv venv
        ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
        ./venv/bin/pip3 install gunicorn
        ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo'
      
    2. Crea un grupo de instancias gestionado.

      gcloud compute instance-groups managed create webserver-group \
          --zone europe-west1-b \
          --template projects/PROJECT_ID/regions/europe-west1/instanceTemplates/webserver-template \
          --size 3 \
          --health-check projects/PROJECT_ID/regions/europe-west1/healthChecks/autohealer-check \
          --initial-delay 300
      
    3. Crea una regla de cortafuegos que permita las solicitudes HTTP a los servidores web.

      gcloud compute firewall-rules create default-allow-http \
          --network default \
          --allow tcp:80 \
          --target-tags http-server
      

    Espera unos minutos a que el grupo de instancias gestionadas cree y verifique sus VMs.

    Simular fallos en las comprobaciones del estado

    Para simular fallos en las comprobaciones del estado, el servidor web de demostración te ofrece formas de forzar un fallo en una comprobación del estado.

    Consola

    1. Ve a una VM de servidor web.

      1. En la consola de Google Cloud , ve a la página Instancias de VM.

        Ir a instancias de VM

      2. En cualquier VM webserver-group, en la columna IP externa, haz clic en la dirección IP. Se abrirá una nueva pestaña en tu navegador web. Si se agota el tiempo de espera de la solicitud o la página web no está disponible, espera un minuto para que el servidor termine de configurarse y vuelve a intentarlo.

      El servidor web de demostración muestra una página similar a la siguiente:

      Página web de demostración que muestra botones de estado verdes y botones de acción azules.

    2. En la página web de demostración, haz clic en Make unhealthy (Hacer que no esté en buen estado)

      Esto provoca que el servidor web no supere la comprobación del estado. En concreto, el servidor web hace que la ruta /health devuelva un HTTP 500 (Internal Server Error). Puedes comprobarlo tú mismo haciendo clic rápidamente en el botón Comprobar estado (deja de funcionar después de que el autosanador haya empezado a reiniciar la VM).

    3. Espera a que el sistema de reparación automática tome medidas.

      1. En la consola de Google Cloud , ve a la página Instancias de VM.

        Ir a instancias de VM

      2. Espera a que cambie el estado de la VM del servidor web. La marca de verificación verde situada junto al nombre de la VM debería cambiar a un cuadrado gris, lo que indica que el autocomprobador ha empezado a reiniciar la VM en mal estado.

      3. Haga clic en Actualizar en la parte superior de la página periódicamente para obtener el estado más reciente.

      4. El proceso de reparación automática finaliza cuando el cuadrado gris vuelve a ser una marca de verificación verde, lo que indica que la VM vuelve a estar en buen estado.

    gcloud

    1. Monitoriza el estado del grupo de instancias gestionado. Cuando hayas terminado, detén la grabación pulsando Ctrl+C.

      while : ; do
        gcloud compute instance-groups managed list-instances webserver-group \
        --zone europe-west1-b
        sleep 5  # Wait for 5 seconds
      done
      
        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        NAME: webserver-group-4qbx
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        NAME: webserver-group-m5v5
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      

      Todas las VMs del grupo deben mostrar STATUS: RUNNING y ACTION: NONE. Si no es así, espera unos minutos para que las VMs terminen de configurarse y vuelve a intentarlo.

    2. Abre una nueva sesión de Cloud Shell con Google Cloud CLI instalado.

    3. Obtén la dirección de una VM de servidor web.

      gcloud compute instances list --filter webserver-group
      

      En la columna EXTERNAL_IP, copia la dirección IP de cualquier servidor web VM y guárdala como una variable bash local.

      export IP_ADDRESS=EXTERNAL_IP_ADDRESS
      
    4. Comprueba que el servidor web haya terminado de configurarse. El servidor devuelve una respuesta HTTP 200 OK.

      curl --head $IP_ADDRESS/health
      
      HTTP/1.1 200 OK
      Server: gunicorn
      ...
      

      Si aparece un error Connection refused, espera un minuto para que el servidor termine de configurarse y vuelve a intentarlo.

    5. Hacer que el servidor web no esté en buen estado.

      curl $IP_ADDRESS/makeUnhealthy > /dev/null
      

      Esto provoca que el servidor web no supere la comprobación del estado. En concreto, el servidor web hace que la ruta /health devuelva un HTTP 500 INTERNAL SERVER ERROR. Puedes comprobarlo tú mismo haciendo una solicitud rápida a /health (dejará de funcionar después de que el autocomprobador haya empezado a reiniciar la VM).

      curl --head $IP_ADDRESS/health
      
      HTTP/1.1 500 INTERNAL SERVER ERROR
      Server: gunicorn
      ...
      
    6. Vuelve a la primera sesión de shell para monitorizar el grupo de instancias gestionado y espera a que el reparador automático actúe.

      1. Cuando se haya iniciado el proceso de reparación automática, se actualizarán las columnas STATUS y ACTION, lo que indica que el reparador automático ha empezado a reiniciar la VM en mal estado.

          NAME: webserver-group-0zx6
          ZONE: europe-west1-b
          STATUS: STOPPING
          HEALTH_STATE: UNHEALTHY
          ACTION: RECREATING
          INSTANCE_TEMPLATE: webserver-template
          VERSION_NAME:
          LAST_ERROR:
        
          ...
        
      2. El proceso de reparación automática habrá finalizado cuando la VM vuelva a informar de un STATUS de RUNNING y un ACTION de NONE, lo que indica que la VM se ha reiniciado correctamente.

          NAME: webserver-group-0zx6
          ZONE: europe-west1-b
          STATUS: RUNNING
          HEALTH_STATE: HEALTHY
          ACTION: NONE
          INSTANCE_TEMPLATE: webserver-template
          VERSION_NAME:
          LAST_ERROR:
        
          ...
        
      3. Cuando hayas terminado de monitorizar el grupo de instancias gestionado, detente pulsando Ctrl+C.

    Puedes repetir este ejercicio. A continuación, te ofrecemos algunas ideas:

    • ¿Qué ocurre si todas las VMs no están en buen estado al mismo tiempo? Para obtener más información sobre el comportamiento de la reparación automática durante los fallos simultáneos, consulta el comportamiento de la reparación automática.

    • ¿Puedes actualizar la configuración de la comprobación de estado para restaurar las VMs lo más rápido posible? En la práctica, debes definir los parámetros de comprobación de estado para usar valores conservadores, tal como se explica en este tutorial. De lo contrario, corres el riesgo de que las VMs se eliminen y reinicien por error cuando no haya ningún problema real.

    • El grupo de instancias gestionado tiene un ajuste de configuración initial delay. ¿Puedes determinar el retraso mínimo necesario para este servidor web de demostración? En la práctica, deberías definir un retraso algo mayor (entre un 10 % y un 20%) del tiempo que tarda una VM en iniciarse y empezar a atender solicitudes de la aplicación. De lo contrario, la VM podría quedarse atascada en un bucle de arranque de reparación automática.

    Ver el historial de Autohealer (opcional)

    Para ver el historial de operaciones de reparación automática, usa el siguiente comando gcloud:

    gcloud compute operations list --filter='operationType~compute.instances.repair.*'
    

    Para obtener más información, consulta cómo ver el historial de operaciones de reparación automática.

    Limpieza

    Cuando hayas terminado el tutorial, puedes eliminar los recursos que has creado para que dejen de usar cuota y generar cargos. En las siguientes secciones se explica cómo eliminar o desactivar dichos recursos.

    Si has creado un proyecto independiente para este tutorial, elimínalo por completo. De lo contrario, si el proyecto tiene recursos que quieres conservar, elimina solo los recursos específicos creados en este tutorial.

    Eliminar el proyecto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Eliminar recursos específicos

    Si no puedes eliminar el proyecto que has usado en este tutorial, elimina los recursos del tutorial de forma individual.

    Eliminar el grupo de instancias

    consola

    1. In the Google Cloud console, go to the Instance groups page.

      Go to Instance groups

    2. Select the checkbox for your webserver-group instance group.
    3. To delete the instance group, click Delete.

    gcloud

    gcloud compute instance-groups managed delete webserver-group --zone europe-west1-b -q
    

    Eliminar la plantilla de instancia

    consola

    1. En la consola, ve a la página Plantillas de instancia. Google Cloud

      Ir a Plantillas de instancia

    2. Haga clic en la casilla situada junto a la plantilla de instancia.

    3. En la parte superior de la página, haz clic en Eliminar. En la nueva ventana, haz clic en Eliminar para confirmar la acción.

    gcloud

    gcloud compute instance-templates delete webserver-template -q \
        --region=europe-west1
    

    Eliminar la comprobación del estado

    consola

    1. En la Google Cloud consola, ve a la página Comprobaciones de estado.

      Ir a Comprobaciones del estado

    2. Haga clic en la casilla situada junto a la comprobación de estado.

    3. En la parte superior de la página, haz clic en Eliminar. En la nueva ventana, haz clic en Eliminar para confirmar la acción.

    gcloud

    gcloud compute health-checks delete autohealer-check -q \
        --region=europe-west1
    

    Eliminar las reglas de cortafuegos

    consola

    1. En la Google Cloud consola, ve a la página Reglas de cortafuegos.

      Ir a reglas de cortafuegos

    2. Haga clic en las casillas situadas junto a las reglas de cortafuegos llamadas default-allow-http y default-allow-http-health-check.

    3. En la parte superior de la página, haz clic en Eliminar. En la nueva ventana, haz clic en Eliminar para confirmar la acción.

    gcloud

    gcloud compute firewall-rules delete default-allow-http default-allow-http-health-check -q
    

    Siguientes pasos