ASP.NET Core-App für Kubernetes in Google Kubernetes Engine bereitstellen

1. Übersicht

ASP.NET Core ist ein neues, plattformübergreifendes Open-Source-Framework zum Entwickeln moderner cloudbasierter und mit dem Internet verbundener Anwendungen mithilfe der Programmiersprache C#.

Kubernetes ist ein Open-Source-Projekt, das sich in vielen verschiedenen Umgebungen ausführen lässt – ob Laptop oder hochverfügbarer Cluster mit mehreren Knoten, ob öffentliche Cloud oder lokales Deployment, ob virtuelle Maschine oder Bare-Metal-Server.

In diesem Lab stellen Sie eine einfache ASP.NET Core-Anwendung in Kubernetes bereit, die in Kubernetes Engine ausgeführt wird. Dieses Codelab baut auf dem Codelab ASP.NET Core-App mit Google Cloud Shell erstellen und starten auf. Bevor Sie mit diesem Lab beginnen, sollten Sie dieses Lab absolvieren.

Ziel dieses Codelabs ist es, Ihren Code (hier eine einfache Hello World ASP.NET Core-App) in eine replizierte Anwendung umzuwandeln, die auf Kubernetes ausgeführt wird. Sie verwenden Code, den Sie auf Ihrem Computer entwickelt haben, wandeln ihn in ein Docker-Container-Image um und führen dieses Image dann in Google Kubernetes Engine aus.

Im Folgenden finden Sie ein Diagramm der verschiedenen Teile in diesem Codelab, damit Sie besser verstehen, wie die einzelnen Teile zusammenpassen. Verwenden Sie es als Referenz, während Sie das Codelab durcharbeiten. Am Ende sollte alles einen Sinn ergeben (aber fürs Erste können Sie dies ignorieren).

7dbdc973aceef1af.jpeg

In diesem Codelab können Sie sich mit einer verwalteten Umgebung wie Kubernetes Engine (einer von Google gehosteten Version von Kubernetes, die auf Compute Engine ausgeführt wird) mehr auf die Arbeit mit Kubernetes konzentrieren, anstatt die zugrunde liegende Infrastruktur einzurichten.

Wenn Sie wissen möchten, wie Sie Kubernetes auf Ihrem lokalen Computer ausführen, z. B. auf einem Entwicklerlaptop, sollten Sie sich Minikube ansehen. Damit lässt sich ein Kubernetes-Cluster mit einem einzelnen Knoten zu Entwicklungs- und Testzwecken ganz einfach einrichten. Wenn Sie möchten, können Sie dieses Codelab mit Minikube durchgehen.

Lerninhalte

  • Eine einfache ASP.NET Core-App als Docker-Container verpacken
  • So erstellen Sie einen Kubernetes-Cluster in der Google Kubernetes Engine (GKE).
  • ASP.NET Core-App auf einem Pod bereitstellen
  • Externen Traffic auf einen Pod zulassen
  • Den Dienst skalieren und ein Upgrade bereitstellen
  • Kubernetes Graphical-Dashboard ausführen

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 Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf die Projekt-ID verweisen, die üblicherweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben.

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 der Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Wenn Sie Cloud Shell noch nie gestartet haben, 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:

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Diese virtuelle Maschine verfügt über alle Entwicklungstools, 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`
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
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. ASP.NET Core-App in Cloud Shell erstellen

In der Cloud Shell-Eingabeaufforderung können Sie überprüfen, ob das dotnet-Befehlszeilentool bereits installiert ist, indem Sie die Version prüfen. Damit sollte die Version des installierten dotnet-Befehlszeilentools angezeigt werden:

dotnet --version

Erstellen Sie als Nächstes das Grundgerüst einer ASP.NET Core-Web-App.

dotnet new mvc -o HelloWorldAspNetCore

Dadurch sollte ein Projekt mit wiederhergestellten Abhängigkeiten erstellt werden, was durch eine Meldung wie die folgende bestätigt wird.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. ASP.NET Core-App ausführen

Wir sind fast bereit, unsere App auszuführen. Rufen Sie den App-Ordner auf.

cd HelloWorldAspNetCore

Abschließend führen Sie die App aus.

dotnet run --urls=http://localhost:8080

Die Anwendung überwacht nun Port 8080.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

Wenn Sie prüfen möchten, ob die App ausgeführt wird, klicken Sie oben rechts auf die Schaltfläche „Webvorschau“ und wählen Sie „Vorschau auf Port 8080“ aus.

Capture.PNG

Sie sehen die standardmäßige ASP.NET Core-Webseite:

f42271880ce4d572.png

Sobald Sie überprüft haben, dass die Anwendung ausgeführt wird, drücken Sie Strg+C, um sie zu beenden.

5. ASP.NET Core-App als Docker-Container verpacken

Als Nächstes bereiten Sie Ihre App für die Ausführung als Container vor. Dazu legen Sie zuerst den Container und seine Inhalte fest.

Erstellen Sie im Basisverzeichnis der Anwendung einen Dockerfile, um das Docker-Image zu definieren.

touch Dockerfile

Fügen Sie mit Ihrem bevorzugten Editor (vim, nano,emacs oder Cloud Shell-Codeeditor) Folgendes zu Dockerfile hinzu.

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

Eine wichtige Konfiguration im Dockerfile ist der Port, von dem eingehender Traffic abgerufen wird (8080). Dazu wird die Umgebungsvariable ASPNETCORE_URLS festgelegt, mit der ASP.NET Core-Apps bestimmen, welcher Port überwacht werden soll.

Dockerfile speichern. Jetzt erstellen wir das Image:

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

Sobald der Vorgang abgeschlossen ist (es dauert einige Zeit, bis alles heruntergeladen und extrahiert werden kann) können Sie sehen, dass das Image erstellt und lokal gespeichert wurde:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

Testen Sie das Image lokal mit dem folgenden Befehl, der einen Docker-Container lokal auf Port 8080 aus Ihrem neu erstellten Container-Image ausführt:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Nutzen Sie auch hier wieder die Webvorschaufunktion von Cloud Shell :

Screenshot vom 03.11.2015 17:20:22.png

Die standardmäßige ASP.NET Core-Webseite sollte in einem neuen Tab angezeigt werden.

f42271880ce4d572.png

Nachdem Sie sichergestellt haben, dass die Anwendung lokal in einem Docker-Container problemlos ausgeführt wird, können Sie den ausgeführten Container mit Ctrl-> C beenden.

Wenn nun das Image wie gewünscht funktioniert, laden Sie es in die Google Container Registry hoch. Das ist ein privates Repository für Ihre Docker-Images, auf die von jedem Google Cloud-Projekt aus (aber auch von außerhalb der Google Cloud Platform) zugegriffen werden kann:

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

Wenn alles gut geht, und nach kurzer Zeit sollten Sie das Container-Image im Abschnitt Container Registry sehen können. Jetzt steht Ihnen ein projektweites Docker-Image zur Verfügung, auf das Kubernetes zugreifen und es orchestrieren kann, wie Sie gleich sehen werden.

576374602b52f4e4.png

Bei Interesse können Sie sich die in Google Cloud Storage gespeicherten Container-Images ansehen. Klicken Sie dazu auf diesen Link: https://console.cloud.google.com/storage/browser/. Der vollständige Link sollte folgendes Format haben: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/.

6. Kubernetes-Cluster erstellen

Sie können jetzt Ihren GKE-Cluster erstellen. Gehen Sie vorher in der Webkonsole zum Abschnitt „Google Kubernetes Engine“ und warten Sie, bis das System initialisiert wurde. Das sollte nur wenige Sekunden dauern.

d5f6e3c267feea1a.png

Ein Cluster besteht aus einem von Google verwalteten Kubernetes Master API-Server und einer Reihe von Worker-Knoten. Bei den Worker-Knoten handelt es sich um virtuelle Compute Engine-Maschinen.

Verwenden Sie die gcloud-Befehlszeile aus Ihrer Cloud Shell-Sitzung, um einen Cluster zu erstellen. Legen Sie einen Bereich in Ihrer Nähe fest ( Liste der Zonen). Dies kann einige Minuten dauern:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

Am Ende sollten Sie den erstellten Cluster sehen.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

Sie sollten jetzt einen voll funktionsfähigen Kubernetes-Cluster haben, der von Google Kubernetes Engine bereitgestellt wird:

eefb8d9b7f39598b.png

Und nun stellen Sie Ihre eigene containerisierte Anwendung auf den Kubernetes-Clustern bereit. Ab jetzt verwenden Sie die kubectl-Befehlszeile, die bereits in Ihrer Cloud Shell-Umgebung eingerichtet ist. Für den Rest dieses Codelabs müssen sowohl der Kubernetes-Client als auch die Serverversion 1.2 oder höher sein. kubectl version zeigt Ihnen die aktuelle Version des Befehls an.

7. Bereitstellung erstellen

Bei einem Kubernetes-Pod handelt es sich um eine Gruppe von Containern, die zu Administrations- und Netzwerkzwecken zusammengebunden sind. Er kann einen oder mehrere Container enthalten. Hier verwenden Sie einfach einen Container, der mit Ihrem ASP.NET Core-Image erstellt wurde, das in Ihrer privaten Container-Registry gespeichert ist. Er stellt Inhalte auf Port 8080 bereit.

Erstellen Sie mit Ihrem bevorzugten Editor (vim, nano,emacs oder dem Code-Editor von Cloud Shell) eine hello-dotnet.yaml-Datei und definieren Sie das Kubernetes-Deployment für den Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Stellen Sie sie im Standard-Namespace mit kubectl bereit:

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

Wie Sie sehen, haben Sie ein Deployment-Objekt erstellt. Zum Erstellen und Skalieren von Pods werden Deployments empfohlen. Hier verwaltet ein neues Deployment ein einzelnes Pod-Replikat, auf dem das hello-dotnet:v1-Image ausgeführt wird.

Führen Sie einfach den folgenden Befehl aus, um die soeben erstellte Bereitstellung anzuzeigen:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

Um sich den Pod anzusehen, der vom Deployment erstellt wurde, führen Sie diesen Befehl aus:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

Jetzt ist ein guter Zeitpunkt, einige interessante kubectl-Befehle durchzugehen (keine davon ändert den Status des Clusters. Eine vollständige Dokumentation finden Sie hier):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

Zu diesem Zeitpunkt sollte Ihr Container unter der Kontrolle von Kubernetes ausgeführt werden, Sie müssen ihn aber noch für die Außenwelt zugänglich machen.

8. Externen Traffic zulassen

Standardmäßig kann nur die interne IP innerhalb des Clusters auf den Pod zugreifen. Um den hello-dotnet-Container von außerhalb des virtuellen Kubernetes-Netzwerks zugänglich zu machen, muss der Pod als Kubernetes-Dienst verfügbar gemacht werden.

Über Cloud Shell können Sie den Pod mit dem Befehl kubectl expose und dem Flag --type="LoadBalancer" für das öffentliche Internet freigeben. Dieses Flag wird für die Erstellung einer extern zugänglichen IP benötigt:

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

Das Flag in diesem Befehl gibt an, dass Sie das Lastenausgleichsmodul verwenden, das von der zugrunde liegenden Infrastruktur bereitgestellt wird (in diesem Fall das Lastenausgleichsmodul von Compute Engine). Hinweis: Sie machen das Deployment und nicht den Pod direkt verfügbar. Als Folge führt der resultierende Dienst den Traffic-Lastenausgleich für alle vom Deployment verwalteten Pods durch (in diesem Fall nur für einen Pod, später werden jedoch weitere Replikate hinzugefügt).

Der Kubernetes-Master erstellt den Lastenausgleich und die zugehörigen Compute Engine-Weiterleitungsregeln, Zielpools und Firewallregeln, um den Dienst von außerhalb der Google Cloud Platform vollständig zugänglich zu machen.

Wenn Sie die öffentlich zugängliche IP-Adresse des Dienstes ermitteln möchten, fordern Sie einfach kubectl an, um alle Clusterdienste aufzulisten:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Beachten Sie, dass für Ihren Dienst zwei IP-Adressen aufgeführt sind, die beide Port 8080 bedienen. Eine davon ist die interne IP, die nur in Ihrem virtuellen Cloudnetzwerk sichtbar ist. Die andere ist die externe Load-Balancer-IP. In diesem Beispiel lautet die externe IP-Adresse 104.155.20.69.

Sie sollten den Dienst jetzt erreichen können, indem Sie Ihren Browser auf diese Adresse verweisen: http://<EXTERNAL_IP>:8080

6b053874002827fe.png

Bisher haben Sie durch den Wechsel zu Containern und Kubernetes mindestens einige Funktionen erhalten. Sie müssen nicht angeben, auf welchem Host die Arbeitslast ausgeführt werden soll. Außerdem profitieren Sie von Dienstmonitoring und Neustart. Mal sehen, welche Vorteile Ihnen die neue Kubernetes-Infrastruktur noch bringt.

9. Dienst skalieren

Eine der leistungsstarken Funktionen von Kubernetes ist die einfache Skalierbarkeit Ihrer Anwendung. Angenommen, Sie benötigen plötzlich mehr Kapazität für Ihre Anwendung. können Sie den Replikations-Controller einfach anweisen, eine neue Anzahl von Replikaten für Ihren Pod zu verwalten:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

Beachten Sie hier den deklarativen Ansatz. Anstatt neue Instanzen zu starten oder zu beenden, geben Sie an, wie viele Instanzen gleichzeitig ausgeführt werden sollen. Die Abgleichsschleifen von Kubernetes sorgen einfach dafür, dass die Realität Ihren Anforderungen entspricht, und ergreifen bei Bedarf Maßnahmen.

Im folgenden Diagramm ist der Zustand Ihres Kubernetes-Clusters zusammengefasst:

6af0243662464ca9.png

Sie können Ihren Dienst auch ganz einfach herunterskalieren. So skalieren Sie von 4 Pods auf 2 Pods herunter.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. Ausfallsicherheit testen

Kubernetes (oder genauer gesagt ReplicaSet) überwacht Ihre Pods. Wenn der Pod etwas nicht stimmt und dieser ausfällt, wird sofort ein neuer erstellt. Lassen Sie uns dies testen, um zu sehen, wie es funktioniert.

Rufen Sie zuerst die Liste der Pods ab:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

Löschen Sie einen der Pods, indem Sie den Pod-Namen übergeben:

kubectl delete pod hello-dotnet-714049816-g4azy

Wenn Sie sich die Liste der Pods noch einmal ansehen, sehen Sie, dass sofort ein neuer Pod erstellt und ausgeführt wird:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. Upgrade für Ihren Dienst bereitstellen

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.

f487389b8b1cc105.png

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 

Sie können nun mit Kubernetes den Replikations-Controller problemlos auf die neue App-Version aktualisieren. Wenn Sie das Image-Label für Ihren laufenden Container ändern möchten, müssen Sie das vorhandene hello-dotnet deployment bearbeiten und das Image von gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 in gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 ändern.

Dazu verwenden Sie den Befehl kubectl edit. Dadurch wird ein Texteditor geöffnet, in dem die vollständige YAML-Konfiguration angezeigt wird. Sie müssen nicht sofort die vollständige yaml-Konfiguration verstehen. Sie müssen lediglich verstehen, dass Sie durch Aktualisieren des Felds spec.template.spec.containers.image in der Konfiguration das Deployment anweisen, die Pods zu aktualisieren, sodass das neue Image verwendet wird.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

Nachdem Sie die Änderung vorgenommen haben, speichern und schließen Sie die Datei. Dazu wird „vi“ verwendet. Drücken Sie die „Esc“-Taste, geben Sie :wq ein und drücken Sie die Eingabetaste.

deployment "hello-dotnet" edited

Dadurch wird das Deployment mit dem neuen Image aktualisiert, wodurch neue Pods mit dem neuen Image erstellt und alte Pods gelöscht werden.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

Während dies geschieht, sollten die Nutzer der Dienste keine Unterbrechung wahrnehmen. Nach kurzer Zeit greifen sie auf die neue Version Ihrer Anwendung zu.

fb9f41e814dda653.png

Weitere Informationen zu Rolling Updates finden Sie in der Kubernetes-Dokumentation.

Mit diesen Features zum Bereitstellen, Skalieren und Aktualisieren stimmen Sie zu, dass Sie sich nach der Einrichtung Ihrer Umgebung (hier Ihren GKE/Kubernetes-Cluster) mit Kubernetes auf Ihre Anwendung konzentrieren können, anstatt die Infrastruktur zu verwalten.

12. Cloud Build

Bisher haben wir Container mit regulären Docker-Befehlen (docker build ...) erstellt und das Image dann manuell in die Container Registry der Google Cloud Platform verschoben. Es ist auch möglich, beide Schritte auf das serverseitige Cloud Build zu übertragen, wo das Container-Image ohne lokale Installation von Docker erstellt und per Push übertragen werden kann.

Aktivieren Sie zuerst die Cloud Build API unter API Manager > Mediathek. Suchen Sie nach Cloud Build und klicken Sie auf Cloud Build API:

f8b0239fa7719f29.png

Klicken Sie auf API aktivieren, falls die API noch nicht aktiviert ist. Am Ende sollte die API wie folgt aktiviert sein:

ea6053f9603613b5.png

Sobald die Cloud Build API aktiviert ist, können Sie den folgenden Befehl ausführen, um Ihr Image aus dem Container Builder-Dienst zu erstellen und per Push zu übertragen:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

Das Image wird automatisch in Container Registry gespeichert.

13. Kubernetes Graphical-Dashboard ausführen

Bei den aktuellen Kubernetes-Versionen wurde eine grafische Web-Benutzeroberfläche (Dashboard) eingeführt. Damit können Nutzer schnell und unproblematisch einsteigen. Außerdem wird ein Teil der CLI-Funktionalität aktiviert, da damit eine bessere Interaktion mit dem System möglich ist.

Geben Sie im Cloud Shell-Fenster die folgenden Befehle ein, um den Zugriff auf das Kubernetes-Cluster-Dashboard zu konfigurieren :

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

Und dann verwenden Sie noch einmal die Cloud Shell-Vorschaufunktion, um zu Port 8081 zu wechseln:

port8081.png

Dies sollte Sie an den API-Endpunkt weiterleiten. Möglicherweise erhalten Sie die Meldung „Nicht autorisiert“ aber keine Sorge. Entfernen Sie "?authuser=3", um zum Dashboard zu gelangen. und ersetzen Sie es durch „/ui“.

Viel Spaß mit dem grafischen Dashboard von Kubernetes. Sie können es für das Deployment von Container-Anwendungen sowie für die Überwachung und Verwaltung Ihrer Cluster verwenden.

177789527b650f6b.png

Alternativ können Sie von einem Entwicklungs- oder lokalen Computer aus auf das Dashboard zugreifen. Verwenden Sie dazu eine ähnliche Anleitung, wenn Sie in der Webkonsole auf „Verbinden“ klicken. für den Cluster, den Sie überwachen möchten.

da1ccc707dd6647.png

a51c7160e237f32f.png

Wenn Sie mit dem Dashboard fertig sind, drücken Sie Strg+C, um den Proxy anzuhalten. Weitere Informationen zum Kubernetes-Dashboard erhalten Sie über die Dashboard-Tour.

14. Logging

Mit dem Befehl kubectl logs können Sie die Logs eines Containers abrufen, der in Kubernetes ausgeführt wird. Wenn Sie Google Kubernetes Engine zum Ausführen verwalteter Kubernetes-Cluster verwenden, werden alle Logs automatisch weitergeleitet und in Google Cloud Logging gespeichert. Sie finden die gesamte Logausgabe der Pods unter StackdriverLogging → Logs in der Google Cloud Console:

b63159b959ba5010.png

Wenn Sie sich in der Logging-Konsole befinden, können Sie zu GKE-Container gehen, um alle von STDOUT erfassten Logs anzuzeigen:

43e9aab3e02358d5.png

Von hier aus können Sie die Protokolle optional zur weiteren Protokollanalyse in Google BigQuery exportieren oder logbasierte Benachrichtigungen einrichten. Das können wir heute während des Labs nicht machen.

15. Glückwunsch!

Damit ist das einfache Codelab für den Start mit ASP.NET Core und Kubernetes beendet. Wir haben uns bisher nur an der Oberfläche dieser Technologie bewegt und möchten Sie ermutigen, diese durch eigene Pods, Replikationscontroller und Dienste weiter zu erkunden. Informieren Sie sich außerdem über Aktivitätsprüfungen (Systemdiagnosen) und verwenden Sie eventuell die Kubernetes API.

Bereinigen

Fertig! Sie können nun die genutzten Ressourcen wieder entfernen. So sparen Sie Kosten und geben nicht mehr benötigte Ressourcen für andere frei.

Löschen Sie das Deployment (wodurch auch die ausgeführten Pods gelöscht werden) und den Dienst (dadurch wird auch Ihr externer Load-Balancer gelöscht):

Löschen Sie zuerst den Dienst und die Bereitstellung, wodurch auch Ihr externer Load-Balancer gelöscht wird:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

Löschen Sie als Nächstes Ihren Cluster:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

Dadurch werden alle Google Compute Engine-Instanzen gelöscht, auf denen der Cluster ausgeführt wird.

Löschen Sie abschließend den Storage-Bucket der Docker-Registry, in dem Ihre Images gehostet werden:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

Natürlich können Sie auch das gesamte Projekt löschen. Dadurch würden jedoch alle vorgenommenen Abrechnungseinstellungen verloren gehen. Dazu muss die Projektabrechnung zuerst deaktiviert werden. Außerdem werden beim Löschen eines Projekts erst nach Ablauf des aktuellen Abrechnungszeitraums alle Abrechnungen beendet.

Behandelte Themen

  • Eine einfache ASP.NET Core-App als Docker-Container verpacken
  • So erstellen Sie einen Kubernetes-Cluster in Google Kubernetes Engine.
  • ASP.NET Core-App auf einem Pod bereitstellen
  • Externen Traffic auf einen Pod zulassen
  • Den Dienst skalieren und ein Upgrade bereitstellen
  • Kubernetes Graphical-Dashboard ausführen

Nächste Schritte

Lizenz

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