Esegui il deployment dell'app ASP.NET Core in Google Kubernetes Engine con Istio (parte 2)

1. Panoramica

Nella prima parte del lab, hai creato un'applicazione ASP.NET Core, l'hai containerizzata e l'hai eseguita il deployment in Google Kubernetes Engine (GKE) e hai configurato il traffico in modo che venga gestito da Istio.

Questa seconda parte del lab presuppone che il cluster Kubernetes e l'applicazione del primo lab siano già in esecuzione. Vedrai come Istio può aiutarti a gestire, monitorare e proteggere i tuoi servizi con modifiche minime al codice. In particolare, esplorerai funzionalità di Istio come metriche, tracciamento, visualizzazione dei servizi, gestione dinamica del traffico, inserimento di errori e altro ancora.

Obiettivi didattici

  • Come eseguire query sulle metriche con Prometheus.
  • Come visualizzare le metriche con Grafana.
  • Come creare una nuova versione del servizio.
  • Come bloccare un servizio su una versione specifica.
  • Come suddividere il traffico tra versioni diverse.
  • Come inserire errori nelle chiamate di servizio.

Che cosa ti serve

Come utilizzerai questo tutorial?

Leggilo e basta Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Google Cloud Platform?

Principiante Intermedio Avanzato

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o G Suite, devi crearne uno.

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Ricorda l'ID progetto, un nome univoco tra tutti i progetti Google Cloud (il nome sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni riportate nella sezione "Pulizia", che ti consiglia come arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud.

Attiva Cloud Shell

  1. Nella console Cloud, fai clic su Attiva Cloud Shell dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Se non hai mai avviato Cloud Shell, viene visualizzata una schermata intermedia (sotto la piega) che ne descrive le funzionalità. In questo caso, fai clic su Continua e non comparirà più. Ecco come si presenta la schermata intermedia:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Questa macchina virtuale è caricata con tutti gli strumenti per sviluppatori di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto semplicemente con un browser o con Chromebook.

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output 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

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. testa l'applicazione

Prima di iniziare il lab, assicurati che l'applicazione funzioni ancora come nel lab precedente. Ti ricordiamo che l'IP esterno e la porta del gateway, elencati in EXTERNAL-IP, vengono visualizzati nel seguente modo:

kubectl get svc istio-ingressgateway -n istio-system

Per visualizzare l'applicazione, puoi aprire il browser e andare all'indirizzo http://<gatewayurl>:

f579a9baedc108a9.png

Se non vedi l'applicazione, torna al lab precedente per assicurarti di aver seguito tutti i passaggi e che sia l'applicazione che Istio siano installati e in esecuzione correttamente.

A questo punto, potresti chiederti: "Qual è il vantaggio di Istio?". Se lasci che Istio gestisca il traffico della tua applicazione, ottieni senza costi funzionalità come metriche, tracciamento, gestione dinamica del traffico, visualizzazione dei servizi, inserimento di errori e altro ancora.

Inizierai a esplorare le metriche nel passaggio successivo.

4. Metriche con Grafana e Prometheus

Per impostazione predefinita, Istio genera alcune metriche. Puoi utilizzare i componenti aggiuntivi per eseguire query e visualizzare queste metriche predefinite.

Prometheus

Prometheus è una soluzione di monitoraggio open source. Puoi utilizzare Prometheus per eseguire query sulle metriche generate da Istio, ma devi prima installare il componente aggiuntivo Prometheus.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml

Verifica che Prometheus sia in esecuzione:

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

Invia un po' di traffico all'applicazione visitando http://<gatewayurl> alcune volte o eseguendo il comando curl.

Configura il port forwarding per la UI di Prometheus:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090

Ora puoi eseguire una query facendo clic sul pulsante Anteprima web nell'angolo in alto a destra di Cloud Shell e su Anteprima sulla porta 8080:

772a5248aa493025.png

Vedrai l'interfaccia utente di Prometheus in una nuova scheda:

272ee63c1fe0be16.png

Per saperne di più su Prometheus, consulta Esecuzione di query sulle metriche con Prometheus.

Grafana

Grafana è un altro componente aggiuntivo per visualizzare le metriche.

Installa Grafana. Sostituisci istio-version con la tua versione attuale di Istio, ad esempio 1.0.3-gke.3:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml

Verifica che Grafana sia in esecuzione:

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

Invia un po' di traffico all'applicazione visitando http://<gatewayurl> alcune volte o eseguendo il comando curl.

Configura il port forwarding per la UI di Grafana:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000

Puoi visualizzare le dashboard di Grafana visitando l'anteprima web:

806d696d85267a37.png

524cb9f6d66f8655.png

Per scoprire di più su Grafana, consulta Visualizzare le metriche con Grafana.

5. Crea una nuova versione dell'applicazione

A un certo punto, l'applicazione che hai implementato in produzione richiederà correzioni di bug o funzionalità aggiuntive. Vediamo come si svolge questa procedura.

Innanzitutto, modifichiamo l'applicazione. Apri l'editor di codice da Cloud Shell.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

Vai a Index.cshtml in HelloWorldAspNetCore > Views > Home e aggiorna uno dei messaggi del carosello.

Trova la seguente riga:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core 

e modificalo in questo modo:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud

Salva le modifiche e torna a Cloud Shell. All'interno di HelloWorldAspNetCore, crea l'immagine Docker:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

ed esegui il push in Container Registry:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 

Dopo aver eseguito il push dell'immagine container, puoi eseguire il deployment della nuova versione nel passaggio successivo.

6. Crea il nuovo deployment

Per eseguire il deployment della nuova versione, devi prima creare un nuovo deployment in Kubernetes. Aggiungi quanto segue alla fine del file 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

Esegui il deployment della nuova versione nello spazio dei nomi predefinito con kubectl:

kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged
deployment.extensions "aspnetcore-v1" unchanged
deployment.extensions "aspnetcore-v2" created

Verifica che i pod previsti siano in esecuzione:

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

Ora, testa di nuovo l'applicazione. Ottieni l'IP esterno del gateway:

kubectl get svc istio-ingressgateway -n istio-system

È elencato in EXTERNAL-IP. Apri un browser in incognito e visita la pagina http://<replace-with-external-ip>.

Quando aggiorni, a volte viene visualizzato il messaggio "Scopri come creare app web con ASP.NET Core":

11d528132dbb6cee.png

Altre volte, vedrai il messaggio "Scopri come creare app web con ASP.NET Core su Google Cloud":

3eb0d5be1b4cb40b.png

Questo perché i deployment v1 e v2 sono esposti dietro lo stesso servizio Kubernetes (aspnetcore-service) e il VirtualService che hai creato nel lab precedente (aspnetcore-virtualservice) utilizza questo servizio come host.

Nel passaggio successivo, blocchi il servizio nel deployment v2 utilizzando una DestinationRule.

7. Bloccare il servizio alla nuova versione

In questo passaggio, blocchi il servizio in modo che utilizzi il deployment v2 e puoi farlo con una DestinationRule. Una DestinationRule configura l'insieme di policy da applicare a una richiesta dopo che è stata eseguita un'operazione di routing VirtualService.

Una DestinationRule definisce anche sottoinsiemi indirizzabili, ovvero versioni denominate, dell'host di destinazione corrispondente. Questi sottoinsiemi vengono utilizzati nelle specifiche di route VirtualService quando si invia traffico a versioni specifiche del servizio.

Crea un nuovo file denominato aspnetcore-destinationrule.yaml:

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 questo punto, crea DestinationRule. In questo modo vengono creati due sottoinsiemi (v1 e v2) che puoi utilizzare da VirtualService:

kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created

Ora torna al file aspnetcore-virtualservice.yaml per aggiornare VirtualService in modo che utilizzi il sottoinsieme 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

Aggiorna il VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

Apri il browser e visita http://<replace-with-external-ip>. Anche dopo diversi aggiornamenti, dovresti visualizzare il messaggio "Scopri come creare app web con ASP.NET Core su Google Cloud":

3eb0d5be1b4cb40b.png

8. Suddividi il traffico tra le versioni

A volte, potresti voler suddividere il traffico tra le versioni per i test. Ad esempio, potresti voler inviare il 75% del traffico alla versione v1 e il 25% alla versione v2 del servizio. Puoi farlo facilmente con Istio. Crea un nuovo file aspnetcore-virtualservice-weights.yaml per fare riferimento ai due sottoinsiemi con pesi diversi:

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

Aggiorna il VirtualService:

kubectl apply -f aspnetcore-virtualservice-weights.yaml

Ora, quando aggiorni il browser, dovresti vedere le versioni v1 e v2 pubblicate con un rapporto di circa 3:1.

Per scoprire di più, consulta la sezione Suddivisione del traffico in Istio.

9. Inserisci errori

Un'altra attività di sviluppo utile da eseguire per i test è l'inserimento di errori o ritardi nel traffico per vedere come si comportano i servizi in risposta.

Ad esempio, potresti voler restituire una risposta di richiesta errata (HTTP 400) per il 50% del traffico alla versione v1. Crea il file aspnetcore-virtualservice-fault-abort.yaml in modo che corrisponda a quanto segue:

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

Aggiorna il VirtualService:

kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml

Ora, quando aggiorni il browser, dovresti vedere che metà delle volte il servizio v1 restituisce un codice di risposta HTTP 400.

Oppure vuoi aggiungere un ritardo di 5 secondi alle richieste. Crea il file aspnetcore-virtualservice-fault-delay.yaml in modo che corrisponda a quanto segue:

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

Aggiorna il VirtualService:

kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml

Ora, quando aggiorni il browser, dovresti notare che le richieste vengono ritardate di 5 secondi.

Per scoprire di più sulle funzionalità di Istio come timeout, tentativi, regole condizionali, interruttori e altro ancora, consulta le funzionalità di gestione del traffico.

10. Complimenti!

Speriamo che questo lab ti abbia fornito una panoramica di ciò che Istio può fare per i tuoi servizi out-of-the-box. Per scoprire di più su Istio e GKE.

Passaggi successivi

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.

11. Esegui la pulizia

Puoi eliminare l'app e disinstallare Istio oppure eliminare semplicemente il cluster Kubernetes.

Eliminare l'applicazione

Per eliminare l'applicazione:

kubectl delete -f aspnetcore-gateway.yaml
kubectl delete -f aspnetcore-virtualservice.yaml
kubectl delete -f aspnetcore-destinationrule.yaml
kubectl delete -f aspnetcore.yaml

Per verificare che l'applicazione non sia più presente:

kubectl get gateway 
kubectl get virtualservices
kubectl get destinationrule
kubectl get pods

Disinstalla Istio

Per eliminare Istio:

kubectl delete -f install/kubernetes/istio-demo-auth.yaml

Per verificare che Istio non sia più presente:

kubectl get pods -n istio-system

Elimina il cluster Kubernetes

gcloud container clusters delete hello-dotnet-cluster