Inyección de Fallos

Esta tarea muestra cómo inyectar fallos para probar la resiliencia de su application.

Antes de empezar

  • Configure Istio siguiendo las instrucciones de la guía de instalación.

  • Despliegue la application de ejemplo Bookinfo incluyendo las reglas de destino predeterminadas.

  • Revise la discusión sobre la inyección de fallos en el documento de conceptos de Gestión de Tráfico.

  • Aplique el enrutamiento de versiones de la application realizando la tarea de enrutamiento de solicitudes o ejecutando los siguientes comandos:

    ZipZip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
  • Con la configuración anterior, así es como fluyen las solicitudes:

    • productpagereviews:v2ratings (solo para el usuario jason)
    • productpagereviews:v1 (para todos los demás)

Inyectar un fallo de retardo HTTP

Para probar la resiliencia de los microservices de la application Bookinfo, inyecte un retardo de 7s entre los microservices reviews:v2 y ratings para el usuario jason. Esta prueba descubrirá un bug que se introdujo intencionalmente en la aplicación Bookinfo.

Tenga en cuenta que el service reviews:v2 tiene un tiempo de espera de conexión codificado de 10s para las llamadas al service ratings. Incluso con el retardo de 7s que introdujo, aún espera que el flujo de extremo a extremo continúe sin errores.

  1. Cree una regla de inyección de fallos para retrasar el tráfico proveniente del usuario de prueba jason.

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
  2. Confirme que la regla fue creada:

    $ kubectl get virtualservice ratings -o yaml
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    ...
    spec:
      hosts:
      - ratings
      http:
      - fault:
          delay:
            fixedDelay: 7s
            percentage:
              value: 100
        match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: ratings
            subset: v1
      - route:
        - destination:
            host: ratings
            subset: v1

    Permita varios segundos para que la nueva regla se propague a todos los pods.

Probar la configuración de retardo

  1. Abra la aplicación web Bookinfo en su navegador.

  2. En la página web /productpage, inicie sesión como usuario jason.

    Espera que la página de inicio de Bookinfo se cargue sin errores en aproximadamente 7 segundos. Sin embargo, hay un problema: la sección de Reseñas muestra un mensaje de error:

    Lo sentimos, las reseñas de productos no están disponibles actualmente para este libro.
  3. Verifique los tiempos de respuesta de la página web:

    1. Abra el menú Herramientas de Desarrollador en su navegador web.
    2. Abra la pestaña Red
    3. Vuelva a cargar la página web /productpage. Verá que la página se carga en unos 6 segundos.

Comprender lo que sucedió

Ha encontrado un bug. Hay tiempos de espera codificados en los microservices que han causado que el service reviews falle.

Como se esperaba, el retardo de 7s que introdujo no afecta al service reviews porque el tiempo de espera entre el service reviews y ratings está codificado en 10s. Sin embargo, también hay un tiempo de espera codificado entre el service productpage y reviews, codificado como 3s + 1 reintento para un total de 6s. Como resultado, la llamada de productpage a reviews agota el tiempo de espera prematuramente y lanza un error después de 6s.

Errores como este pueden ocurrir en applications empresariales típicas donde diferentes equipos desarrollan diferentes microservices de forma independiente. Las reglas de inyección de fallos de Istio le ayudan a identificar tales anomalías sin afectar a los usuarios finales.

Corregir el bug

Normalmente, solucionaría el problema de la siguiente manera:

  1. Aumentando el tiempo de espera del service productpage a reviews o disminuyendo el tiempo de espera de reviews a ratings
  2. Deteniendo y reiniciando el microservice corregido
  3. Confirmando que la página web /productpage devuelve su respuesta sin errores.

Sin embargo, ya tiene una solución ejecutándose en la v3 del service reviews. El service reviews:v3 reduce el tiempo de espera de reviews a ratings de 10s a 2.5s para que sea compatible con (menos que) el tiempo de espera de las solicitudes productpage descendentes.

Si migra todo el tráfico a reviews:v3 como se describe en la tarea de cambio de tráfico, puede intentar cambiar la regla de retardo a cualquier cantidad inferior a 2.5s, por ejemplo 2s, y confirmar que el flujo de extremo a extremo continúa sin errores.

Inyectar un fallo de aborto HTTP

Otra forma de probar la resiliencia de los microservices es introducir un fallo de aborto HTTP. En esta tarea, introducirá un aborto HTTP en los microservices ratings para el usuario de prueba jason.

En este caso, espera que la página se cargue inmediatamente y muestre el mensaje El service de calificaciones no está disponible actualmente.

  1. Cree una regla de inyección de fallos para enviar un aborto HTTP para el usuario jason:

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
  2. Confirme que la regla fue creada:

    $ kubectl get virtualservice ratings -o yaml
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    ...
    spec:
      hosts:
      - ratings
      http:
      - fault:
          abort:
            httpStatus: 500
            percentage:
              value: 100
        match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: ratings
            subset: v1
      - route:
        - destination:
            host: ratings
            subset: v1

Probar la configuración de aborto

  1. Abra la aplicación web Bookinfo en su navegador.

  2. En la /productpage, inicie sesión como usuario jason.

    Si la regla se propagó correctamente a todos los pods, la página se carga inmediatamente y aparece el mensaje El service de calificaciones no está disponible actualmente.

  3. Si cierra la sesión del usuario jason o abre la aplicación Bookinfo en una ventana anónima (o en otro navegador), verá que /productpage todavía llama a reviews:v1 (que no llama a ratings en absoluto) para todos excepto para jason. Por lo tanto, no verá ningún mensaje de error.

Limpieza

  1. Elimine las reglas de enrutamiento de la aplicación:

    Zip
    $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  2. Si no planea explorar ninguna tarea de seguimiento, consulte las instrucciones de limpieza de Bookinfo para apagar la application.

¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!