Anwendung mit GKE Autopilot und Cloud Spanner bereitstellen


In dieser Anleitung wird beschrieben, wie Sie eine containerisierte Webanwendung in einem GKE-Autopilot-Cluster (Google Kubernetes Engine) bereitstellen und eine Google Spanner-Datenbank im Back-End zum Speichern von Daten verwenden. Die Beispielanwendung verwaltet eine Tabelle mit Spielern. Sie können Spieler über die grafische Benutzeroberfläche (GUI) der Anwendung hinzufügen und löschen.

Spanner ist ein vollständig verwalteter, global verteilter, horizontal skalierbarer, relationaler Datenbankdienst, der ACID-Transaktionen und SQL-Semantik bietet, ohne Leistung und Hochverfügbarkeit zu beeinträchtigen.

In dieser Anleitung wird davon ausgegangen, dass Sie Grundkenntnisse in Kubernetes haben.

Vorteile von GKE und Spanner

Als Entwickler möchten Sie vielleicht keine Zeit damit verbringen, die Menge an Speicher- und Rechenressourcen zu ermitteln, die Ihre Anwendung benötigt, oder den RAM- und CPU-Verbrauch in Zeiten schwankender Anforderungen vorherzusagen oder sich Sorgen über Anwendungsausfälle bei Spitzenbelastungen zu machen.

Durch die Verwendung von GKE Autopilot als vollständig verwalteter Kubernetes-Dienst und Spanner als vollständig verwalteter Datenbankdienst können Sie Anwendungen schneller in einer stabilen Infrastruktur entwickeln und bereitstellen, die die Konfiguration und Verwaltung von Ressourcen vereinfacht. GKE Autopilot konfiguriert und skaliert die Infrastruktur zum Hosten Ihrer Anwendung, indem Knoten entsprechend den Anforderungen zur Laufzeit zum Cluster hinzugefügt oder entfernt werden. Ebenso kann Spanner mit minimalem manuellen Eingriff dynamisch horizontal und horizontal skalieren, wenn sich die Speicher- oder Rechenanforderungen ändern.

Nehmen wir an, Sie bringen den nächsten Spiele-Blockbuster auf den Markt, von dem Sie erwarten, dass er sich viral verbreitet und daher in der Einführungswoche viel Traffic erzeugt. Cloud Spanner kann Sie bei diesem rasanten Anstieg des Durchsatzes unterstützen, indem er die Rechenressourcen sofort erhöht, verringert oder neu zuweist und dabei mit GKE Autopilot die maximale Anwendungsverfügbarkeit aufrechterhält.

Lernziele

In dieser Anleitung erfahren Sie mehr über die folgenden Themen:

  • Spanner-Datenbank zum Speichern einer Registry von Spielern erstellen.

  • Eine Beispiel-Webanwendung namens hello-app-cloud-spanner mit einer grafischen Benutzeroberfläche bereitstellen.

Die folgende Tabelle beschreibt die Google Cloud-Ressourcen, die Sie erstellen oder verwenden, die Variablen, mit denen sie identifiziert werden, und die für sie vorgegebenen Werte für den Zweck dieser Anleitung:

Ressource Variable Wert
Google Cloud-Projekt-ID PROJECT_ID

Die Projekt-ID, die beim Erstellen eines Projekts generiert wird.

Beispiel: my-gcp-project

Compute-Region COMPUTE_REGION

Die Compute Engine-Region, in der Sie die Spanner-Instanz und den GKE-Cluster erstellen möchten. Wir empfehlen, eine Region auszuwählen, die dem geografischen Standort Ihrer Kunden am nächsten ist. In dieser Anleitung verwenden Sie jedoch us-west1.

Spanner-Instanz - hello-instance
Spanner-Datenbank - hello-database
GKE Autopilot-Cluster CLUSTER_NAME hello-cluster
Kubernetes-Namespace NAMESPACE hello-namespace
Kubernetes-Dienstkonto KSA_NAME ksa-helloapp
IAM-Dienstkonto GSA_NAME gsa-helloapp
Projekt-ID des IAM-Dienstkontos GSA_PROJECT Ihre Google Cloud PROJECT_ID.

Für diese Anleitung empfehlen wir das Erstellen neuer Ressourcen. Dadurch wird das Löschen einfacher und risikofreier, nachdem Sie die Beispielanwendung bereitgestellt haben. Wenn Sie jedoch vorhandene Namespaces, IAM-Dienstkonten und Kubernetes-Dienstkonten haben, können Sie diese verwenden.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

Projekt auswählen oder erstellen

Sie können für diese Anleitung ein vorhandenes Projekt verwenden oder ein neues erstellen.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

APIs aktivieren

Artifact Registry, Compute Engine, GKE, and IAM Service Account Credentials APIs aktivieren.

Aktivieren Sie die APIs

Cloud Shell einrichten

In dieser Anleitung verwenden Sie Cloud Shell zum Ausführen der Befehle gcloud und kubectl. Cloud Shell ist eine Shell-Umgebung für die Verwaltung von Ressourcen, die in Google Cloud gehostet werden. Die Google Cloud CLI und das kubectl-Befehlszeilentool sind vorinstalliert.

Aktivieren Sie Cloud Shell in der Google Cloud Console.

Cloud Shell aktivieren

In einem Frame im unteren Teil der Console wird eine Cloud Shell-Sitzung geöffnet.

Achten Sie vor dem Ausführen von Befehlen in dieser Anleitung darauf, dass Ihr Standardprojekt auf die Projekt-ID festgelegt ist, in der Sie die Beispielanwendung bereitstellen möchten. Führen Sie den folgenden Befehl in Cloud Shell aus, falls sie noch nicht festgelegt ist:

gcloud config set project PROJECT_ID

Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

IAM-Rollen zuweisen

Ihr Google Cloud-Konto muss die erforderlichen IAM-Rollen für diese Anleitung haben.

Gewähren Sie Ihrem Google-Konto Rollen. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus: roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin

$ gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
  • Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.
  • Ersetzen Sie EMAIL_ADDRESS durch Ihre E-Mail-Adresse.
  • Ersetzen Sie ROLE durch jede einzelne Rolle.

Spanner konfigurieren

Zum Konfigurieren von Spanner müssen Sie eine Spanner-Instanz und eine Spanner-Datenbank erstellen.

Spanner-Instanz erstellen

Eine Spanner-Instanz ist eine Zuordnung von Ressourcen, die von den in dieser Instanz erstellten Spanner-Datenbanken verwendet werden.

Erstellen Sie eine Spanner-Instanz namens hello-instance mit einer regionalen Konfiguration und Rechenkapazität von 100-Verarbeitungseinheiten.

gcloud spanner instances create hello-instance \
    --config=regional-COMPUTE_REGION \
    --description="Spanner sample instance" \
    --processing-units=100

Ersetzen Sie in dieser Anleitung COMPUTE_REGION durch us-west1.

Spanner-Datenbank erstellen

Eine Spanner-Datenbank enthält Ihre Tabellen, Ansichten und Indexe. Eine Datenbank übernimmt Attribute von der übergeordneten Instanz, z. B. Konfiguration (regional oder multiregional), verfügbare Rechenkapazität und Speicher.

Erstellen Sie mit dem GoogleSQL-Dialekt eine Spanner-Datenbank namens hello-database mit einer Tabelle namens Players. Führen Sie in Cloud Shell die folgende Abfrage aus:

gcloud spanner databases create hello-database \
    --instance=hello-instance \
    --database-dialect=GOOGLE_STANDARD_SQL \
    --ddl="CREATE TABLE Players (
        PlayerUuid STRING(36) NOT NULL,
        FirstName STRING(1024),
        LastName STRING(1024),
        BirthDate DATE) PRIMARY KEY(PlayerUuid)"

Erstellen Sie einen GKE Autopilot-Cluster

Nachdem Sie Cloud Spanner konfiguriert haben, erstellen Sie einen Autopilot-Cluster und verwenden die Identitätsföderation für Arbeitslasten für GKE, um auf sichere und verwaltbare Weise auf Ihre Datenbank zuzugreifen.

Erstellen Sie einen Autopilot-Cluster mit dem Namen hello-cluster. Für Autopilot-Cluster ist Workload Identity Federation for GKE standardmäßig aktiviert.

gcloud container clusters create-auto CLUSTER_NAME \
  --region=COMPUTE_REGION

Ersetzen Sie Folgendes:

  • CLUSTER_NAME: hello-cluster
  • COMPUTE_REGION: Die Compute Engine-Region des Clusters. Verwenden Sie für diese Anleitung dieselbe Region us-west1, in der Sie die Spanner-Instanz erstellt haben. Wir empfehlen, die Spanner-Instanz und den GKE Autopilot-Cluster in derselben Region zu erstellen, um die Latenz zu reduzieren.

Es kann acht bis zehn Minuten dauern, bis der Cluster erstellt ist.

Die Ausgabe sieht in etwa so aus:

NAME: hello-cluster
LOCATION: us-west1
MASTER_VERSION: 1.26.5-gke.1200
MASTER_IP: 192.0.2.1
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.26.5-gke.1200
NUM_NODES: 3
STATUS: RUNNING

Cluster für die Verwendung von Workload Identity-Föderation für GKE konfigurieren

Konfigurieren Sie Ihren Cluster für die Authentifizierung bei Google Cloud mit Workload Identity Federation for GKE, bevor Sie die Anwendung bereitstellen.

  1. Rufen Sie die Anmeldedaten für den Zugriff auf Ihren Cluster ab:

    gcloud container clusters get-credentials CLUSTER_NAME \
      --region=COMPUTE_REGION
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: hello-cluster
    • COMPUTE_REGION: us-west1

    Damit wird eine kubeconfig-Datei mit den entsprechenden Anmeldedaten und Endpunktinformationen aktualisiert, sodass kubectl auf Ihren Cluster verweist.

  2. Erstellen Sie einen Namespace, der für das Kubernetes-Dienstkonto verwendet werden soll. Sie können auch den Standard-Namespace oder einen vorhandenen Namespace verwenden.

    kubectl create namespace NAMESPACE
    

    Ersetzen Sie NAMESPACE durch hello-namespace, den Namen für den neuen Namespace, den Sie erstellen.

  3. Erstellen Sie ein Kubernetes-Dienstkonto für die Anwendung:

    kubectl create serviceaccount KSA_NAME \
      --namespace NAMESPACE
    

    Ersetzen Sie Folgendes:

    • KSA_NAME: ksa-helloapp ist der Name des neuen Kubernetes-Dienstkontos, das Sie erstellen.
    • NAMESPACE: hello-namespace
  4. Erstellen Sie ein IAM-Dienstkonto für Ihre Anwendung:

    gcloud iam service-accounts create GSA_NAME \
      --project=GSA_PROJECT
    

    Ersetzen Sie Folgendes:

    • GSA_NAME: gsa-helloapp, der Name des neuen IAM-Dienstkontos, das Sie erstellen.
    • GSA_PROJECT: Ihre Google Cloud-Projekt-ID. In dieser Anleitung erstellen Sie das IAM-Dienstkonto im selben Google Cloud-Projekt, in dem Sie die Beispielanwendung bereitstellen. Daher sind GSA_PROJECT und die Google Cloud-PROJECT_ID identisch.
  5. Fügen Sie eine IAM-Richtlinienbindung für Ihr IAM-Dienstkonto hinzu, um Daten in Spanner zu lesen und zu schreiben:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/spanner.admin"
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Google Cloud-Projekt-ID
    • GSA_NAME: gsa-helloapp

    Beispiel:

    gcloud projects add-iam-policy-binding my-gcp-project \
      --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \
      --role "roles/spanner.admin"
  6. Erlauben Sie dem Kubernetes-Dienstkonto, die Identität des IAM-Dienstkontos zu übernehmen. Fügen Sie dazu eine IAM-Richtlinienbindung zwischen den beiden Dienstkonten hinzu. Durch diese Bindung kann das Kubernetes-Dienstkonto als IAM-Dienstkonto verwendet werden, sodass das Kubernetes-Dienstkonto Daten in Spanner lesen und schreiben kann.

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    Ersetzen Sie Folgendes:

    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: Ihre Google Cloud-Projekt-ID
    • PROJECT_ID: Ihre Google Cloud-Projekt-ID
    • NAMESPACE: hello-namespace
    • KSA_NAME: ksa-helloapp

    Beispiel:

    gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
  7. Kennzeichnen Sie das Kubernetes-Dienstkonto mit der E-Mail-Adresse des IAM-Dienstkontos. Dadurch teilt die Beispielanwendung mit, welches Dienstkonto für den Zugriff auf Google Cloud-Dienste verwendet werden soll. Wenn die Anwendung also Standard-Google API-Clientbibliotheken für den Zugriff auf Google Cloud-Dienste verwendet, verwendet sie dieses IAM-Dienstkonto.

    kubectl annotate serviceaccount KSA_NAME \
      --namespace NAMESPACE \
      iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
    

    Ersetzen Sie Folgendes:

    • KSA_NAME: ksa-helloapp
    • NAMESPACE: hello-namespace
    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: Ihre Google Cloud-Projekt-ID

    Beispiel:

    kubectl annotate serviceaccount ksa-helloapp \
      --namespace hello-namespace \
      iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com

Beispielanwendung im Cluster bereitstellen

Nachdem Sie GKE und Spanner mit den erforderlichen Diensten und der Authentifizierung eingerichtet haben, können Sie die Beispielanwendung hello-app-cloud-spanner bereitstellen.

  1. Klonen Sie die Beispielanwendung aus dem GitHub-Repository in Cloud Shell:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  2. Starten Sie den Cloud Shell-Editor, indem Sie in der Symbolleiste des Terminalfensters auf Schaltfläche „Code-Editor“ Editor öffnen klicken.

    Weitere Informationen finden Sie unter Übersicht über die Benutzeroberfläche des Cloud Shell-Editors.

  3. Öffnen Sie den Explorer-Bereich des Cloud Shell-Editors und wechseln Sie zum Verzeichnis kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

  4. Öffnen Sie die Datei deployment.yaml und aktualisieren Sie das Feld serviceAccountName. Ersetzen Sie dazu <KSA_NAME> durch ksa-helloapp, den Namen Ihres Kubernetes-Dienstkontos.

    Bearbeiten Sie YAML, um KSA_NAME zu aktualisieren.
    Abbildung 1. Aktualisieren Sie den Namen des Kubernetes-Dienstkontos in der Bereitstellungsdatei.
  5. Schließen Sie den Cloud Shell-Editor und kehren Sie zum Cloud Shell-Terminal zurück.

  6. Öffnen Sie im Cloud Shell-Terminal das Verzeichnis hello-app-cloud-spanner:

    cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
    
  7. Stellen Sie die Anwendung bereit:

    kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
    

    Ersetzen Sie NAMESPACE durch hello-namespace.

  8. Warten Sie, bis die Anwendung mit STATUS als Running bereitgestellt wurde:

    kubectl get pods -n=NAMESPACE --watch
    

    Ersetzen Sie NAMESPACE durch hello-namespace.

    Die Ausgabe sieht in etwa so aus:

    NAME                                       READY   STATUS              RESTARTS   AGE
    hello-app-cloud-spanner-765c9b8779-lfcrc   0/1     ContainerCreating   0          87s
    hello-app-cloud-spanner-765c9b8779-lfcrc   1/1     Running             0          3m15s
    
  9. Drücken Sie Strg + C auf Ihrer Tastatur, um zur Eingabeaufforderung zurückzukehren und weitere Befehle auszuführen.

Beispielanwendung im Internet freigeben

Zur Freigabe eines Kubernetes-Dienstes außerhalb des Clusters erstellen Sie einen Dienst vom Typ LoadBalancer. Dieser Diensttyp generiert eine externe Load Balancer-IP-Adresse für Ihre Pods, die über das Internet erreichbar ist.

  1. Stellen Sie den Load Balancer bereit:

    kubectl apply -f k8s/service.yaml -n=NAMESPACE
    

    Ersetzen Sie NAMESPACE durch hello-namespace.

  2. Achten Sie auf die Zuweisung einer externen IP-Adresse:

    kubectl get service -n=NAMESPACE --watch
    

    Ersetzen Sie NAMESPACE durch hello-namespace.

  3. Kopieren Sie nach der Zuweisung die EXTERNAL-IP (z. B. 203.0.113.0) und öffnen Sie sie in einem Browser. Es wird eine Weboberfläche geöffnet, in der die Spielerdatenbank angezeigt und verwaltet wird.

  4. Sie können mit der Anwendungs-GUI Spielerdatensätze erstellen oder löschen, die in der Spanner-Datenbank gespeichert werden.

    Fügen Sie Spieler hinzu oder löschen Sie sie.
    Abbildung 2. Erstellen oder löschen Sie Spieler in der Registry.

    Führen Sie die folgende Abfrage aus, um zu prüfen, ob die Spanner-Datenbank mit Ihren Einträgen aktualisiert wurde:

    gcloud spanner databases execute-sql hello-database \
      --instance=hello-instance \
      --sql="SELECT * FROM Players LIMIT 10"
    

    Die Ausgabe sieht in etwa so aus:

    PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3
    FirstName: John
    LastName: Smith
    BirthDate: 1997-07-12
    
    PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e
    FirstName: Jane
    LastName: Doe
    BirthDate: 2013-07-12
    

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

Sie vermeiden weitere Kosten am einfachsten, wenn Sie das für die Anleitung erstellte Projekt löschen.

Google Cloud-Projekt löschen:

gcloud projects delete PROJECT_ID

Wenn Sie das Projekt gelöscht haben, ist die Bereinigung abgeschlossen. Wenn Sie das Projekt nicht gelöscht haben, fahren Sie mit Löschen den GKE- und Spanner-Ressourcen fort.

GKE-Ressourcen löschen

  1. Dienst löschen: Dadurch wird die Zuweisung des für Ihren Dienst erstellten Google Cloud Load Balancers aufgehoben:

    kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
    

    Ersetzen Sie NAMESPACE durch hello-namespace.

  2. Löschen Sie den GKE-Cluster. Dadurch werden die Ressourcen eines Clusters gelöscht, z. B. die Compute-Instanzen, Laufwerke und Netzwerkressourcen:

    gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: hello-cluster
    • COMPUTE_REGION: us-west1

Spanner-Ressourcen löschen

  1. Löschen Sie die Spanner-Datenbank:

    gcloud spanner databases delete hello-database --instance=hello-instance
    
  2. Löschen Sie die Spanner-Instanz:

    gcloud spanner instances delete hello-instance
    

Nächste Schritte