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

211 lines
7.9 KiB
Markdown

---
title: Inyección de Fallos
description: Esta tarea muestra cómo inyectar fallos para probar la resiliencia de su application.
weight: 20
keywords: [traffic-management,fault-injection]
aliases:
- /docs/tasks/fault-injection.html
owner: istio/wg-networking-maintainers
test: 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](/es/docs/setup/).
* Despliegue la application de ejemplo [Bookinfo](/es/docs/examples/bookinfo/) incluyendo las
[reglas de destino predeterminadas](/es/docs/examples/bookinfo/#apply-default-destination-rules).
* Revise la discusión sobre la inyección de fallos en el documento de conceptos de
[Gestión de Tráfico](/es/docs/concepts/traffic-management).
* Aplique el enrutamiento de versiones de la application realizando la tarea de
[enrutamiento de solicitudes](/es/docs/tasks/traffic-management/request-routing/) 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:
* `productpage``reviews:v2``ratings` (solo para el usuario `jason`)
* `productpage``reviews: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 >}}
1. 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](/es/docs/examples/bookinfo) en su navegador.
1. 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 >}}
1. Verifique los tiempos de respuesta de la página web:
1. Abra el menú *Herramientas de Desarrollador* en su navegador web.
1. Abra la pestaña Red
1. 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`
1. Deteniendo y reiniciando el microservicio corregido
1. 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](/es/docs/tasks/traffic-management/traffic-shifting/), 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 >}}
1. 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](/es/docs/examples/bookinfo) en su navegador.
1. 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`.
1. 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 >}}
1. Si no planea explorar ninguna tarea de seguimiento, consulte las
[instrucciones de limpieza de Bookinfo](/es/docs/examples/bookinfo/#cleanup)
para apagar la application.