1. Übersicht
Microsoft .NET Core ist eine plattformübergreifende Open-Source-Version von .NET, die nativ in Containern ausgeführt werden kann. .NET Core ist auf GitHub verfügbar und wird von Microsoft und der .NET-Community verwaltet. In diesem Lab wird eine .NET Core-Containeranwendung in Google Kubernetes Engine (GKE) bereitgestellt.
In diesem Lab werden Anwendungen nach einem typischen Entwicklungsmuster in einer lokalen Entwicklerumgebung entwickelt und dann in der Produktion bereitgestellt. Im ersten Teil des Labs wird eine .NET Core-Beispielanwendung mit einem Container validiert, der in Cloud Shell ausgeführt wird. Nach der Validierung wird die Anwendung mit GKE auf Kubernetes bereitgestellt. Das Lab enthält die Schritte zum Erstellen eines GKE-Clusters.
Im zweiten Teil des Labs wird eine kleine Änderung an der Anwendung vorgenommen, die den Hostnamen des Containers anzeigt, in dem die Anwendungsinstanz ausgeführt wird. Die aktualisierte Anwendung wird dann in Cloud Shell validiert und die Bereitstellung wird aktualisiert, damit die neue Version verwendet wird. Die folgende Abbildung zeigt den Ablauf der Aktivitäten in diesem Lab:
Kosten
Wenn Sie dieses Lab genau wie beschrieben ausführen, fallen die üblichen Kosten für die folgenden Dienste an
2. Einrichtung und Anforderungen
Vorbereitung
Für dieses Lab sind ein Google Cloud-Konto und ein Projekt erforderlich. Eine ausführlichere Anleitung zum Erstellen eines neuen Projekts finden Sie in diesem Codelab.
In diesem Lab wird Docker in Cloud Shell ausgeführt. Das Tool ist über die Google Cloud Console verfügbar und mit vielen nützlichen Tools wie gcloud und Docker ausgestattet. Unten sehen Sie, wie Sie auf Cloud Shell zugreifen. Klicken Sie rechts oben auf das Cloud Shell-Symbol, um es im unteren Bereich des Konsolenfensters anzuzeigen.
Alternative Konfigurationsoptionen für GKE-Cluster (optional)
Für dieses Lab ist ein Kubernetes-Cluster erforderlich. Im nächsten Abschnitt wird ein GKE-Cluster mit einer einfachen Konfiguration erstellt. In diesem Abschnitt werden einige gcloud
-Befehle beschrieben, die alternative Konfigurationsoptionen beim Erstellen eines Kubernetes-Clusters mit GKE bereitstellen. Mit den folgenden Befehlen können beispielsweise verschiedene Maschinentypen, Zonen und sogar GPUs (Beschleuniger) identifiziert werden.
- Maschinentypen mit dem Befehl
gcloud compute machine-types list
auflisten - GPUs mit dem Befehl
gcloud compute accelerator-types list
auflisten - Compute-Zonen mit dem Befehl
gcloud compute zones list
auflisten - Hilfe zu allen gcloud-Befehlen
gcloud container clusters --help
- Dadurch erhalten Sie beispielsweise Informationen zum Erstellen eines Kubernetes-Clusters
gcloud container clusters create --help
.
- Dadurch erhalten Sie beispielsweise Informationen zum Erstellen eines Kubernetes-Clusters
Eine vollständige Liste der Konfigurationsoptionen für GKE finden Sie in diesem Dokument.
Erstellen des Kubernetes-Clusters vorbereiten
In Cloud Shell müssen Sie einige Umgebungsvariablen festlegen und den gcloud-Client konfigurieren. Dies wird mit den folgenden Befehlen erreicht.
export PROJECT_ID=YOUR_PROJECT_ID
export DEFAULT_ZONE=us-central1-c
gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${DEFAULT_ZONE}
GKE-Cluster erstellen
Da in diesem Lab die .NET Core-Anwendung auf Kubernetes bereitgestellt wird, müssen Sie einen Cluster erstellen. Verwenden Sie den folgenden Befehl, um mit GKE einen neuen Kubernetes-Cluster in Google Cloud zu erstellen.
gcloud container clusters create dotnet-cluster \
--zone ${DEFAULT_ZONE} \
--num-nodes=1 \
--node-locations=${DEFAULT_ZONE},us-central1-b \
--enable-stackdriver-kubernetes \
--machine-type=n1-standard-1 \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--enable-ip-alias
--num-nodes
ist die Anzahl der Knoten, die pro Zone hinzugefügt werden sollen, und kann später skaliert werden--node-locations
ist eine durch Kommas getrennte Liste von Zonen. In diesem Fall werden die Zone, die Sie in der oben angegebenen Umgebungsvariable angegeben haben, undus-central1-b
verwendet.- HINWEIS: Diese Liste darf keine doppelten Einträge enthalten.
--workload-pool
richtet Workload Identity ein, damit GKE-Arbeitslasten auf Google Cloud-Dienste zugreifen können
Während der Cluster-Erstellung wird Folgendes angezeigt:
Creating cluster dotnet-cluster in us-central1-b... Cluster is being deployed...⠼
kubectl konfigurieren
Die kubectl
-Befehlszeile ist die primäre Art der Interaktion mit einem Kubernetes-Cluster. Damit er mit dem neu erstellten Cluster verwendet werden kann, muss er für die Authentifizierung beim Cluster konfiguriert werden. Dies geschieht mit dem folgenden Befehl.
$ gcloud container clusters get-credentials dotnet-cluster --zone ${DEFAULT_ZONE}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for dotnet-cluster.
Es sollte jetzt möglich sein, über kubectl
mit dem Cluster zu interagieren.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-dotnet-cluster-default-pool-02c9dcb9-fgxj Ready <none> 2m15s v1.16.13-gke.401
gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 Ready <none> 2m24s v1.16.13-gke.401
3. Lokal testen und gewünschte Funktionalität bestätigen
In diesem Lab werden die folgenden Container-Images aus dem offiziellen .NET-Repository auf Docker Hub verwendet.
Container lokal ausführen, um die Funktionalität zu prüfen
Prüfen Sie in Cloud Shell mit dem folgenden Docker-Befehl, ob Docker ordnungsgemäß ausgeführt wird und der .NET-Container wie erwartet funktioniert:
$ docker run --rm mcr.microsoft.com/dotnet/samples
Hello from .NET!
__________________
\
\
....
....'
....
..........
.............'..'..
................'..'.....
.......'..........'..'..'....
........'..........'..'..'.....
.'....'..'..........'..'.......'.
.'..................'... ......
. ......'......... .....
. ......
.. . .. ......
.... . .......
...... ....... ............
................ ......................
........................'................
......................'..'...... .......
.........................'..'..... .......
........ ..'.............'..'.... ..........
..'..'... ...............'....... ..........
...'...... ...... .......... ...... .......
........... ....... ........ ......
....... '...'.'. '.'.'.' ....
....... .....'.. ..'.....
.. .......... ..'........
............ ..............
............. '..............
...........'.. .'.'............
............... .'.'.............
.............'.. ..'..'...........
............... .'..............
......... ..............
.....
Environment:
.NET 5.0.1-servicing.20575.16
Linux 5.4.58-07649-ge120df5deade #1 SMP PREEMPT Wed Aug 26 04:56:33 PDT 2020
Funktionalität der Web-App prüfen
Eine Beispiel-Webanwendung kann auch in Cloud Shell validiert werden. Mit dem folgenden Docker-Befehl zum Ausführen wird ein neuer Container erstellt, der Port 80
verfügbar macht und den Port 8080
localhost
zuordnet. Denken Sie daran, dass sich localhost
in diesem Fall in Cloud Shell befindet.
$ docker run -it --rm -p 8080:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {64a3ed06-35f7-4d95-9554-8efd38f8b5d3} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
Da es sich um eine Webanwendung handelt, muss sie in einem Webbrowser aufgerufen und validiert werden. Im nächsten Abschnitt erfahren Sie, wie Sie dies in Cloud Shell mit der Webvorschau tun können.
4. Über Cloud Shell auf Dienste mit "Webvorschau" zugreifen
Mit der Webvorschau von Cloud Shell können Sie über einen Browser mit Prozessen interagieren, die in der Cloud Shell-Instanz ausgeführt werden.
Option „Webvorschau“ um Anwendungen in Cloud Shell anzusehen
Klicken Sie in Cloud Shell auf die Schaltfläche „Webvorschau“ und wählen Sie Vorschau auf Port 8080 aus. bzw. der Port, für den die Webvorschau eingestellt ist.
Daraufhin wird ein Browserfenster mit einer Adresse wie der folgenden geöffnet:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0
.NET-Beispielanwendung mit der Webvorschau ansehen
Sie können die Beispiel-App, die im letzten Schritt gestartet wurde, jetzt ansehen, indem Sie die Webvorschau starten und die angegebene URL laden. Die Ausgabe sollte ungefähr so aussehen:
5. In Kubernetes bereitstellen
YAML-Datei erstellen und anwenden
Im nächsten Schritt ist eine YAML-Datei erforderlich, in der zwei Kubernetes-Ressourcen beschrieben werden: ein Deployment und ein Dienst. Erstellen Sie in Cloud Shell eine Datei mit dem Namen dotnet-app.yaml
und fügen Sie ihr den folgenden Inhalt hinzu.
apiVersion: apps/v1
kind: Deployment
metadata:
name: dotnet-deployment
labels:
app: dotnetapp
spec:
replicas: 3
selector:
matchLabels:
app: dotnetapp
template:
metadata:
labels:
app: dotnetapp
spec:
containers:
- name: dotnet
image: mcr.microsoft.com/dotnet/samples:aspnetapp
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: dotnet-service
spec:
selector:
app: dotnetapp
ports:
- protocol: TCP
port: 8080
targetPort: 80
Verwenden Sie jetzt kubectl
, um diese Datei auf Kubernetes anzuwenden.
$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment created
service/dotnet-service created
Beachten Sie die Meldungen, die angeben, dass die gewünschten Ressourcen erstellt wurden.
Die daraus resultierenden Ressourcen untersuchen
Mit der kubectl
-Befehlszeile können Sie die oben erstellten Ressourcen untersuchen. Sehen wir uns zuerst die Bereitstellungsressourcen an und prüfen Sie, ob die neue Bereitstellung vorhanden ist.
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dotnet-deployment 3/3 3 3 80s
Als Nächstes werfen wir einen Blick auf die ReplicaSets. Es sollte ein ReplicaSet vorhanden sein, das vom obigen Deployment erstellt wurde.
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
dotnet-deployment-5c9d4cc4b9 3 3 3 111s
Schließlich werfen wir einen Blick auf die Pods. Das Deployment gibt an, dass es drei Instanzen geben sollte. Der folgende Befehl sollte zeigen, dass es drei Instanzen gibt. Die Option -o wide
wird hinzugefügt, sodass die Knoten angezeigt werden, auf denen diese Instanzen ausgeführt werden.
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Running 0 2m25s 10.16.0.8 gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 <none> <none>
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Running 0 2m25s 10.16.1.7 gke-dotnet-cluster-default-pool-02c9dcb9-fgxj <none> <none>
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Running 0 2m25s 10.16.0.7 gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 <none> <none>
Dienstressource überprüfen
Eine Dienstressource in Kubernetes ist ein Load-Balancer. Die Endpunkte werden durch Labels auf Pods bestimmt. Sobald dem Deployment mit dem obigen kubectl scale deployment
-Vorgang neue Pods hinzugefügt werden, stehen die resultierenden Pods sofort für Anfragen zur Verfügung, die von diesem Dienst verarbeitet werden.
Mit dem folgenden Befehl sollte die Dienstressource angezeigt werden.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dotnet-service ClusterIP 10.20.9.124 <none> 8080/TCP 2m50s
...
Mit dem folgenden Befehl können Sie weitere Details zum Dienst abrufen.
$ kubectl describe svc dotnet-service
Name: dotnet-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=dotnetapp
Type: ClusterIP
IP: 10.20.9.124
Port: <unset> 8080/TCP
TargetPort: 80/TCP
Endpoints: 10.16.0.7:80,10.16.0.8:80,10.16.1.7:80
Session Affinity: None
Events: <none>
Beachten Sie, dass der Dienst vom Typ ClusterIP
ist. Das bedeutet, dass jeder Pod im Cluster den Dienstnamen dotnet-service
in seine IP-Adresse auflösen kann. An den Dienst gesendete Anfragen werden über alle Instanzen (Pods) verteilt. Der obige Wert Endpoints
zeigt die IP-Adressen der Pods an, die derzeit für diesen Dienst verfügbar sind. Vergleichen Sie sie mit den IP-Adressen der Pods, die oben ausgegeben wurden.
Ausgeführte Anwendung prüfen
Jetzt ist die Anwendung live und für Nutzeranfragen bereit. Verwenden Sie einen Proxy, um darauf zuzugreifen. Mit dem folgenden Befehl wird ein lokaler Proxy erstellt, der Anfragen an Port 8080
akzeptiert und an den Kubernetes-Cluster übergibt.
$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080
Verwenden Sie jetzt die Webvorschau in Cloud Shell, um auf die Webanwendung zuzugreifen.
Fügen Sie der von der Webvorschau generierten URL Folgendes hinzu: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/
. Das Ergebnis sieht dann in etwa so aus:
https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/
Herzlichen Glückwunsch zum Bereitstellen einer .NET Core-Anwendung in der Google Kubernetes Engine. Als Nächstes nehmen wir eine Änderung an der App vor und stellen sie erneut bereit.
6. App ändern
In diesem Abschnitt wird die Anwendung so geändert, dass der Host angezeigt wird, auf dem die Instanz ausgeführt wird. So lässt sich prüfen, ob das Load-Balancing funktioniert und die verfügbaren Pods wie erwartet antworten.
Quellcode abrufen
git clone https://github.com/dotnet/dotnet-docker.git
cd dotnet-docker/samples/aspnetapp/
App mit Hostnamen aktualisieren
vi aspnetapp/Pages/Index.cshtml
<tr>
<td>Host</td>
<td>@Environment.MachineName</td>
</tr>
Neues Container-Image erstellen und lokal testen
Erstellen Sie das neue Container-Image mit dem aktualisierten Code.
docker build --pull -t aspnetapp:alpine -f Dockerfile.alpine-x64 .
Testen Sie die neue Anwendung wie zuvor lokal.
$ docker run --rm -it -p 8080:80 aspnetapp:alpine
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {f71feb13-8eae-4552-b4f2-654435fff7f8} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
Wie bisher kann über die Webvorschau auf die App zugegriffen werden. Dieses Mal sollte der Host-Parameter sichtbar sein, wie hier gezeigt:
Öffnen Sie in Cloud Shell einen neuen Tab und führen Sie docker ps
aus, um zu prüfen, ob die Container-ID mit dem oben gezeigten Hostwert übereinstimmt.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab85ce11aecd aspnetapp:alpine "./aspnetapp" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp relaxed_northcutt
Image taggen und per Push übertragen, damit es für Kubernetes verfügbar ist
Das Image muss getaggt und per Push übertragen werden, damit es von Kubernetes abgerufen werden kann. Listen Sie zuerst die Container-Images auf und identifizieren Sie das gewünschte Image.
$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetapp alpine 95b4267bb6d0 6 days ago 110MB
Taggen Sie dann das Image und übertragen Sie es per Push in Google Container Registry. Mit der IMAGE-ID oben sieht das so aus:
docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine
7. Aktualisierte Anwendung noch einmal bereitstellen
YAML-Datei bearbeiten
Wechseln Sie wieder in das Verzeichnis, in dem die Datei dotnet-app.yaml
gespeichert ist. Suchen Sie in der YAML-Datei nach der folgenden Zeile:
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
Diese muss geändert werden, damit sie auf das Container-Image verweist, das oben erstellt und in gcr.io übertragen wurde.
image: gcr.io/PROJECT_ID/aspnetapp:alpine
Vergiss nicht, es zu ändern, um deine PROJECT_ID
zu verwenden. Wenn Sie fertig sind, sollte es in etwa so aussehen:
image: gcr.io/myproject/aspnetapp:alpine
Aktualisierte YAML-Datei anwenden
$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment configured
service/dotnet-service unchanged
Beachten Sie, dass die Bereitstellungsressource aktualisiert und die Dienstressource unverändert angezeigt wird. Die aktualisierten Pods können wie zuvor mit dem Befehl kubectl get pod
aufgerufen werden, aber dieses Mal fügen wir den -w
hinzu, wodurch alle Änderungen in Echtzeit beobachtet werden.
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Running 0 34m
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Running 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Running 0 34m
dotnet-deployment-85f6446977-tmbdq 0/1 ContainerCreating 0 4s
dotnet-deployment-85f6446977-tmbdq 1/1 Running 0 5s
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Terminating 0 34m
dotnet-deployment-85f6446977-lcc58 0/1 Pending 0 0s
dotnet-deployment-85f6446977-lcc58 0/1 Pending 0 0s
dotnet-deployment-85f6446977-lcc58 0/1 ContainerCreating 0 0s
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-lcc58 1/1 Running 0 6s
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 0s
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 0s
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 2s
dotnet-deployment-85f6446977-hw24v 0/1 ContainerCreating 0 2s
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 1/1 Running 0 3s
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-httw6 0/1 Terminating 0 34m
Die obige Ausgabe zeigt das Rolling Update in Echtzeit. Zuerst werden neue Container gestartet und bei ihrer Ausführung die alten Container beendet.
Ausgeführte Anwendung prüfen
Jetzt ist die Anwendung aktualisiert und bereit für Nutzeranfragen. Wie zuvor kann über einen Proxy darauf zugegriffen werden.
$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080
Verwenden Sie jetzt die Webvorschau in Cloud Shell, um auf die Webanwendung zuzugreifen.
Fügen Sie der von der Webvorschau generierten URL Folgendes hinzu: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/
. Das Ergebnis sieht dann in etwa so aus:
https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/
Prüfen, ob der Kubernetes-Dienst die Last verteilt
Aktualisieren Sie diese URL mehrmals. Sie werden feststellen, dass sich der Host ändert, wenn der Dienst das Load-Balancing der Anfragen auf verschiedene Pods verteilt. Vergleichen Sie die Hostwerte mit der Pod-Liste oben, um festzustellen, ob alle Pods Traffic empfangen.
Instanzen hochskalieren
Die Skalierung von Anwendungen in Kubernetes ist einfach. Mit dem folgenden Befehl wird das Deployment auf bis zu 6 Instanzen der Anwendung skaliert.
$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled
Die neuen Pods und ihr aktueller Status können mit diesem Befehl aufgerufen werden.
kubectl get pod -w
Wenn Sie dasselbe Browserfenster aktualisieren, sehen Sie, dass der Traffic jetzt auf alle neuen Pods verteilt wird.
8. Glückwunsch!
In diesem Lab wurde eine .NET Core-Beispiel-Webanwendung in einer Entwicklungsumgebung validiert und anschließend mithilfe von GKE in Kubernetes bereitgestellt. Anschließend wurde die Anwendung geändert, um den Hostnamen des Containers anzuzeigen, in dem sie ausgeführt wurde. Das Kubernetes-Deployment wurde dann auf die neue Version aktualisiert und die Anwendung wurde hochskaliert, um zu zeigen, wie die Last auf zusätzliche Instanzen verteilt wird.
In diesen Anleitungen erfahren Sie mehr über .NET und Kubernetes. Sie bauen auf dem auf, was in diesem Lab gelernt wurde, und haben Istio Service Mesh für komplexere Routing- und Ausfallsicherheitsmuster eingeführt.
9. Bereinigen
Um unbeabsichtigte Kosten zu vermeiden, löschen Sie mit den folgenden Befehlen den Cluster und das Container-Image, die in diesem Lab erstellt wurden.
gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine