1. Descripción general
En la primera parte del lab, creaste una aplicación ASP.NET Core alojada en contenedores y la implementaste en Google Kubernetes Engine (GKE) y configuraste su tráfico para que lo administre Istio.
En esta segunda parte del lab, se da por sentado que ya tienes tu clúster de Kubernetes y la aplicación del primer lab ejecutándose. Verás cómo Istio puede ayudarte a administrar, supervisar y proteger tus servicios con cambios mínimos en el código. Específicamente, explorarás las funciones de Istio, como las métricas, el seguimiento, la visualización del servicio, la administración del tráfico dinámico, la inyección de fallas y mucho más.
Qué aprenderás
- Cómo consultar métricas con Prometheus
- Cómo visualizar métricas con Grafana
- Cómo crear una versión nueva de tu servicio
- Cómo fijar un servicio a una versión específica
- Cómo dividir el tráfico entre diferentes versiones
- Cómo insertar fallas en las llamadas de servicio
Requisitos
¿Cómo usarás este instructivo?
¿Cómo calificarías tu experiencia con Google Cloud Platform?
2. Configuración y requisitos
Configuración del entorno de autoaprendizaje
- Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).
Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID
.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.
Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.
Inicia Cloud Shell
Si bien Google Cloud se puede operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud.
Activar Cloud Shell
- En la consola de Cloud, haz clic en Activar Cloud Shell.
Si nunca ha iniciado Cloud Shell, aparecerá una pantalla intermedia (debajo de la mitad inferior de la página) que describe qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verlo). Así es como se ve la pantalla única:
El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.
Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador o tu Chromebook.
Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.
- En Cloud Shell, ejecuta el siguiente comando para confirmar que está autenticado:
gcloud auth list
Resultado del comando
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
Resultado del comando
[core] project = <PROJECT_ID>
De lo contrario, puedes configurarlo con el siguiente comando:
gcloud config set project <PROJECT_ID>
Resultado del comando
Updated property [core/project].
3. Prueba la aplicación
Antes de comenzar el lab, asegúrate de que la aplicación siga funcionando del lab anterior. Como recordatorio, así es como ves la IP externa y el puerto de la puerta de enlace, que se enumeran en EXTERNAL-IP
:
kubectl get svc istio-ingressgateway -n istio-system
Para ver la aplicación, puedes abrir tu navegador y navegar a http://<gatewayurl>
:
Si no ves la aplicación, regresa al lab anterior para asegurarte de que seguiste todos los pasos y de que Istio y la aplicación estén instalados y ejecutándose correctamente.
En este punto, es posible que te preguntes cuál es el beneficio de Istio. Cuando permites que Istio administre el tráfico de tu aplicación, obtienes funciones como métricas, seguimiento, administración de tráfico dinámico, visualización de servicios, inyección de fallas y más de forma gratuita.
En el siguiente paso, comenzarás a explorar las métricas.
4. Métricas con Grafana y Prometheus
De forma predeterminada, Istio genera algunas métricas. Puedes usar complementos para consultar y visualizar estas métricas predeterminadas.
Prometheus
Prometheus es una solución de supervisión de código abierto. Puedes usar Prometheus para consultar las métricas que genera Istio, pero primero debes instalar el complemento de Prometheus.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
Verifica que Prometheus esté en ejecución:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
Si deseas enviar algo de tráfico a la aplicación, visita http://<gatewayurl>
varias veces o ejecuta el comando curl.
Configura la redirección de puertos para la IU de Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
Ahora puedes ejecutar una consulta haciendo clic en el botón Vista previa en la Web en la esquina superior derecha de Cloud Shell y, luego, en Vista previa en el puerto 8080:
Verás la IU de Prometheus en una pestaña nueva:
Para obtener más información sobre Prometheus, visita Consulta métricas con Prometheus.
Grafana
Grafana es otro complemento para visualizar métricas.
Instala Grafana. Reemplaza istio-version
por tu versión actual de Istio,por ejemplo, 1.0.3-gke.3
:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
Verifica que Grafana se esté ejecutando:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
Si deseas enviar algo de tráfico a la aplicación, visita http://<gatewayurl>
varias veces o ejecuta el comando curl.
Configura la redirección de puertos para la IU de Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Puedes ver los paneles de Grafana si visitas Vista previa en la Web:
Para obtener más información sobre Granfana, consulta Visualiza métricas con Grafana.
5. Crea una versión nueva de la aplicación
En algún momento, la aplicación que implementó en producción requerirá la corrección de errores o funciones adicionales. Veamos cómo es ese proceso.
Primero, modifiquemos la aplicación. Abre el editor de código de Cloud Shell.
Navega a Index.cshtml
en HelloWorldAspNetCore > Views > Home
y actualiza uno de los mensajes del carrusel.
Busca la siguiente línea:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
Y cámbielo a lo siguiente:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
Guarda los cambios y, luego, regresa a Cloud Shell. En HelloWorldAspNetCore,
, compila la imagen de Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
Enviarlo a Container Registry:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
Después de enviar la imagen del contenedor, puedes implementar la versión nueva en el siguiente paso.
6. Crea la nueva implementación
Para implementar la versión nueva, primero debes crear una implementación nueva en Kubernetes. Agrega lo siguiente al final del archivo aspnetcore.yaml
:
--- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v2 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v2 template: metadata: labels: app: aspnetcore version: v2 spec: containers: - name: aspnetcore image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
Implementa la versión nueva en el espacio de nombres predeterminado con kubectl
:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
Verifica que los Pods esperados se estén ejecutando:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
Ahora, vuelve a probar la aplicación. Obtén la IP externa de la puerta de enlace:
kubectl get svc istio-ingressgateway -n istio-system
Aparece en EXTERNAL-IP. Abre un navegador de incógnito y visita http://<replace-with-external-ip>
.
En ocasiones, cuando actualices la página, verás el mensaje "Learn about building web apps with ASP.NET Core" (Obtén más información sobre cómo compilar aplicaciones web con ASP.NET Core):
En otras ocasiones, verás el mensaje “Learn about building web apps with ASP.NET Core on Google Cloud” (Obtén más información sobre cómo compilar apps web con ASP.NET Core en Google Cloud):
Esto se debe a que las implementaciones de v1
y v2
se exponen detrás del mismo servicio de Kubernetes (aspnetcore-service
) y el VirtualService que creaste en el lab anterior (aspnetcore-virtualservice
) usa ese servicio como host.
En el siguiente paso, debes fijar el servicio a la implementación de v2
con una DestinationRule.
7. Cómo fijar el servicio a la versión nueva
En este paso, fijas tu servicio para usar la implementación de v2
y puedes hacerlo con una DestinationRule. DestinationRule configura el conjunto de políticas que se aplicará a una solicitud después de que se produzca una operación de enrutamiento de VirtualService.
También define subconjuntos direccionables, es decir, versiones con nombre, del host de destino correspondiente. Estos subconjuntos se usan en las especificaciones de ruta de VirtualService cuando se envía tráfico a versiones específicas del servicio.
Crea un archivo nuevo llamado aspnetcore-destinationrule.yaml
de la siguiente manera:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: aspnetcore-destinationrule spec: host: aspnetcore-service trafficPolicy: tls: mode: ISTIO_MUTUAL subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
A continuación, crea DestinationRule. Esto crea dos subconjuntos (v1 y v2) que puedes usar desde VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
Ahora, regresa al archivo aspnetcore-virtualservice.yaml
para actualizar VirtualService y usar el subconjunto v2
:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v2
Actualiza el VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Abre el navegador y visita http://<replace-with-external-ip>.
Incluso después de varias actualizaciones, deberías ver el mensaje “Learn about building web apps with ASP.NET Core on Google Cloud”:
8. Divide el tráfico entre versiones
A veces, es posible que desees dividir el tráfico entre versiones para realizar pruebas. Por ejemplo, es posible que desees enviar un 75% del tráfico a la versión v1 y un 25% del tráfico a la versión v2 del servicio. Puedes lograr esto fácilmente con Istio. Crea un nuevo archivo aspnetcore-virtualservice-weights.yaml
para hacer referencia a los dos subconjuntos con diferentes pesos:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v1 weight: 75 - destination: host: aspnetcore-service subset: v2 weight: 25
Actualiza el VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Ahora, cuando actualices el navegador, deberías ver las versiones v1 frente a v2 con una proporción aproximada de 3:1.
Para obtener más información, consulta cómo dividir el tráfico en Istio.
9. Inyectar fallas
Otra tarea de desarrollo útil para realizar pruebas es insertar fallas o retrasos en el tráfico y ver cómo se comportan los servicios en respuesta.
Por ejemplo, es posible que desees mostrar una respuesta de solicitud incorrecta (HTTP 400) para el 50% del tráfico a la versión v1. Crea un archivo aspnetcore-virtualservice-fault-abort.yaml
para que coincida con lo siguiente:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: abort: percentage: value: 50 httpStatus: 400 route: - destination: host: aspnetcore-service subset: v1
Actualiza el VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Ahora, cuando actualices el navegador, deberías ver que la mitad de las veces, el servicio v1 muestra un código de respuesta HTTP 400.
O quizás deseas agregar un retraso de 5 segundos a las solicitudes. Crea un archivo aspnetcore-virtualservice-fault-delay.yaml
para que coincida con lo siguiente:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: delay: fixedDelay: 5s percentage: value: 100 route: - destination: host: aspnetcore-service subset: v1
Actualiza el VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Ahora, cuando actualices el navegador, deberías ver que las solicitudes tienen una demora de 5 segundos.
Para obtener más información sobre las funciones de Istio, como los tiempos de espera, los reintentos, las reglas condicionales, los disyuntores y mucho más, consulta las funciones de administración de tráfico.
10. ¡Felicitaciones!
Esperamos que este lab te haya brindado una descripción general de lo que Istio puede hacer por tus servicios desde el primer momento. Para obtener más información sobre Istio y GKE.
Próximos pasos
- Obtén más información sobre Istio.
- Obtén más información sobre Kubernetes.
- Obtén más información sobre Google Kubernetes Engine.
- Obtenga más información sobre .NET en Google Cloud Platform.
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.
11. Limpieza
Puedes borrar la app y desinstalar Istio o simplemente borrar el clúster de Kubernetes.
Borra la aplicación
Para borrar la aplicación, haz lo siguiente:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
Para confirmar que la aplicación ya no está disponible, sigue estos pasos:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Desinstala Istio.
Para borrar Istio, haz lo siguiente:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Para confirmar que Istio desapareció, ejecuta el siguiente comando:
kubectl get pods -n istio-system
Borra el clúster de Kubernetes
gcloud container clusters delete hello-dotnet-cluster