ASP.NET Core-Anwendung mit Istio auf der Google Kubernetes Engine bereitstellen (Teil 2)

1. Übersicht

Im ersten Teil des Labs haben Sie eine ASP.NET Core-Anwendung erstellt, sie in einen Container gepackt und in Google Kubernetes Engine (GKE) bereitgestellt. Außerdem haben Sie konfiguriert, dass der Traffic von Istio verwaltet wird.

In diesem zweiten Teil des Labs wird davon ausgegangen, dass Ihr Kubernetes-Cluster und die Anwendung aus dem ersten Lab bereits ausgeführt werden. Sie erfahren, wie Istio Sie bei der Verwaltung, Überwachung und Sicherung Ihrer Dienste mit minimalen Codeänderungen unterstützen kann. Sie lernen die Funktionen von Istio kennen, z. B. Messwerte, Tracing, Dienstvisualisierung, dynamische Traffic-Verwaltung und Fault Injection.

Lerninhalte

  • Messwerte mit Prometheus abfragen
  • Messwerte mit Grafana visualisieren
  • So erstellen Sie eine neue Version Ihres Dienstes.
  • So pinnen Sie einen Dienst an eine bestimmte Version an.
  • So teilen Sie den Traffic auf verschiedene Versionen auf.
  • Fehler in Dienstaufrufe einfügen

Voraussetzungen

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrung mit der Google Cloud Platform bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.

  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Cloud Shell starten

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser oder Ihrem Chromebook erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Anwendung testen

Bevor Sie mit dem Lab beginnen, prüfen Sie, ob die Anwendung aus dem vorherigen Lab noch funktioniert. Zur Erinnerung: So sehen Sie die externe IP-Adresse und den Port des Gateways, die unter EXTERNAL-IP aufgeführt sind:

kubectl get svc istio-ingressgateway -n istio-system

Um die Anwendung aufzurufen, können Sie Ihren Browser öffnen und zu http://<gatewayurl> navigieren:

f579a9baedc108a9.png

Wenn die Anwendung nicht angezeigt wird, kehren Sie zum vorherigen Lab zurück und prüfen Sie, ob Sie alle Schritte ausgeführt haben und sowohl die Anwendung als auch Istio richtig installiert sind und ausgeführt werden.

An dieser Stelle fragen Sie sich vielleicht, welchen Vorteil Istio bietet. Wenn Sie den Traffic Ihrer Anwendung von Istio verwalten lassen, erhalten Sie kostenlos Funktionen wie Messwerte, Tracing, dynamische Trafficverwaltung, Dienstvisualisierung und Fehlerinjektion.

Im nächsten Schritt sehen Sie sich die Messwerte an.

4. Messwerte mit Grafana und Prometheus

Standardmäßig generiert Istio einige Messwerte. Sie können Add-ons verwenden, um diese Standardmesswerte abzufragen und zu visualisieren.

Prometheus

Prometheus ist eine Open-Source-Monitoring-Lösung. Sie können Prometheus verwenden, um von Istio generierte Messwerte abzufragen. Dazu müssen Sie jedoch zuerst das Prometheus-Add-on installieren.

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

Prüfen Sie, ob Prometheus ausgeführt wird:

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

Senden Sie etwas Traffic an die Anwendung, indem Sie http://<gatewayurl> einige Male aufrufen oder den curl-Befehl ausführen.

Richten Sie die Portweiterleitung für die Prometheus-UI ein:

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

Sie können jetzt eine Abfrage ausführen, indem Sie rechts oben in Cloud Shell auf die Schaltfläche „Webvorschau“ und dann auf Vorschau auf Port 8080 klicken:

772a5248aa493025.png

Die Prometheus-Benutzeroberfläche wird in einem neuen Tab angezeigt:

272ee63c1fe0be16.png

Weitere Informationen zu Prometheus finden Sie unter Messwerte mit Prometheus abfragen.

Grafana

Grafana ist ein weiteres Add-on zur Visualisierung von Messwerten.

Installieren Sie Grafana. Ersetzen Sie istio-version durch Ihre aktuelle Istio-Version, z. B. 1.0.3-gke.3:

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

Prüfen Sie, ob Grafana ausgeführt wird:

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

Senden Sie etwas Traffic an die Anwendung, indem Sie http://<gatewayurl> einige Male aufrufen oder den curl-Befehl ausführen.

Richten Sie die Portweiterleitung für die Grafana-Benutzeroberfläche ein:

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

Sie können Grafana-Dashboards aufrufen, indem Sie die Webvorschau aufrufen:

806d696d85267a37.png

524cb9f6d66f8655.png

Weitere Informationen zu Grafana finden Sie unter Messwerte mit Grafana visualisieren.

5. Neue Version der Anwendung erstellen

Früher oder später sind für die Anwendung, die Sie für die Produktion bereitgestellt haben, Fehlerbehebungen oder zusätzliche Funktionen erforderlich. Sehen wir uns an, wie das funktioniert.

Ändern wir zuerst die Anwendung. Öffnen Sie den Code-Editor über Cloud Shell.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

Öffnen Sie Index.cshtml unter HelloWorldAspNetCore > Views > Home und aktualisieren Sie eine der Karussellnachrichten.

Suchen Sie die folgende Zeile:

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

Ändern Sie sie in Folgendes:

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

Speichern Sie die Änderungen und kehren Sie dann zu Cloud Shell zurück. Erstellen Sie das Docker-Image in HelloWorldAspNetCore,:

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

Übertragen Sie das Image per Push in die Container Registry:

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

Nachdem Sie das Container-Image per Push übertragen haben, können Sie die neue Version im nächsten Schritt bereitstellen.

6. Neue Bereitstellung erstellen

Wenn Sie die neue Version bereitstellen möchten, müssen Sie zuerst ein neues Deployment dafür in Kubernetes erstellen. Fügen Sie am Ende der Datei aspnetcore.yaml Folgendes hinzu:

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

Stellen Sie die neue Version mit kubectl im Standard-Namespace bereit:

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

Prüfen Sie, ob die erwarteten Pods ausgeführt werden:

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

Testen Sie die Anwendung noch einmal. Rufen Sie die externe IP-Adresse des Gateways ab:

kubectl get svc istio-ingressgateway -n istio-system

Sie wird unter EXTERNAL-IP aufgeführt. Öffnen Sie einen Inkognito-Browser und rufen Sie http://<replace-with-external-ip> auf.

Wenn Sie die Seite aktualisieren, wird manchmal die Meldung „Learn about building Web apps with ASP.NET Core“ (Informationen zum Erstellen von Web-Apps mit ASP.NET Core) angezeigt:

11d528132dbb6cee.png

In anderen Fällen wird die Meldung „Informationen zum Erstellen von Web-Apps mit ASP.NET Core in Google Cloud“ angezeigt:

3eb0d5be1b4cb40b.png

Das liegt daran, dass sowohl v1- als auch v2-Bereitstellungen über denselben Kubernetes-Service (aspnetcore-service) verfügbar gemacht werden und der VirtualService, den Sie im vorherigen Lab erstellt haben (aspnetcore-virtualservice), diesen Service als Host verwendet.

Im nächsten Schritt pinnen Sie den Dienst mit einer DestinationRule an die v2-Bereitstellung.

7. Dienst an die neue Version anpinnen

In diesem Schritt legen Sie fest, dass Ihr Dienst die Bereitstellung v2 verwendet. Dazu können Sie eine DestinationRule verwenden. Mit einer DestinationRule wird der Satz von Richtlinien konfiguriert, die auf eine Anfrage angewendet werden, nachdem ein VirtualService-Routingvorgang stattgefunden hat.

In einer DestinationRule werden auch adressierbare Teilmengen, d. h. benannte Versionen, des entsprechenden Zielhosts definiert. Diese Teilmengen werden in VirtualService-Routenspezifikationen verwendet, wenn Traffic an bestimmte Versionen des Dienstes gesendet wird.

Erstellen Sie eine neue Datei mit dem Namen 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

Erstellen Sie als Nächstes die DestinationRule. Dadurch werden zwei Teilmengen (v1 und v2) erstellt, die Sie im VirtualService verwenden können:

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

Kehren Sie nun zur Datei aspnetcore-virtualservice.yaml zurück, um den VirtualService so zu aktualisieren, dass das Subset v2 verwendet wird:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service
        subset: v2

Aktualisieren Sie den VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

Öffnen Sie Ihren Browser und rufen Sie http://<replace-with-external-ip>. auf. Auch nach mehreren Aktualisierungen sollte die Meldung „Informationen zum Erstellen von Web-Apps mit ASP.NET Core in Google Cloud“ angezeigt werden:

3eb0d5be1b4cb40b.png

8. Traffic auf Versionen aufteilen

Manchmal möchten Sie den Traffic für Tests auf verschiedene Versionen aufteilen. Sie möchten beispielsweise 75% des Traffics an die Version 1 und 25% an die Version 2 des Dienstes senden. Mit Istio ist das ganz einfach möglich. Erstellen Sie eine neue aspnetcore-virtualservice-weights.yaml-Datei, um auf die beiden Teilmengen mit unterschiedlichen Gewichten zu verweisen:

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

Aktualisieren Sie den VirtualService:

kubectl apply -f aspnetcore-virtualservice-weights.yaml

Wenn Sie den Browser jetzt aktualisieren, sollten die Versionen 1 und 2 im Verhältnis 3:1 ausgeliefert werden.

Weitere Informationen finden Sie unter Trafficaufteilung in Istio.

9. Fehler einschleusen

Eine weitere nützliche Entwicklungsaufgabe für Tests besteht darin, Fehler oder Verzögerungen in den Traffic einzufügen und zu sehen, wie die Dienste darauf reagieren.

Beispielsweise möchten Sie möglicherweise für 50% des Traffics zur Version 1 eine Antwort vom Typ „Bad Request“ (HTTP 400) zurückgeben. Erstellen Sie eine aspnetcore-virtualservice-fault-abort.yaml-Datei, die den folgenden Anforderungen entspricht:

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

Aktualisieren Sie den VirtualService:

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

Wenn Sie den Browser jetzt aktualisieren, sollte der v1-Dienst in der Hälfte der Fälle einen HTTP-400-Antwortcode zurückgeben.

Vielleicht möchten Sie den Anfragen auch eine Verzögerung von 5 Sekunden hinzufügen. Erstellen Sie eine aspnetcore-virtualservice-fault-delay.yaml-Datei, die den folgenden Anforderungen entspricht:

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

Aktualisieren Sie den VirtualService:

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

Wenn Sie den Browser jetzt aktualisieren, sollten Sie sehen, dass Anfragen um 5 Sekunden verzögert werden.

Weitere Informationen zu Istio-Funktionen wie Zeitüberschreitungen, Wiederholungen, bedingten Regeln und Trennschaltern finden Sie unter Traffic-Verwaltungsfunktionen.

10. Glückwunsch!

Wir hoffen, dass Sie in diesem Lab einen Überblick darüber erhalten haben, was Istio für Ihre Dienste leisten kann. Weitere Informationen zu Istio und GKE

Nächste Schritte

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.

11. Bereinigen

Sie können die App löschen und Istio deinstallieren oder einfach den Kubernetes-Cluster löschen.

Anwendung löschen

So löschen Sie die Anwendung:

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

So prüfen Sie, ob die Anwendung entfernt wurde:

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

Istio deinstallieren

So löschen Sie Istio:

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

So prüfen Sie, ob Istio entfernt wurde:

kubectl get pods -n istio-system

Kubernetes-Cluster löschen

gcloud container clusters delete hello-dotnet-cluster