GKE-Cluster mit Cloud Service Mesh und der gcloud CLI erstellen
In dieser Anleitung stellen Sie verwaltetes Cloud Service Mesh mit der Fleet API von Google Kubernetes Engine (GKE) in einem neuen öffentlichen GKE-Cluster bereit. In dieser Anleitung wird Folgendes beschrieben:
- Google Cloud-Projekt konfigurieren
- GKE-Cluster mit der Mindestanzahl von vCPUs erstellen, die von Cloud Service Mesh benötigt werden
- Registrieren Sie den GKE-Cluster in der Flotte Ihres Projekts.
- Verwaltetes Cloud Service Mesh mit der Fleet API im Cluster bereitstellen
- Ingress-Gateway zur Freigabe der Anwendung bereitstellen
- Beispielanwendung bereitstellen, um Telemetriedaten auf den Cloud Service Mesh-Dashboards in der Google Cloud Console aufzurufen
- Beispielanwendung verfügbar machen und darauf zugreifen
Fleet API
In diesem Leitfaden wird davon ausgegangen, dass Sie mit Flotten vertraut sind. Das sind logische Gruppierungen von GKE-Clustern und anderen Ressourcen, die zusammen verwaltet werden können. Eine Flotte ist ein GKE-Konzept – kein Kubernetes-Konzept. Wenn Sie einen Cluster bei einer Flotte registrieren, können Sie mit dem Befehl gcloud container fleet mesh update
verwaltetes Cloud Service Mesh auf diesem Cluster bereitstellen.
Die Verwendung von Flotten wird von der Fleet API (gkehub.googleapis.com
) ermöglicht, die Sie zu Beginn dieser Anleitung aktivieren.
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.
Nach Abschluss dieser Kurzanleitung können Sie weitere Kosten durch das Löschen des Clusters vermeiden. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
- 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.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
-
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.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
- Notieren Sie sich die Projekt-ID.
Erforderliche Tools installieren
Sie können das Tool in Cloud Shell oder auf Ihrem lokalen Computer ausführen. Cloud Shell installiert alle erforderlichen Tools vorab.
Cloud Shell
Cloud Shell stellt eine g1-small Compute Engine-VM bereit, auf der ein Debian-basiertes Linux-Betriebssystem ausgeführt wird. Cloud Shell bietet folgende Vorteile:
Cloud Shell umfasst
gcloud
,kubectl
,git
und die anderen erforderlichen Befehlszeilentools.Ihr $HOME-Verzeichnis in Cloud Shell verfügt über 5 GB nichtflüchtigen Speicher.
Es stehen verschiedene Texteditoren zur Auswahl:
Code-Editor, auf den Sie zugreifen, indem Sie oben im Cloud Shell-Fenster auf edit klicken.
Emacs, Vim oder Nano, auf die Sie in Cloud Shell über die Befehlszeile zugreifen.
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Lokaler Computer
Die folgenden Tools müssen installiert sind:
Authentifizieren Sie sich mit Google Cloud-CLI:
gcloud auth login --project PROJECT_ID
Aktualisieren Sie die Komponenten:
gcloud components update
GKE-Cluster erstellen
Führen Sie den folgenden Befehl aus, um den Cluster mit der Mindestanzahl von vCPUs zu erstellen, die für Cloud Service Mesh erforderlich ist. Ersetzen Sie im Befehl die Platzhalter durch folgende Informationen:
- CLUSTER_NAME: Der Name Ihres Clusters. Der Name darf nur kleingeschriebene, alphanumerische Zeichen und
-
enthalten, muss mit einem Buchstaben beginnen und mit einem alphanumerischen Zeichen enden. Er darf nicht länger als 40 Zeichen sein. - PROJECT_ID: Die Projekt-ID, in der der Cluster erstellt wird.
- CLUSTER_LOCATION: Die
Zone des Clusters, z. B.
us-central1-a
.
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
Das Erstellen des Clusters dauert einige Minuten. Während der Cluster erstellt wird, zeigt der Befehl
gcloud
Folgendes an:Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
Die erwartete Ausgabe nach erfolgreicher Erstellung sieht in etwa so aus:
Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID kubeconfig entry generated for CLUSTER_NAME. NAME: CLUSTER_NAME LOCATION: CLUSTER_LOCATION MASTER_VERSION: 1.20.10-gke.1600 MASTER_IP: 198.51.100.1 MACHINE_TYPE: e2-standard-4 NODE_VERSION: 1.20.10-gke.1600 NUM_NODES: 2 STATUS: RUNNING
- CLUSTER_NAME: Der Name Ihres Clusters. Der Name darf nur kleingeschriebene, alphanumerische Zeichen und
Rufen Sie die Anmeldedaten für die Authentifizierung ab, um mit dem Cluster zu interagieren.
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Erwartete Ausgabe:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
Legen Sie den aktuellen Kontext für
kubectl
auf den Cluster fest.kubectl config set-context CLUSTER_NAME
Erwartete Ausgabe:
Context "CLUSTER_NAME" created.
Cloud Service Mesh bereitstellen
Wenn Sie diese Seite seit dem Erstellen des Clusters nicht geschlossen haben, enthalten die Platzhalter die Werte, die Sie für den Befehl gcloud container clusters create
eingegeben haben.
Aktivieren Sie Cloud Service Mesh in der Flotte Ihres Projekts.
gcloud container fleet mesh enable --project PROJECT_ID
Die Ausgabe sieht etwa so aus:
Waiting for Feature Service Mesh to be created...done.
Registrieren Sie den Cluster in der Flotte des Projekts:
gcloud container fleet memberships register CLUSTER_NAME-membership \ --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
Die Ausgabe sieht etwa so aus:
Waiting for membership to be created...done. Finished registering to the Fleet.
Stellen Sie verwaltetes Cloud Service Mesh mithilfe der Fleet API im Cluster bereit:
gcloud container fleet mesh update \ --management automatic \ --memberships CLUSTER_NAME-membership \ --project PROJECT_ID
Die Ausgabe sieht etwa so aus:
Waiting for Feature Service Mesh to be updated...done.
Prüfen Sie, ob verwaltetes Cloud Service Mesh für den Cluster aktiviert wurde und bereit zur Verwendung ist:
gcloud container fleet mesh describe --project PROJECT_ID
Es kann etwa 10 Minuten dauern, bis Cloud Service Mesh bereitgestellt wird und im Cluster bereit ist. Wenn
controlPlaneManagement.state: DISABLED
odercontrolPlaneManagement.state: PROVISIONING
angezeigt wird, müssen Sie den vorherigen Befehl alle paar Minuten noch einmal ausführen, biscontrolPlaneManagement.state: ACTIVE
angezeigt wird.Die Ausgabe sieht etwa so aus:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/your-cluster-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/your-cluster-membership: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: 'Revision(s) ready for use: asm-managed.' updateTime: '2022-07-06T01:19:24.243993678Z' name: projects/your-project-id/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-07-06T01:19:27.475885687Z'
Beispielcode herunterladen
Klonen Sie das Git-Repository, das den in dieser Anleitung verwendeten Beispielcode enthält:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
In den nächsten Abschnitten dieser Anleitung wird eine DIR_PATH-Variable verwendet.
Legen Sie für diese Variable den Pfad zum geklonten anthos-service-mesh-packages
-Repository fest (z. B. ./anthos-service-mesh-packages
).
Ingress-Gateway bereitstellen
Cloud Service Mesh bietet Ihnen die Möglichkeit, Gateways als Teil Ihres Service Mesh bereitzustellen und zu verwalten. Ein Gateway beschreibt einen Load-Balancer, der am Rand des Mesh-Netzwerks arbeitet und eingehende oder ausgehende HTTP/TCP-Verbindungen empfängt. Gateways sind Envoy-Proxys, die Ihnen eine detaillierte Kontrolle über den in das Mesh-Netzwerk eingehenden und ausgehenden Traffic ermöglichen.
Erstellen Sie einen Namespace für das Ingress-Gateway, falls Sie noch keinen haben. Gateways sind Nutzerarbeitslasten und sollten als Best Practice nicht im Namespace der Steuerungsebene bereitgestellt werden. Ersetzen Sie
GATEWAY_NAMESPACE
durch den Namen Ihres Namespace.kubectl create namespace GATEWAY_NAMESPACE
Erwartete Ausgabe:
namespace/GATEWAY_NAMESPACE created
Aktivieren Sie die automatische Einfügung auf dem Gateway. Welche Schritte erforderlich sind, hängt davon ab, ob Sie Standardlabels für Einfügungen (Beispiel:
istio-injection=enabled
) oder die Überarbeitungslabel im Gateway-Namespace verwenden möchten. Das Standard-Überarbeitungs-Tag und das Überarbeitungslabel werden vom Sidecar-Injektor-Webhook dazu verwendet, eingefügte Proxys einer bestimmten Überarbeitung der Steuerungsebene zuzuordnen.Standard-Injektionslabels
Wenden Sie die Standard-Injektionslabels auf den Namespace an.
kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
Überarbeitungslabel
Verwenden Sie den folgenden Befehl, um das Überarbeitungslabel für
istiod
zu finden:kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
Der Befehl gibt das Überarbeitungslabel aus, das der Cloud Service Mesh-Version entspricht, z. B.
asm-11910-9
.Wenden Sie das Überarbeitungslabel auf den Namespace an. Im folgenden Befehl ist
REVISION
der Wert des Überarbeitungslabelsistiod
, den Sie im vorherigen Schritt notiert haben.kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
Erwartete Ausgabe:
namespace/GATEWAY_NAMESPACE labeled
Sie können die Nachricht
"istio.io/rev" not found
in der Ausgabe ignorieren. Das bedeutet, dass der Namespace bisher nicht das Labelistio.io/rev
hatte, was bei Neuinstallationen von Cloud Service Mesh oder neuen Bereitstellungen zu erwarten wäre. Da die automatische Injektion fehlschlägt, wenn ein Namespace sowohl das Labelistio.io/rev
als auch das Labelistio-injection
enthält, werden in allenkubectl label
-Befehlen in der Cloud Service Mesh-Dokumentation beide Labels explizit angegeben.Wenn der Gateway-Namespace nicht gekennzeichnet ist, schlagen die
istio-ingressgateway
-Pods mit einemImagePullBackOff
-Fehler fehl, wenn das Gateway versucht, dasauto
-Image abzurufen. Dieses Bild sollte durch den Webhook ersetzt werden.Laden Sie die Beispiel-YAML-Konfigurationsdatei für das Ingress-Gateway aus dem Repository
anthos-service-mesh-packages
herunter.Wenden Sie die Beispiel-YAML-Konfiguration für das Ingress-Gateway unverändert an oder ändern Sie sie nach Bedarf.
kubectl apply -n GATEWAY_NAMESPACE \ -f CONFIG_PATH/istio-ingressgateway
Erwartete Ausgabe:
deployment.apps/istio-ingressgateway created poddisruptionbudget.policy/istio-ingressgateway created horizontalpodautoscaler.autoscaling/istio-ingressgateway created role.rbac.authorization.k8s.io/istio-ingressgateway created rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created service/istio-ingressgateway created serviceaccount/istio-ingressgateway created
Online Boutique-Beispiel bereitstellen
Die Online Boutique-Beispielanwendung im anthos-service-mesh-packages
-Repository wird aus dem ursprünglichen Satz von Manifesten im microservices-demo
-Repository modifiziert. Gemäß den Best Practices wird jeder Dienst in einem separaten Namespace mit einem eigenen Dienstkonto bereitgestellt.
Erstellen Sie die Namespaces für die Anwendung:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Erwartete Ausgabe:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
Aktivieren Sie die automatische Sidecar-Injektion (automatische Injektion). Der erforderliche Befehl hängt davon ab, ob Sie Standard-Injektionslabels (z. B.
istio-injection=enabled
) oder dasselbe Überarbeitungslabel verwenden möchten, mit dem Sie den Namespace des Ingress-Gateways annotiert haben.Standard-Injektionslabels
Wenden Sie die Standard-Injektionslabels auf den Namespace an. Im folgenden Befehl ist GATEWAY_NAMESPACE der Wert, mit dem Sie den Namespace des Ingress-Gateways annotiert haben.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio-injection=enabled istio.io/rev- done;
Erwartete Ausgabe:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Überarbeitungslabel
Wenden Sie das Überarbeitungslabel auf die Anwendungs-Namespaces an. Im folgenden Befehl ist REVISION der Wert, mit dem Sie den Namespace des Ingress-Gateways annotiert haben.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Erwartete Ausgabe:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Stellen Sie die Beispielanwendung im Cluster bereit:
Erstellen Sie die Dienstkonten und Deployments:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
Erwartete Ausgabe:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
Erstellen Sie die Dienste:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services
Erwartete Ausgabe:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
Erstellen Sie die Diensteinträge:
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Erwartete Ausgabe:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Anwendung freigeben und darauf zugreifen
Es gibt mehrere Möglichkeiten, die Anwendung freizugeben. In dieser Anleitung verwenden wir dazu das oben bereitgestellte Ingress-Gateway. Weitere Möglichkeiten zur Freigabe der Online Boutique-Anwendung finden Sie im Abschnitt Anwendung freigeben und darauf zugreifen im Leitfaden für die Online Boutique-Beispielanwendung.
Stellen Sie
Gateway
undVirtualService
für den Frontend-Dienst bereitkubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
Erwartete Ausgabe:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Rufen Sie die externe IP-Adresse des Ingress-Gateways ab und ersetzen Sie die Platzhalter durch folgende Informationen:
- GATEWAY_SERVICE_NAME: Der Name des Ingress-Gateway-Dienstes. Wenn Sie das Beispiel-Gateway ohne Änderung bereitgestellt haben, wäre dies
istio-ingressgateway
. - GATEWAY_NAMESPACE: Der Namespace, in dem Sie das Ingress-Gateway bereitgestellt haben:
kubectl get service GATEWAY_SERVICE_NAME \ -n GATEWAY_NAMESPACE
Die Ausgabe sieht etwa so aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
In diesem Beispiel lautet die IP-Adresse des Ingress-Gateways
35.239.7.64
.- GATEWAY_SERVICE_NAME: Der Name des Ingress-Gateway-Dienstes. Wenn Sie das Beispiel-Gateway ohne Änderung bereitgestellt haben, wäre dies
Rufen Sie die Anwendung in Ihrem Browser auf, um die Installation zu bestätigen:
http://EXTERNAL_IP/
Service Mesh-Dashboards aufrufen
Nachdem Sie Arbeitslasten mit den eingefügten Sidecar-Proxys auf Ihrem Cluster bereitgestellt haben, können Sie die Cloud Service Mesh-Seiten in der Google Cloud Console entdecken, um alle Beobachtbarkeitsfunktionen von Cloud Service Mesh zu sehen. Nach der Bereitstellung von Arbeitslasten dauert es etwa ein oder zwei Minuten, bis Telemetriedaten in der Google Cloud Console angezeigt werden.
Der Zugriff auf Cloud Service Mesh in der Google Cloud Console wird durch die Identitäts- und Zugriffsverwaltung (Identity and Access Management, IAM) gesteuert. Für den Zugriff auf Cloud Service Mesh-Seiten muss ein Projektinhaber den Nutzern die Rolle „Projektbearbeiter“ oder „Betrachter“ oder die unter Zugriff auf Cloud Service Mesh in der Google Cloud Console steuern beschriebenen restriktiveren Rollen gewähren.
Rufen Sie in der Google Cloud Console Cloud Service Mesh auf.
Wählen Sie das Google Cloud-Projekt aus der Drop-down-Liste in der Menüleiste aus.
Wenn Sie mehr als ein Service Mesh haben, wählen Sie das Mesh aus der Drop-down-Liste Service Mesh aus.
Weitere Informationen finden Sie unter Cloud Service Mesh in der Google Cloud Console kennenlernen.
Bereinigen
Wenn Sie mehr über gegenseitiges TLS erfahren möchten, lesen Sie Cloud Service Mesh mit Beispiel: mTLS.
Wenn Sie den Cluster behalten und das Online Boutique-Beispiel entfernen möchten:
Löschen Sie die Anwendungs-Namespaces:
kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Erwartete Ausgabe:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
Löschen Sie die Diensteinträge:
kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Erwartete Ausgabe:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
Wenn Sie zusätzliche Gebühren vermeiden möchten, löschen Sie den Cluster:
Führen Sie dazu diesen Befehl aus:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Geben Sie für die Eingabeaufforderung Möchten Sie fortfahren (J/N)? J ein.
Nach einigen Minuten wird folgende Ausgabe angezeigt:
Deleting cluster CLUSTER_NAME...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
Nächste Schritte
- Weitere Informationen zu verwaltetem Cloud Service Mesh finden Sie unter Verwaltetes Cloud Service Mesh bereitstellen.
- Eine kurze Einführung in die in dieser Anleitung verwendete gcloud CLI finden Sie unter
gcloud
-Befehle. - Informationen zum Testen von Cloud Service Mesh in der Google Cloud Console finden Sie unter Mit Cloud Service Mesh in der Google Cloud Console vertraut machen.
- Informationen zu optionalen Cloud Service Mesh-Features wie Cloud Trace, sitzungsloser Proxy-Images und Endnutzerauthentifizierung finden Sie unter Optionale Funktionen in verwaltetem Cloud Service Mesh aktivieren.
- Weitere Informationen zur Sicherheit in Cloud Service Mesh finden Sie unter Cloud Service Mesh-Sicherheit – Übersicht und Best Practices für die Sicherheit in Cloud Service Mesh.
- Weitere Informationen zu Telemetrie in Cloud Service Mesh finden Sie unter Übersicht über die Observability.