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:
$ 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:
productpage
→reviews:v2
→ratings
(solo para el usuariojason
)productpage
→reviews: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.
Cree una regla de inyección de fallos para retrasar el tráfico proveniente del usuario de prueba
jason
.$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
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
Abra la aplicación web Bookinfo en su navegador.
En la página web
/productpage
, inicie sesión como usuariojason
.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.
Verifique los tiempos de respuesta de la página web:
- Abra el menú Herramientas de Desarrollador en su navegador web.
- Abra la pestaña Red
- 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:
- Aumentando el tiempo de espera del service
productpage
areviews
o disminuyendo el tiempo de espera dereviews
aratings
- Deteniendo y reiniciando el microservice corregido
- 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
.
Cree una regla de inyección de fallos para enviar un aborto HTTP para el usuario
jason
:$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
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
Abra la aplicación web Bookinfo en su navegador.
En la
/productpage
, inicie sesión como usuariojason
.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
.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 areviews:v1
(que no llama aratings
en absoluto) para todos excepto parajason
. Por lo tanto, no verá ningún mensaje de error.
Limpieza
Elimine las reglas de enrutamiento de la aplicación:
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
Si no planea explorar ninguna tarea de seguimiento, consulte las instrucciones de limpieza de Bookinfo para apagar la application.