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, in die ein Container verlagert, in der Google Kubernetes Engine (GKE) bereitgestellt und der Traffic für die Verwaltung durch Istio konfiguriert.

In diesem zweiten Teil des Labs wird davon ausgegangen, dass Sie bereits Ihren Kubernetes-Cluster und die Anwendung aus dem ersten Lab haben. Sie erfahren, wie Sie mit Istio Ihre Dienste mit minimalen Codeänderungen verwalten, überwachen und schützen können. Insbesondere lernen Sie Features von Istio kennen, z. B. Messwerte, Tracing, Dienstvisualisierung, dynamische Trafficverwaltung, Fehlerinjektion und mehr.

Lerninhalte

  • Anleitung zum Abfragen von Messwerten mit Prometheus.
  • So visualisieren Sie Messwerte mit Grafana.
  • So erstellen Sie eine neue Version Ihres Dienstes.
  • Einen Dienst an eine bestimmte Version anpinnen.
  • Traffic auf verschiedene Versionen aufteilen
  • So fügen Sie Fehler in Dienstaufrufe ein.

Voraussetzungen

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

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

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte 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 ein Konto 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 in diesem Codelab später als PROJECT_ID bezeichnet.

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

Dieses Codelab sollte möglichst wenig kosten. Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . Hier erfahren Sie, wie Sie Ressourcen herunterfahren, damit Ihnen über dieses Tutorial hinaus keine Kosten entstehen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.

Cloud Shell starten

Sie können Google Cloud zwar von Ihrem Laptop aus der Ferne bedienen, in diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird.

Cloud Shell aktivieren

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

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Wenn Sie Cloud Shell zum ersten Mal verwenden, wird ein Zwischenbildschirm (below the fold) angezeigt, in dem beschrieben wird, worum es sich dabei handelt. Klicken Sie in diesem Fall auf Weiter. Der Chat wird nie wieder angezeigt. So sieht dieser einmalige Bildschirm aus:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_MKMKNzu

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können Sie ganz einfach mit einem Browser oder Ihrem Chromebook erledigen.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in 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

Prüfen Sie vor Beginn des Labs, ob die Anwendung des vorherigen Labs 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

Wenn Sie sich die Anwendung ansehen möchten, öffnen Sie Ihren Browser und rufen Sie http://<gatewayurl> auf:

f579a9baedc108a9.png

Wenn Sie die Anwendung nicht sehen, kehren Sie zum vorherigen Lab zurück, um sicherzustellen, dass Sie alle Schritte ausgeführt haben und sowohl die Anwendung als auch Istio installiert sind und ordnungsgemäß ausgeführt werden.

An dieser Stelle fragen Sie sich vielleicht, welche Vorteile Istio bietet. Wenn Sie Istio den Traffic Ihrer Anwendung verwalten lassen, erhalten Sie Features wie Messwerte, Tracing, dynamische Trafficverwaltung, Dienstvisualisierung, Fehlerinjektion und mehr kostenlos.

Im nächsten Schritt untersuchen Sie Messwerte.

4. Messwerte mit Grafana und Prometheus

Standardmäßig generiert Istio einige Messwerte. Mit Add-ons können Sie diese Standardmesswerte abfragen und visualisieren.

Prometheus

Prometheus ist eine Open-Source-Monitoringlösung. Sie können Prometheus verwenden, um von Istio generierte Messwerte abzufragen, aber Sie müssen 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 Traffic an die Anwendung, indem Sie http://<gatewayurl> mehrmals aufrufen oder den Befehl „curl“ ausführen.

Richten Sie die Portweiterleitung für die Prometheus-Benutzeroberfläche 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 in Cloud Shell oben rechts auf die Schaltfläche „Webvorschau“ und dann auf Vorschau auf Port 8080 klicken:

772a5248aa493025.png

Die Benutzeroberfläche von Prometheus 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

Überprü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 Traffic an die Anwendung, indem Sie http://<gatewayurl> mehrmals aufrufen oder den Befehl „curl“ 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 über die Webvorschau ansehen:

806d696d85267a37.png

524cb9f6d66f8655.png

Weitere Informationen zu Granfana finden Sie unter Visualizing Metrics with Grafana (Messwerte mit Grafana visualisieren).

5. Neue Anwendungsversion 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 dieser Prozess aussieht.

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

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

Gehen Sie unter HelloWorldAspNetCore > Views > Home zu Index.cshtml und aktualisieren Sie eine der Karussell-Nachrichten.

Suche nach der folgenden 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 zu Cloud Shell zurück. Erstellen Sie in HelloWorldAspNetCore, das Docker-Image:

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

Und laden Sie die Datei per Push in Container Registry hoch:

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

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

6. Neue Bereitstellung erstellen

Zum Bereitstellen der neuen Version müssen Sie zuerst ein neues Deployment in Kubernetes erstellen. Fügen Sie am Ende der Datei aspnetcore.yaml Folgendes ein:

---
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 jetzt 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. Öffne einen Inkognito-Browser und rufe http://<replace-with-external-ip> auf

Bei der Aktualisierung wird manchmal die Meldung "Learn about build 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 "Learn about build web apps with ASP.NET Core on Google Cloud" (Informationen zum Erstellen von Web-Apps mit ASP.NET Core in Google Cloud) angezeigt:

3eb0d5be1b4cb40b.png

Das liegt daran, dass die Deployments v1 und v2 hinter demselben Kubernetes-Dienst (aspnetcore-service) bereitgestellt werden und der im vorherigen Lab (aspnetcore-virtualservice) erstellte VirtualService diesen Dienst als Host verwendet.

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

7. Dienst an die neue Version anpinnen

In diesem Schritt pinnen Sie Ihren Dienst für die Verwendung der v2-Bereitstellung an. Verwenden Sie dazu eine DestinationRule. Eine DestinationRule konfiguriert die Richtlinien, die nach einem VirtualService-Routingvorgang auf eine Anfrage angewendet werden.

Eine DestinationRule definiert auch adressierbare Teilmengen, d. h. benannte Versionen, des entsprechenden Zielhosts. Diese Teilmengen werden in den 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 aus dem 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 die Teilmenge 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 „Learn about build web apps with ASP.NET Core on Google Cloud“ (Informationen zum Erstellen von Web-Apps mit ASP.NET Core in Google Cloud) angezeigt werden:

3eb0d5be1b4cb40b.png

8. Traffic zwischen Versionen aufteilen

Manchmal möchten Sie den Traffic zu Testzwecken auf verschiedene Versionen aufteilen. Beispiel: Sie möchten 75% des Traffics an die Version 1 und 25% des Traffics an die Version 2 des Dienstes senden. Mit Istio ist dies ganz einfach. Erstellen Sie eine neue aspnetcore-virtualservice-weights.yaml-Datei, um auf die beiden Teilmengen mit unterschiedlicher Gewichtung 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 jetzt den Browser aktualisieren, sollten Sie die Versionen V1 und V2 mit einem Verhältnis von 3:1 anzeigen.

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 einzuschleusen und zu sehen, wie sich Dienste als Reaktion darauf verhalten.

Angenommen, Sie möchten für 50% des Traffics an die Version V1 eine fehlerhafte Anfrage (HTTP 400) zurückgeben. Erstellen Sie die Datei aspnetcore-virtualservice-fault-abort.yaml entsprechend den folgenden Kriterien:

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 jetzt den Browser aktualisieren, sollte in der Hälfte der Fälle angezeigt werden, dass der v1-Dienst den HTTP-Antwortcode 400s zurückgibt.

Oder vielleicht möchten Sie die Anfragen um 5 Sekunden verzögern. Erstellen Sie die Datei aspnetcore-virtualservice-fault-delay.yaml entsprechend den folgenden Kriterien:

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 jetzt den Browser aktualisieren, sollten Sie sehen, dass sich die Anfragen um 5 Sekunden verzögern.

Weitere Informationen zu Istio-Features wie Zeitlimits, Wiederholungsversuchen, bedingten Regeln und Unterbrechungen der Netzwerkverbindung finden Sie unter Funktionen zur Trafficverwaltung.

10. Glückwunsch!

Hoffentlich haben Sie mit diesem Lab einen Überblick darüber erhalten, wie Ihre Dienste sofort von Istio unterstützt werden können. Hier erfahren Sie mehr über 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 Anwendung 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 nicht mehr verfügbar ist:

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 nicht mehr verfügbar ist:

kubectl get pods -n istio-system

Kubernetes-Cluster löschen

gcloud container clusters delete hello-dotnet-cluster