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

En este instructivo interactivo, se muestra cómo usar la autohealing 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 apps afectadas de forma automática. Detecta con rapidez las instancias de máquina virtual (VM) 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.

Arquitectura de apps

La app incluye los siguientes componentes de Compute Engine:

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 VM 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 sondeos de verificación de estado.

En este instructivo, crearás una verificación de estado regional. Para la reparación automática, puedes usar una verificación de estado regional o global. Las verificaciones de estado regionales reducen las dependencias entre regiones y ayudan a lograr la residencia de los datos. Las verificaciones de estado globales son convenientes si deseas usar la misma verificación de estado para MIGs en varias regiones.

Console

  1. Crea una verificación de estado.

    1. En la consola de Cloud de Confiance , ve a la página Crear verificación de estado.

      Ir a Crear verificación de estado

    2. En el campo Nombre, ingresa autohealer-check.

    3. Configura el Permiso como Regional.

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

    5. En Protocolo, selecciona HTTP.

    6. 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.

    7. Configura el campo Criterios de estado:

      1. Establece el campo Intervalo de verificación en 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 la cantidad de tiempo queCloud de Confiance 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 VM 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 VM se considere en mal estado.
    8. Deja los valores predeterminados para las otras opciones.

    9. 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. En la consola de Cloud de Confiance , ve a la página Crear una regla de firewall.

      Ir a Crear 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 IPv4 ranges.

    6. En Rangos de IPv4 de origen, ingresa 130.211.0.0/22, 35.191.0.0/16.

    7. En Protocolos y puertos, selecciona TCP y, luego, ingresa 80.

    8. Deja los valores predeterminados para las otras opciones.

    9. Haz clic en Crear.

gcloud

  1. Crea una verificación de 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 la cantidad de tiempo desde el inicio de un sondeo hasta el inicio del siguiente.
    • timeout define la cantidad de tiempo que Cloud de Confianceespera una respuesta a un sondeo. Este valor debe ser menor o igual que el intervalo de verificación.
    • healthy-threshold define la cantidad de sondeos secuenciales que deben realizarse con éxito para que la VM se considere en buen estado.
    • unhealthy-threshold define la cantidad de sondeos secuenciales que deben fallar para que la VM 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 app web que se almacena en GitHub. Si deseas obtener más información sobre cómo se implementó la app, 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. En la consola de Cloud de Confiance , ve a la página Crear una plantilla de instancias.

      Ir a Crea una plantilla de instancias

    2. Configura el campo Nombre como webserver-template.

    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 Firewall, selecciona la casilla de verificación Permitir tráfico HTTP.

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

    7. En la sección Administración, busca Automatización y, luego, ingresa 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 para las otras opciones.

    9. Haz clic en Crear.

  2. Implementa el servidor web como un grupo de instancias administrado.

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

      Ir a Crear grupo de instancias

    2. Configura el campo Nombre como webserver-group.

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

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

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

    6. En la sección Ajuste de escala automático, en Modo de ajuste de escala automático, selecciona Desactivar: No realizar ajuste de escala automático.

    7. Regresa al campo Cantidad de instancias y configúralo en 3.

    8. En la sección Reparación automática, haz lo siguiente:

      1. En el menú desplegable Verificación de estado, selecciona autohealer-check.
      2. En Retraso inicial, ingresa 300.

    9. Deja los valores predeterminados para las otras opciones.

    10. Haz clic en Crear.

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

    1. En la consola de Cloud de Confiance , ve a la página Crear una regla de firewall.

      Ir a Crear 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 IPv4 ranges.

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

    8. En Protocolos y puertos, selecciona TCP y, luego, ingresa 80.

    9. Deja los valores predeterminados para las otras opciones.

    10. 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 \
        --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. Cree un grupo de instancias administrado.

    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 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
    

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

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 VM del servidor web.

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

      Ir a Instancias de VM

    2. En cualquier VM de webserver-group, en la columna IP externa, haz clic en la dirección IP. 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. En específico, 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 VM).

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

    1. En la Cloud de Confiance consola, 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 junto al nombre de la VM debe cambiar a un cuadrado gris, lo que indica que la reparación automática comenzó a reiniciar la VM 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 VM está nuevamente en buen estado.

gcloud

  1. Supervisa el estado del grupo de instancias administrado. (Cuando termines, presiona 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. De no ser así, espera unos minutos para que las VMs terminen de configurarse y vuelve a intentarlo.

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

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

    gcloud compute instances list --filter webserver-group
    

    Debajo de la columna EXTERNAL_IP, copia la dirección IP de cualquier VM 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
    ...
    

    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. En específico, el servidor web hace que la ruta de acceso /health muestre un HTTP 500 INTERNAL SERVER ERROR. Puedes verificarlo 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 VM).

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn
    ...
    
  6. Regresa a la primera sesión de Shell para supervisar el grupo de instancias administrado 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 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 finalizó cuando la VM vuelve a informar un STATUS de RUNNING y un ACTION de NONE, lo que indica que la VM se reinició 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 termines de supervisar el grupo de instancias administrado, presiona Ctrl+C para detenerte.

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

  • ¿Qué sucede si haces que todas las VMs 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 VMs 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 VMs se borren y reinicien por error cuando no haya un problema real).

  • El grupo de instancias administrado tiene un parámetro de 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 VM en iniciarse y comenzar a entregar solicitudes de aplicaciones. De lo contrario, corres el riesgo de que la VM 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.