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?
Wie würden Sie Ihre Erfahrung mit der Google Cloud Platform bewerten?
2. Einrichtung und Anforderungen
Umgebung zum selbstbestimmten Lernen einrichten
- 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.
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.
- 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
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.
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:
Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.
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.
- 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:

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:

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

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:


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

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

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:

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
- Istio
- Weitere Informationen zu Kubernetes
- Weitere Informationen zu Google Kubernetes Engine
- .NET auf der Google Cloud Platform
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