- Minikube con Profiles, para poder tener varios mini clusters de Kubernetes:
Para tener uno dedicado a Istio (ponerle el nombre que se quiera):
minikube start --memory 6144 -p istio2
Se podrán ver los perfiles (por defecto aparecerá uno default, Minikube y el nuevo) y su estado con:
minikube profile list
Para poder usar el service de kubernetes de tipo LoadBalancer:
minikube tunnel -p istio2
El dashboard de kubernetes para este profile se vera con:
minikube dashboard -p istio2
- Instalacion de Istio:
Instalar Istio:
curl -L https://istio.io/downloadIstio | sh -
Para poder usar istioctl en la terminal (utilizar la version adecuada):
export PATH="$PATH:/Users/diegochavez/tools/istio-1.9.5/bin"
Setear el perfil demo, con varias aplicaciones instaladas:
cd istio-1.9.5/
istioctl install --set profile=demo -y
Anotar el namespace de Kubernetes para que por defecto inyecte los sidecar en las app:
kubectl label namespace default istio-injection=enabled
Para poder ver Kiali y Jaeger:
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
Ver la herramienta Jaeger, para Trazabilidad:
istioctl dashboard jaeger
Ver la herramienta Kali, para observabilidad:
istioctl dashboard kiali
Ingresar con admin/admin
Se levantaran sendos browsers con estas herramientas.
- Construir las imagenes de los Micros. En la carpeta de cada uno de ellos (micro1, micro2, micro3):
go mod init github.com/diegochavezcarro/tracing-micro1
docker build -t diegochavezcarro/tracing-micro1:v1 .
go mod init github.com/diegochavezcarro/tracing-micro2
docker build -t diegochavezcarro/tracing-micro2:v1 .
go mod init github.com/diegochavezcarro/tracing-micro3
docker build -t diegochavezcarro/tracing-micro3:v1 .
- Instalar los micros dentro de Istio
kubectl apply -f tracing-micros.yaml
- Instalar el Ingress Gateway:
kubectl apply -f tracing-gateway.yaml
- Ver la app en un browser:
kubectl get svc -n istio-system
Buscar istio-ingressgateway, obtener su "IP externa" y usar el puerto interno
Por ej:
Esto gracias a estar utilizándose el "minikube tunnel",
En caso de problemas (por ej Driver Docker)
minikube -p istio2 service istio-ingressgateway -n istio-system
Y probar en el segundo browser que se levanta (agregar "/call").
Se debera ver algo como lo siguiente:
- En el codigo correspondiente al primer commit:
https://github.com/diegochavezcarro/tracing-micros/commit/6d4c4087a193f3453e941c8dd9914f4a73e8c7f1
No se propagaban los headers de OpenTelemetry:
response, err := http.Get("http://micro2:8081/call")
Por lo cual no habia continuidad de Trazas:
- El el codigo final se propagan algunas de las trazas recomendadas en:
Ver:
https://github.com/diegochavezcarro/tracing-micros/blob/main/micro1/micro1.go
De esta manera se puede ver la trazabilidad completa:
- En ambos casos tambien se puede ver con Kiali (incluso si no se propagaran los headers):
Istio propaga headers para OpenTelemetry de forma automatica entre los proxy Envoy, pero dentro de los microservicios hay que tomar esos headers y propagarlos hacia los demas que se vayan llamando. En lenguajes como Java con Spring es posible propagar automaticamente las trazas al utilizar librerias que lo soporten, ver:
https://github.com/diegochavezcarro/camunda-retry
Donde utilizando ciertas librerias como opentracing-spring-jaeger-cloud-starter y declarando donde esta el Jaeger (en caso Istio no es necesario) ya se resuelver todo, ver por ejemplo como incluso se propagan las trazas enntre diferentes threads con comunicacion asincronica (la zona donde no hay continuidad se debe a que hay un Kafka):
En el caso de Golang hay que hacerlo de forma programatica. En el caso Istio podria alcanzar propagando ciertos headers. En caso este por fuera de Istio hay que crear todos los Traces y Spans, ver: