istio.io/content/es/docs/tasks/traffic-management/fault-injection/index.md

7.9 KiB

title description weight keywords aliases owner test
Inyección de Fallos Esta tarea muestra cómo inyectar fallos para probar la resiliencia de su application. 20
traffic-management
fault-injection
/docs/tasks/fault-injection.html
istio/wg-networking-maintainers yes

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:

    {{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@ {{< /text >}}

  • 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 microservicios de la application Bookinfo, inyecte un retardo de 7s entre los microservicios 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.

    {{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@ {{< /text >}}

  2. Confirme que la regla fue creada:

    {{< text bash yaml >}} $ 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 {{< /text >}}

    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:

    {{< text plain >}} Lo sentimos, las reseñas de productos no están disponibles actualmente para este libro. {{< /text >}}

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

{{< tip >}} Observe que la prueba de inyección de fallos se restringe a cuando el usuario conectado es jason. Si inicia sesión como cualquier otro usuario, no experimentará ningún retraso. {{< /tip >}}

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 microservicio 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 microservicios es introducir un fallo de aborto HTTP. En esta tarea, introducirá un aborto HTTP en los microservicios 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:

    {{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@ {{< /text >}}

  2. Confirme que la regla fue creada:

    {{< text bash yaml >}} $ 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 {{< /text >}}

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:

    {{< text bash >}} $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ {{< /text >}}

  2. Si no planea explorar ninguna tarea de seguimiento, consulte las instrucciones de limpieza de Bookinfo para apagar la application.