Usa la reparación automática para apps con alta disponibilidad

En este instructivo interactivo, se muestra cómo utilizar la reparación automática para compilar aplicaciones con alta disponibilidad en Compute Engine.

Las aplicaciones con alta disponibilidad están diseñadas para entregar solicitudes a clientes con la mínima latencia y tiempo de actividad. La disponibilidad se ve afectada cuando una aplicación falla o se detiene. Los clientes con aplicaciones afectadas pueden experimentar latencia o tiempo de inactividad altos.

La reparación automática te permite reiniciar las aplicaciones afectadas de forma automática. Detecta con rapidez las instancias con fallas y las recrea de forma automática para poder entregar a los clientes nuevamente. Gracias a la reparación automática, ya no tendrás que volver a poner en servicio una app de forma manual cuando ocurra una falla.

Objetivos

  • Configurar una verificación de estado y una política de reparación automática
  • Configurar un servicio web de demostración en un grupo de instancias administrado
  • Simular fallas de verificación de estado y observar el proceso de recuperación de la reparación automática

Costos

En este instructivo, se usan componentes facturables de Google Cloud, incluidos los siguientes:

  • Compute Engine

Antes de comenzar

    Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

    En GCP Console, en la página de selección de proyecto, selecciona o crea un proyecto de GCP.

    Ir a la página de selección de proyecto

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

    Descubre cómo puedes habilitar la facturación

    Habilita lasCompute EngineAPI.

    Habilita lasAPI

Si prefieres trabajar desde la línea de comandos, instala la herramienta de línea de comandos de gcloud.

Arquitectura de apps

La app incluye los siguientes componentes de Compute Engine:

  • Verificación de estado: es una política de verificación de estado HTTP que usa la reparación automática para detectar instancias de VM con fallas.
  • Reglas de firewall: Con las reglas de firewall de Google Cloud puedes permitir o rechazar el tráfico a las instancias.
  • Grupo de instancias administrado: es un grupo de instancias que ejecutan el mismo servicio web de demostración.
  • Plantilla de instancias: Es una plantilla que se usa para crear cada instancia en el grupo de instancias.

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

Cómo la verificación de estado sondea el servicio web de demostración

Una verificación de estado envía solicitudes de sondeo a una instancia a través de un protocolo específico, como HTTP(S), SSL o TCP. Para obtener más información, consulta cómo funcionan las verificaciones de estado y sus categorías, protocolos y puertos.

La verificación de estado de este instructivo es una verificación de estado HTTP que sondea la ruta HTTP /health en el puerto 80. En una verificación de estado HTTP, la solicitud de sondeo solo se transmite si la ruta de acceso muestra una respuesta HTTP 200 (OK). En este instructivo, el servidor web de demostración define la ruta de acceso /health para mostrar una respuesta HTTP 200 (OK) cuando se encuentra en buen estado o una respuesta HTTP 500 (Internal Server Error) si está en mal estado. Si quieres obtener más información, consulta los criterios de éxito para HTTP, HTTPS y HTTP/2.

Crea la verificación de estado

Para configurar la reparación automática, crea una verificación de estado personalizada y configura el firewall de la red, de manera que permita el sondeo de verificación de estado.

Console

  1. Crea una verificación de estado.

    1. Ve a la página Verificaciones de estado en Cloud Console.
      Ir a la página Verificaciones de estado
    2. Haz clic en Crear verificación de estado.
    3. Establece el campo Nombre como autohealer-check.
    4. En Protocolo, selecciona HTTP.
    5. Establece el campo Ruta de la solicitud en /health. Esto indica qué ruta de acceso HTTP utiliza la verificación de estado. En este instructivo, el servidor web de demostración define la ruta de acceso /health para mostrar una respuesta HTTP 200 (OK) cuando está en buen estado o una respuesta HTTP 500 (Internal Server Error) si está en mal estado.
    6. Configura el campo Criterios de estado:
      1. Establece el campo Intervalo de verificación como 10. Esto define la cantidad de tiempo desde el inicio de un sondeo hasta el inicio del siguiente.
      2. Establece el Tiempo de espera en 5. Esto define el tiempo que Google Cloud espera una respuesta a un sondeo. Este valor debe ser menor o igual que el intervalo de verificación.
      3. En Umbral de buen estado selecciona 2. Esto define la cantidad de sondeos secuenciales que deben tener éxito para que la instancia se considere en buen estado.
      4. Configura el campo Umbral en mal estado como 3. Esto define la cantidad de sondeos secuenciales que deben fallar para que la instancia se considere en mal estado.
    7. Haz clic en Crear en la parte inferior.
  2. Crea una regla de firewall para permitir que los sondeos de las verificaciones de estado realicen solicitudes HTTP.

    1. Ve a la página para crear una regla de firewall en Cloud Console.
      Ir a la página para crear una regla de firewall
    2. En Nombre, ingresa default-allow-http-health-check.
    3. En Red, selecciona default.
    4. En Destinos, selecciona All instances in the network.
    5. En Filtro de origen, selecciona IP ranges.
    6. En Rangos de IP de origen, ingresa 130.211.0.0/22 y 35.191.0.0/16.
    7. En Protocolos y puertos, selecciona TCP y, luego, ingresa 80.
    8. Haz clic en Crear.

gcloud

  1. Crea una verificación de estado.

    gcloud compute health-checks create http autohealer-check \
        --check-interval 10 \
        --timeout 5 \
        --healthy-threshold 2 \
        --unhealthy-threshold 3 \
        --request-path "/health"
    
    • check-interval define la cantidad de tiempo desde el inicio de un sondeo hasta el inicio del siguiente.
    • timeout define el tiempo que Google Cloud espera para una respuesta a un sondeo. Este valor debe ser menor o igual que el intervalo de verificación.
    • healthy-threshold define el número de sondeos secuenciales que deben tener éxito para que la instancia se considere en buen estado.
    • unhealthy-threshold define la cantidad de sondeos secuenciales que deben fallar para que la instancia se considere en mal estado.
    • request-path indica qué ruta HTTP utiliza la verificación de estado. En este instructivo, el servidor web de demostración define la ruta de acceso /health para mostrar una respuesta HTTP 200 (OK) cuando se encuentra en buen estado o una respuesta HTTP 500 (Internal Server Error) si está en mal estado.
  2. Crea una regla de firewall para permitir que los sondeos de las verificaciones de estado realicen 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
    

Características de una buena verificación de estado de reparación automática

Las verificaciones de estado que se usan en la reparación automática deben ser conservadoras para que no borren ni vuelvan a crear tus instancias de manera preventiva. Cuando una verificación de estado de reparación automática es demasiado agresiva, la reparación automática puede confundir las instancias ocupadas con instancias con errores y reiniciarlas sin necesidad, lo que reduce la disponibilidad.

  • unhealthy-threshold: Debe ser mayor que 1. Lo ideal es que este valor sea 3 o más. Esto brinda protección contra errores poco frecuentes, como una pérdida de paquetes de red.
  • healthy-threshold: un valor de 2 es suficiente para la mayoría de las aplicaciones.
  • timeout: establece este valor de tiempo en una cantidad generosa (cinco veces mayor que el tiempo de respuesta esperado o más). Esto brinda protección contra 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 muy largo ni muy corto). Cuando un valor es demasiado largo, las instancias con errores no se detectan a tiempo. Cuando un valor es demasiado corto, las instancias y la red pueden quedar muy ocupadas, debido a la gran cantidad de sondeos de verificación de estado que se envían cada segundo.

Configura el servicio web

En este instructivo, se usa una aplicación web que se almacena en GitHub. Si deseas obtener más información sobre cómo se implementó la aplicación, consulta el repositorio de GitHub GoogleCloudPlatform/python-docs-samples.

Para configurar el servicio web de demostración, crea una plantilla de instancias que inicie el servidor web de demostración al inicio. Luego, usa esta plantilla de instancias para implementar un grupo de instancias administrado y habilitar la reparación automática.

Console

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

    1. Ve a la página Plantillas de instancias en Cloud Console.
      Ir a la página Plantillas de instancias
    2. Haz clic en Crear plantilla de instancias.
    3. Configura el campo Nombre como webserver-template.
    4. En Configuración de la máquina, selecciona micro (f1-micro).
    5. En Firewall, selecciona la casilla de verificación Permitir el tráfico HTTP.
    6. Haz clic en Administración, seguridad, discos, redes, instancia única para revelar la configuración avanzada. Aparecerán varias pestañas.
    7. En la pestaña Administración, busca Automatizacióny, luego, ingresa la siguiente Secuencia de comandos de inicio:
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
      
    8. Haz clic en Crear.
  2. Implementa el servidor web como un grupo de instancias administrado.

    1. Ve a la página Grupos de instancias en Cloud Console.
      Ir a la página Grupos de instancias
    2. Haz clic en Crear grupo de instancias.
    3. Configura el campo Nombre como webserver-group.
    4. En Región, selecciona europe-west1.
    5. En Zona, selecciona europe-west1-b.
    6. En Plantilla de instancias, selecciona webserver-template.
    7. En Ajuste de escala automático, selecciona Desactivar.
    8. En Número de instancias, ingresa 3.
    9. En Verificación de estado, selecciona autohealer-check.
    10. En Retraso inicial, ingresa 90.
    11. Haz clic en Crear.
  3. Crea una regla de firewall que permita las solicitudes HTTP a los servidores web.

    1. Ve a la página para crear una regla de firewall en Cloud Console.
      Ir a la página para crear una regla de firewall
    2. En Nombre, ingresa default-allow-http.
    3. En Red, selecciona default.
    4. En Destinos, selecciona Specified target tags.
    5. En Etiquetas de destino, ingresa http-server.
    6. En Filtro de origen, selecciona IP ranges.
    7. En Rangos de IP de origen, ingresa 0.0.0.0/0.
    8. En Protocolos y puertos, selecciona TCP y, luego, ingresa 80.
    9. Haz clic en Crear.

gcloud

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

    gcloud compute instance-templates create webserver-template \
        --machine-type f1-micro \
        --tags http-server \
        --metadata startup-script='
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon'
    
  2. Crea un grupo de instancias.

    gcloud compute instance-groups managed create webserver-group \
        --zone europe-west1-b \
        --template webserver-template \
        --size 3 \
        --health-check autohealer-check \
        --initial-delay 90
    
  3. Crea una regla de firewall 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
    

Simula fallas de verificación de estado

Para simular fallas de verificación de estado, el servidor web de demostración te ofrece formas de forzar una falla de verificación de estado.

Console

  1. Navega a una instancia del servidor web.

    1. Ve a la página Instancias de VM en Cloud Console.
      Ir a la página Instancias de VM
    2. En la columna IP externa, haz clic en la dirección IP de cualquier instancia de webserver-group. Se abrirá una pestaña nueva en el navegador web. Si la solicitud agota el tiempo de espera o la página web no está disponible, espera un minuto hasta que el servidor termine de configurarse y vuelve a intentar.

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

    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 Hacer que esté en mal estado.

    Esto hace que el servidor web produzca fallas en la verificación de estado. Específicamente, el servidor web hace que la ruta de acceso /health muestre un HTTP 500 (Internal Server Error). Puedes verificar esto tú mismo si haces clic rápidamente en el botón Verificar estado (esto deja de funcionar después de que la reparación automática comienza a reiniciar la instancia).

  3. Espera a que se inicie la reparación automática.

    1. Ve a la página Instancias de VM en Cloud Console.
      Ir a la página Instancias de VM
    2. Espera que cambie el estado de la instancia del servidor web. La marca de verificación verde junto al nombre de la instancia debe cambiar a un cuadrado gris, lo que indica que la reparación automática comenzó a reiniciar la instancia en mal estado.
    3. Haz clic en Actualizar en la parte superior de la página de vez en cuando para obtener el estado más reciente.
    4. El proceso de reparación automática finaliza cuando el cuadrado gris cambia de nuevo a una marca de verificación verde, lo que indica que la instancia está nuevamente en buen estado.

gcloud

  1. Supervisa el estado del grupo de instancias. (Cuando termines, presiona Ctrl+C).

    while : ; do \
        gcloud compute instance-groups managed list-instances webserver-group \
        --zone europe-west1-b \
        ; done
    
    NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
    webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
    

    Si alguna instancia muestra un estado que no sea RUNNING, como STAGING, espera un minuto hasta que la instancia termine de configurarse y, luego, intenta nuevamente.

  2. Abre una sesión de Cloud Shell nueva con la herramienta de línea de comandos de gcloud instalada.

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

    gcloud compute instances list --filter webserver-group
    

    Debajo de la columna EXTERNAL_IP, copia la dirección IP de cualquier instancia de servidor web y guárdala como una variable de Bash local.

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

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

    Si recibes un error Connection refused, espera un minuto hasta que el servidor termine de configurarse y, luego, intenta nuevamente.

  5. Haz que el servidor web esté en mal estado.

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

    Esto hace que el servidor web produzca fallas en la verificación de estado. Específicamente, el servidor web hace que la ruta de acceso /health muestre un HTTP 500 INTERNAL SERVER ERROR. Puedes verificar esto tú mismo si haces una solicitud rápida a /health (esto deja de funcionar después de que la reparación automática comienza a reiniciar la instancia).

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn/19.6.0
    ...
    
  6. Regresa a la primera sesión de Shell para supervisar el grupo de instancias y espera a que la reparación automática comience.

    1. Cuando se inicia el proceso de reparación automática, se actualizan las columnas STATUS y ACTION, lo que indica que la reparación automática comenzó a reiniciar la instancia en mal estado.

      NAME                 ZONE            STATUS    ACTION      INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-tbpj  europe-west1-b  STOPPING  RECREATING  webserver-template
      
    2. El proceso de reparación finalizó cuando la instancia vuelve a informar un STATUS de RUNNING y un ACTION de NONE, lo que indica que la instancia se reinició correctamente.

      NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
      
    3. Cuando termines de supervisar el grupo de instancias, presiona Ctrl+C para detenerte.

Si lo deseas, puedes repetir este ejercicio. Estas son algunas ideas:

  • ¿Qué sucede si haces que todas las instancias estén en mal estado al mismo tiempo? Para obtener más información sobre cómo funciona la reparación automática durante fallas simultáneas, consulta la documentación sobre el comportamiento de la reparación automática.

  • ¿Es posible actualizar la configuración de la verificación de estado para recuperar las instancias lo más rápido posible? (En la práctica, debes configurar los parámetros de la verificación de estado para que usen valores conservadores, como se explica en este instructivo. De lo contrario, puedes correr el riesgo de que las instancias se borren y reinicien por error cuando no haya un problema real).

  • El grupo de instancias tiene una configuración initial delay. ¿Es posible determinar el retraso mínimo necesario para este servidor web de demostración? (En la práctica, debes establecer una demora un poco más larga (de 10% a 20%) de lo que tarda una instancia en iniciarse y comenzar a entregar solicitudes de aplicaciones. De lo contrario, corres el riesgo de que la instancia se atasque en un bucle de inicio de reparación automática).

Visualiza el historial de reparación automática (opcional)

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

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

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

Realiza una limpieza

Cuando termines el instructivo de reparación automática, puedes limpiar los recursos que creaste en GCP para que no consuman la cuota y no se te facture por ellos en el futuro. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.

Si creaste un proyecto separado para este instructivo, borra todo el proyecto. De lo contrario, si el proyecto tiene recursos que deseas conservar, borra solo los recursos específicos que creaste para este instructivo.

Borra el proyecto

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

    Ir a la página Administración de recursos

  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 recursos específicos

Si no puedes borrar el proyecto que usaste para este instructivo, borra los recursos del instructivo de forma individual.

Borra el grupo de instancias

console

  1. En GCP Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Click the checkbox for webserver-group instance group.
  3. Haz clic en Borrar para eliminar el grupo de instancias.

gcloud

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

Borra la plantilla de instancias

console

  1. Ve a la página Plantillas de instancias en Cloud Console.

    Ir a la página Plantillas de instancias

  2. Haz clic en la casilla de verificación junto a la plantilla de instancias.

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

gcloud

gcloud compute instance-templates delete webserver-template -q

Borra la verificación de estado

console

  1. Ve a la página Verificaciones de estado en Cloud Console.

    Ir a la página Verificaciones de estado

  2. Haz clic en la casilla de verificación junto a la verificación de estado.

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

gcloud

gcloud compute health-checks delete autohealer-check -q

Borra las reglas de firewall

console

  1. Ve a la página Reglas de Firewall en Cloud Console.

    Ir a la página Reglas de firewall

  2. Haz en las casillas de verificación junto a las reglas de firewall llamadas default-allow-http y default-allow-http-health-check.

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

gcloud

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

Próximos pasos