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">Wie würden Sie Ihre Erfahrung mit der Google Cloud Platform bewerten?
<ph type="x-smartling-placeholder">2. Einrichtung und Anforderungen
Umgebung für das selbstbestimmte 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 ein Konto 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 in diesem Codelab später als PROJECT_ID
bezeichnet.
- 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
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren .
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:
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
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.
- 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:
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:
Die Benutzeroberfläche von Prometheus 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
Ü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:
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.
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:
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:
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:
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
- Istio
- Weitere Informationen zu Kubernetes
- Mehr über Google Kubernetes Engine erfahren
- .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 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