Una nota de nuestro personal editorial sobre las traducciones: el artículo presentado describe el producto cerrado de una compañía en particular y, desafortunadamente, no hay evidencia de que alguna vez se planee abrirlo, en el sentido de la palabra de Stallman. Sin embargo, nos pareció muy importante y útil considerar cómo las personas generalmente abordan los problemas de depuración de Istio y cómo optimizan su trabajo en este campo. Tal vez alguien va a ser capaz de dibujar para un par de ideas interesantes.En algún momento, al desarrollar sistemas de producción basados en la arquitectura de microservicios, llegamos a la conclusión de que monitorear cada elemento individual de nuestro servicio no es suficiente para enfrentar problemas serios. Con el tiempo, es necesario obtener una imagen completa de toda la pila de llamadas en toda la aplicación al mismo tiempo, con información detallada sobre la topología de la solicitud, los retrasos de la red y la duración de los comandos individuales. Para resolver este problema, los ingenieros suelen recurrir al rastreo distribuido.
En esta publicación, se examinará el concepto de rastreo distribuido a través del prisma de la arquitectura de microservicios: cómo todo se integra y automatiza a través de
Istio , y luego todo el proceso se simplifica y procesa a través de
Backyards , nuestro producto de servicio para Istio.
Entrada
Anteriormente,
escribimos sobre lo complicado que puede ser simplemente instalar y configurar Istio, por lo que para simplificar esta situación, elegimos el
desarrollo de código abierto de Banzai Cloud Istio . Además de Istio, puede usar una serie de herramientas convenientes con Helm (
Prometheus ,
Grafana ,
Jaeger ,
Kiali ), en cualquier caso, la
mayoría de las
solicitudes de soporte / integración provienen de ellos. Porque creemos que
cada uno elige una herramienta para el gusto , no aplicó estrictamente las herramientas enumeradas en Istio, pero sólo hizo posible integrar fácilmente estos componentes.
Además, queríamos proporcionar a nuestros usuarios otra herramienta poderosa para administrar los componentes enumerados en el clúster (es decir, algo diferente a Istio), por lo que también creamos
Backyards . Con él, puede instalar fácilmente Prometheus, Grafana y Jaeger y, a diferencia de Kiali, Backyards no es solo una interfaz de monitoreo basada en la web, sino una herramienta multifuncional con todas las funciones para administrar su red de servicios. Es compatible con uno o varios clústeres a la vez y contiene una potente CLI y API GraphQL.
En esta publicación, nos centraremos en el rastreo distribuido y Jaeger.
Introducción al rastreo distribuido
En la arquitectura de microservicios, cuando varios servicios se llaman entre sí al mismo tiempo, a menudo es difícil encontrar y depurar problemas. En realidad, en esta declaración se encuentra la razón principal por la cual la eficiencia de las solicitudes de servicio es baja: ¿qué servicio se ha convertido en un cuello de botella, qué tan grande es el retraso de la red entre las solicitudes?
Gracias al rastreo distribuido, puede visualizar el árbol de llamadas completo, ver qué servicio ha accedido a qué servicio, cuánto tiempo tarda cada llamada y cuál es el retraso en la respuesta. Es el rastreo distribuido que ayuda a determinar dónde ocurrió la falla y qué servicio está fuera del tiempo de respuesta.
El rastreo distribuido es el proceso de rastrear solicitudes individuales en toda la pila de llamadas dentro del sistema.

Sin usar el rastreo distribuido, es realmente fácil perderse en las muchas llamadas intercambiadas entre microservicios. También es difícil depurar problemas sin él, ya que solo debe confiar en los registros. Pero gracias al rastreo distribuido, toda la pila de llamadas con toda la información necesaria para diagnosticar el problema está disponible para usted.
Bajo el capó de un rastro distribuido
Span es la unidad más pequeña en una traza distribuida. Ella tiene las etiquetas "inicio" y "duración". Span tiene relaciones padre-hijo entre sí y juntos forman Trace.
Hay tres tareas para recolectar correctamente los rastros
1. Incoming request spans 2. Outgoing request spans 3. Context propagation
La solicitud entrante se extiende:
cuando una solicitud llega a un servicio, debe verificarse si hay un encabezado de rastreo. Si no hay encabezado, entonces es necesario crear un intervalo raíz (principal) para comenzar el seguimiento; de ser así, cree un intervalo secundario para continuar el seguimiento.
La solicitud de salida abarca:
cuando se envía una solicitud de un servicio a otro, primero se crea un intervalo, de modo que la parte que recibe la solicitud continúa rastreando, como se describió anteriormente.
Propagación de contexto:
Los servicios generalmente reciben y envían múltiples solicitudes a la vez. Sin realizar ningún cambio, es imposible rastrear la conexión entre las solicitudes entrantes y salientes. Aquí es donde llega la mejor hora para transmitir el contexto. Para HTTP, esto se puede hacer pasando los encabezados de seguimiento de las llamadas entrantes a las llamadas salientes desde la aplicación, lo que le permitirá crear un seguimiento completo.
Además de estas tareas, los rastros deben recopilarse, agruparse y visualizarse perfectamente.
Todo esto puede parecer lo suficientemente complicado como para implementarse en todos los servicios dentro del sistema, pero existen herramientas que le permiten resolver casi todas las tareas descritas en modo automático. Como resultado, los desarrolladores pueden obtener el rastreo distribuido, de hecho, fuera de la caja.
Para obtener más información sobre los principios básicos del rastreo distribuido, recomendaría leer esta excelente publicación de Nike .Rastreo Distribuido en Istio
En Istio, los servidores proxy de Envoy hacen el trabajo sucio del
rastreo distribuido . Hay una inyección de sidecar en Istio, gracias a la cual todas las solicitudes entrantes y salientes al servicio pasan primero por el servidor proxy Envoy. Es en esta etapa que se generan las trazas padre e hija, que son las dos primeras de las tres condiciones necesarias para crear una traza distribuida.
La tercera condición, la transferencia de contexto, debe realizarse a través de un cambio en la lógica de la aplicación. En
Istio Bookinfo, esto ya está implementado a nivel de cada microservicio, por lo que se pueden obtener seguimientos completos inmediatamente después de la instalación. Cuando utilice el rastreo distribuido en sus propios servicios, debe implementar la
propagación del contexto usted mismo.
Contrariamente a algunos conceptos erróneos comunes, vale la pena señalar que el soporte completo para el rastreo distribuido con
propagación de contexto, incluso a nivel de una grilla de servicio regular, solo puede crearse cambiando la lógica de la aplicación. Un buen ejemplo se proporciona en la
Advertencia 1 .
El sitio web de Istio tiene
documentación sobre qué encabezados usar. Todos son compatibles con
el formato de encabezado Zipkin .
Tenga en cuenta que, además de lo anterior el rastreo basado Envoy , en Istio hay seguimiento basado en mezclador , que se utiliza activamente componente Mixer. Es probable que en futuras versiones se suspenda Mixer, por lo que no describiré trabajar con él en detalle. Solo hay que decir que la telemetría del mezclador se puede sentir a través del operador.
Con Envoy y distribuyendo los encabezados de rastreo que necesitamos, podemos obtener los rastreos que necesitamos. Para recopilar y visualizar esta información, Istio viene con herramientas como
Jaeger ,
Zipkin ,
Lightstep y
Datadog . Por defecto, se utiliza Jaeger, también es la herramienta más popular de todas las mencionadas.
También podemos ajustar la frecuencia de muestreo, es decir, qué porcentaje de todas las solicitudes se presentarán en forma de trazas. El valor predeterminado es el 1% del número total de solicitudes. La frecuencia se puede cambiar aquí en
este campo del operador Istio.
Cómo funciona en Istio
Resumamos cómo hacer un rastreo distribuido con Jaeger (luego lo comparamos con el mismo proceso en Backyards):
- Junto con Istio, obtienes a Jaeger con todos los servicios y despliegues necesarios.
- La dirección del servicio de rastreo se establece de forma predeterminada mediante la configuración de los servidores proxy de Envoy y, a través de ellos, funcionan los informes Span y los servicios de sidecar.
- Bookinfo se puede instalar antes de que todos los servicios distribuyan sus encabezados a trazas.
- Los rastros estarán disponibles después de que se haya recopilado suficiente información.
- El panel de control de Jaeger se puede redirigir para abrir la parte del usuario a través de un navegador.
Rastro distribuido en patios traseros
En Backyards, instalando, configurando Jaeger, instalando una aplicación de demostración con encabezados de rastreo distribuidos automáticamente y enviando cargas a todo esto, ¡todo se hace con un simple comando! Y después de vincular los servicios entre sí con las pistas, todo esto estará disponible desde la interfaz de usuario.
Ahora mira!
Crea un clústerBueno, para empezar, necesitamos un clúster en Kubernetes. Elevé el clúster de Kubernetes en GKE a través de la versión gratuita de Pipeline para desarrolladores. Si desea hacer lo mismo, cree su clúster a través de Pipeline en cualquiera de los cinco proveedores de nube que admitimos. De lo contrario, eleva tu grupo de Kubernetes en otro lugar.
Cómo funciona en los patios traserosAnteriormente, resumimos el resultado intermedio de que Jaeger se puede usar junto con Istio. Ahora comparemos cómo sucede todo en los patios traseros.
Ahora, la forma más fácil de instalar Istio, Backyards y la aplicación de demostración en un nuevo clúster es usar
la interfaz de línea de comando Backyards .
Debe ingresar solo un comando (en su clúster debe ser
KUBECONFIG):
$backyards install –a –run-demo
- Con este comando, Jaeger se instala automáticamente (en lugar de con nuestro operador de código abierto Istio y los componentes de Backyards).
- Como se mencionó anteriormente, Istio está listo para integrarse con otros componentes como Prometheus, Grafana o Jaeger. Cuando se instala Jaeger, su dirección de servicio se establece en la ventana de usuario del operador. En el futuro, esta dirección se escribe en todos los lugares donde se necesita para controlar los componentes de Istio y el flujo de datos.
- La aplicación de demostración también se instala de manera predeterminada. Utiliza los servicios de golang que ya están configurados para distribuir los encabezados de seguimiento necesarios.
- Comienza la carga automática de la aplicación de demostración (de ahí el indicador --run-demo ), por lo que puede comenzar inmediatamente a rastrear pistas.
- Jaeger se abre a través de la puerta de entrada, está vinculada a la interfaz de usuario y está disponible automáticamente tanto en forma de esquema como de lista.
Es literalmente tan simple como escribir un equipo para crear un nuevo clúster de Kubernetes, ¡así que
pruébalo si quieres!
Esto es lo que verás:Jaeger vinculado con el esquema:

Y aquí hay una lista:

Interfaz de usuario de Jaeger para la aplicación de demostración:


En la interfaz de usuario, puede ver toda la pila de llamadas en su sistema de microservicio. Ahora puede rastrear exactamente cuándo se lanzó la solicitud raíz y cuánto tiempo tomó cada solicitud. O, por ejemplo, puede ver que el servicio analítico dedicó la mayor parte del tiempo a ciertas consultas, ya que está ocupado con cálculos reales (por ejemplo, calcula los valores de Pi).
LimpiezaPara eliminar la aplicación de demostración, Backyards e Istio de su clúster, solo necesita un equipo. Ella se encargará de eliminar todos los componentes en el orden correcto:
$ backyards uninstall -a
Resumen
El rastreo distribuido es necesario principalmente para los sistemas distribuidos existentes en los que es necesario solucionar cualquier dificultad o problema. Nuestro operador, Istio, se enfoca únicamente en la gestión, donde Backyards contiene muchos más componentes que se pueden usar en el trabajo. Por ejemplo, este es Jaeger, que proporciona la capacidad de realizar un rastreo distribuido.
En este caso, Jaeger se instala utilizando Backyards, y este último muestra todos los enlaces y rastros de Jaeger en el sistema directamente en la interfaz.
Que tengas un buen rastro!