Timeouts de Solicitud
Esta tarea te muestra cómo configurar timeouts de solicitud en Envoy usando Istio.
Antes de comenzar
Configura Istio siguiendo las instrucciones en la Guía de instalación.
Despliega la aplicación de ejemplo Bookinfo incluyendo las versiones del servicio.
Timeouts de solicitud
Un timeout para solicitudes HTTP puede ser especificado usando un campo timeout en una regla de ruta.
Por defecto, el timeout de solicitud está deshabilitado, pero en esta tarea sobrescribes el timeout del servicio reviews
a medio segundo.
Para ver su efecto, sin embargo, también introduces un retraso artificial de 2 segundos en las llamadas
al servicio ratings.
- Ruta las solicitudes al servicio
reviewsv2, es decir, una versión que llama al servicioratings:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
EOF$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
EOF- Añade un retraso de 2 segundos a las llamadas al servicio
ratings:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
subset: v1
EOFGateway API no soporta la inyección de fallos todavía, por lo que necesitamos usar un VirtualService de Istio
para añadir el retraso por ahora:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
EOFAbre la URL de Bookinfo
http://$GATEWAY_URL/productpageen tu navegador, donde$GATEWAY_URLes la dirección IP externa del ingress, tal como se explica en la Guía de Bookinfo doc.Deberías ver la aplicación Bookinfo funcionando normalmente (con estrellas de valoración mostradas), pero hay un retraso de 2 segundos cada vez que refrescas la página.
Ahora añade un timeout de solicitud de medio segundo para las llamadas al servicio
reviews:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 0.5s
EOF$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
timeouts:
request: 500ms
EOFRefresca la página web de Bookinfo.
Ahora deberías ver que tarda aproximadamente 1 segundo en devolverse, en lugar de 2, y las reseñas no están disponibles.
Entendiendo lo que ocurrió
En esta tarea, usaste Istio para establecer el timeout de solicitud para las llamadas al servicio reviews
a medio segundo. Por defecto, el timeout de solicitud está deshabilitado.
Dado que el servicio reviews llama al servicio ratings cuando maneja las solicitudes,
usaste Istio para inyectar un retraso de 2 segundos en las llamadas a ratings para hacer que
el servicio reviews tarde más de medio segundo en completarse y, por lo tanto, pudiste ver el timeout en acción.
Observaste que en lugar de mostrar reseñas, la página de producto de Bookinfo (que llama al servicio reviews para poblar la página) mostró
el mensaje: Lo sentimos, las reseñas del producto no están disponibles por ahora.
Esto fue el resultado de recibir el error de timeout del servicio reviews.
Si examinas la tarea de inyección de fallos, encontrarás que el servicio productpage
también tiene su propio timeout de aplicación (3 segundos) para las llamadas al servicio reviews.
Observa que en esta tarea usaste una regla de ruta de Istio para establecer el timeout a medio segundo.
Si en su lugar hubieras establecido el timeout a algo mayor que 3 segundos (como 4 segundos), el timeout
no habría tenido efecto ya que el más restrictivo de los dos prevalece.
Más detalles se pueden encontrar aquí.
Una cosa más sobre los timeouts en Istio es que, además de sobrescribirlos en las reglas de ruta,
como hiciste en esta tarea, también se pueden sobrescribir a nivel de solicitud por solicitud si la aplicación añade
un encabezado x-envoy-upstream-rq-timeout-ms en las solicitudes de salida. En el encabezado,
el timeout se especifica en milisegundos en lugar de segundos.
Limpieza
- Elimina las reglas de enrutamiento de la aplicación:
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@$ kubectl delete httproute reviews
$ kubectl delete virtualservice ratings- Si no tienes intención de explorar ninguna tarea posterior, consulta las instrucciones de limpieza de Bookinfo para apagar la aplicación.