Implementa una app de ASP.NET Core en Google Kubernetes Engine con Istio (parte 2)

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?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia con Google Cloud Platform?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. 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).

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

  1. 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

  1. En la consola de Cloud, haz clic en Activar Cloud ShelldnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jyZPWWFLuDQf.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NkNzuujcd1

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

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.

  1. 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>:

f579a9baedc108a9.png

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:

772a5248aa493025.png

Verás la IU de Prometheus en una pestaña nueva:

272ee63c1fe0be16.png

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:

806d696d85267a37.png

524cb9f6d66f8655.png

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.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

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):

11d528132dbb6cee.png

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):

3eb0d5be1b4cb40b.png

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”:

3eb0d5be1b4cb40b.png

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

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