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 Backend zum Speichern von Daten verwenden. Die Beispielanwendung verwaltet eine Tabelle mit Spielern. Sie können Spieler über die grafische Benutzeroberfläche (GUI) der App 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.
Bevor Sie dieses Dokument lesen, sollten Sie mit Kubernetes vertraut sein.
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.
Wenn Sie GKE Autopilot als vollständig verwalteten Kubernetes-Dienst und Spanner als vollständig verwalteten Datenbankdienst verwenden, 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 manuellem Eingriff dynamisch horizontal skalieren und wieder herunterskalieren, wenn sich die Speicher- oder Computing-Anforderungen ä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.
Ziele
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: |
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. Für diese Anleitung verwenden Sie jedoch |
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, neue Ressourcen zu erstellen, damit Sie sie nach der Bereitstellung der Beispiel-App einfach und ohne Risiko löschen können. Wenn Sie bereits 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:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
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
Sie müssen folgende Voraussetzungen erfüllen:
Projekt auswählen oder erstellen
Sie können ein vorhandenes Projekt verwenden oder für diese Anleitung ein neues erstellen.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
APIs aktivieren
Enable the Artifact Registry, Compute Engine, GKE, and IAM Service Account Credentials APIs.
Cloud Shell einrichten
In dieser Anleitung verwenden Sie Cloud Shell zum Ausführen von gcloud
- und kubectl
-Befehlen. Cloud Shell ist eine Shell-Umgebung für die Verwaltung von Ressourcen, die in Google Cloud gehostet werden. Sie ist bei Google Cloud CLI und dem kubectl-Befehlszeilentool vorinstalliert.
In the Google Cloud console, activate Cloud Shell.
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 für diese Anleitung erforderlichen IAM-Rollen haben.
Grant roles to your user account. Run the following command once for each of the following
IAM roles:
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:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
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 Spanner-Datenbanken verwendet werden, die in dieser Instanz erstellt wurden.
Erstellen Sie eine Spanner-Instanz namens hello-instance
mit einer regionalen Konfiguration und einer 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 die folgende Abfrage in Cloud Shell 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 die Identitätsförderung von Arbeitslasten für 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.
Das Erstellen des Clusters kann bis zu 8 bis 10 Minuten dauern.
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 der Identitätsföderation von Arbeitslasten für GKE konfigurieren
Konfigurieren Sie Ihren Cluster so, dass er sich mit der Identitätsföderation von Arbeitslasten für GKE bei Google Cloud authentifiziert, bevor Sie die App bereitstellen.
Rufen Sie 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
Dadurch wird eine
kubeconfig
-Datei mit den entsprechenden Anmeldedaten und Endpunktinformationen aktualisiert, umkubectl
auf Ihren Cluster zu verweisen.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
durchhello-namespace
, den Namen des neuen Namespaces, den Sie erstellen.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
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
ist 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 sindGSA_PROJECT
und die Google Cloud-PROJECT_ID
identisch.
Fügen Sie eine IAM-Richtlinienbindung für Ihr IAM-Dienstkonto zum Lesen und Schreiben in Spanner hinzu:
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-IDGSA_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"
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-IDPROJECT_ID
: Ihre Google Cloud-Projekt-IDNAMESPACE
: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]"
Kennzeichnen Sie das Kubernetes-Dienstkonto mit der E-Mail-Adresse des IAM-Dienstkontos. Dadurch weiß Ihre Beispielanwendung, welches Dienstkonto für den Zugriff auf Google Cloud-Dienste verwendet werden soll. Wenn die App also 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.
Klonen Sie die Beispielanwendung aus dem GitHub-Repository in Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
Starten Sie den Cloud Shell-Editor, indem Sie in der Symbolleiste des Terminalfensters auf Editor öffnen klicken.
Weitere Informationen finden Sie unter Übersicht über die Benutzeroberfläche des Cloud Shell-Editors.
Öffnen Sie den Explorer-Bereich des Cloud Shell-Editors und rufen Sie das Verzeichnis
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s
auf.Öffnen Sie die Datei
deployment.yaml
und aktualisieren Sie das FeldserviceAccountName
. Ersetzen Sie dabei<KSA_NAME>
durchksa-helloapp
, den Namen Ihres Kubernetes-Dienstkontos.Schließen Sie den Cloud Shell-Editor und kehren Sie zum Cloud Shell-Terminal zurück.
Öffnen Sie im Cloud Shell-Terminal das Verzeichnis
hello-app-cloud-spanner
:cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
Stellen Sie die Anwendung bereit:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
Ersetzen Sie
NAMESPACE
durchhello-namespace
.Warten Sie, bis die Anwendung mit
STATUS
alsRunning
bereitgestellt wurde:kubectl get pods -n=NAMESPACE --watch
Ersetzen Sie
NAMESPACE
durchhello-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
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.
Stellen Sie den Load Balancer bereit:
kubectl apply -f k8s/service.yaml -n=NAMESPACE
Ersetzen Sie
NAMESPACE
durchhello-namespace
.Prüfen Sie, ob eine externe IP-Adresse zugewiesen werden soll:
kubectl get service -n=NAMESPACE --watch
Ersetzen Sie
NAMESPACE
durchhello-namespace
.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 Datenbank der Spieler angezeigt und verwaltet wird.Über die Benutzeroberfläche der App können Sie Spielerdatensätze erstellen oder löschen. Sie werden in der Spanner-Datenbank gespeichert.
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.
Delete a Google Cloud project:
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
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
durchhello-namespace
.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
Löschen Sie die Spanner-Datenbank:
gcloud spanner databases delete hello-database --instance=hello-instance
Löschen Sie die Spanner-Instanz:
gcloud spanner instances delete hello-instance