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:

  1. Google Cloud-Projekt konfigurieren
  2. GKE-Cluster mit der Mindestanzahl von vCPUs erstellen, die von Cloud Service Mesh benötigt werden
  3. Den GKE-Cluster bei der Flotte Ihres Projekts registrieren
  4. Verwaltetes Cloud Service Mesh mit der Fleet API im Cluster bereitstellen
  5. Ingress-Gateway zur Freigabe der Anwendung bereitstellen
  6. Beispielanwendung bereitstellen, um Telemetriedaten auf den Cloud Service Mesh-Dashboards in der Google Cloud Console aufzurufen
  7. Beispielanwendung verfügbar machen und darauf zugreifen

Fleet API

In diesem Leitfaden wird davon ausgegangen, dass Sie mit Flotten, die logische Gruppierungen von GKE-Clustern und anderen Ressourcen, gemeinsam verwaltet werden. 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. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Kurzanleitung können Sie weitere Kosten durch das Löschen des Clusters vermeiden. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  8. Notieren Sie sich die Projekt-ID.

Erforderliche Tools installieren

Sie können das Tool in Cloud Shell ausführen. oder auf Ihrem lokalen Rechner installiert. 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 klicken.

    • Emacs, Vim oder Nano, auf die Sie in Cloud Shell über die Befehlszeile zugreifen.

In the Google Cloud console, activate Cloud Shell.

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

  1. Die folgenden Tools müssen installiert sind:

  2. Authentifizieren Sie sich mit Google Cloud-CLI:

    gcloud auth login --project PROJECT_ID
    
  3. Aktualisieren Sie die Komponenten:

    gcloud components update
    

GKE-Cluster erstellen

  1. 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
    
  2. 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.
    
  3. 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.

  1. 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.
    
  2. 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.
    
  3. Stellen Sie das verwaltete Cloud Service Mesh mit 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.
    
  4. Prüfen Sie, ob das verwaltete Cloud Service Mesh für den Cluster aktiviert wurde und einsatzbereit:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Es kann etwa 10 Minuten dauern, bis das Cloud Service Mesh bereitgestellt ist und die sofort im Cluster verwendet werden können. Wenn controlPlaneManagement.state: DISABLED oder controlPlaneManagement.state: PROVISIONING angezeigt wird, müssen Sie den vorherigen Befehl alle paar Minuten noch einmal ausführen, bis controlPlaneManagement.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 diese Variable auf den Pfad des geklonten anthos-service-mesh-packages-Repositories fest (z. B. ./anthos-service-mesh-packages).

Ingress-Gateway bereitstellen

Mit Cloud Service Mesh haben Sie die Möglichkeit, Gateways als Teil Ihres Service Mesh. 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.

  1. 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
    
  2. 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

    1. 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 Versionslabel aus, das der Cloud Service Mesh-Version, z. B.: asm-1232-2

    2. Wenden Sie das Überarbeitungslabel auf den Namespace an. Im folgenden Befehl ist REVISION der Wert des Überarbeitungslabels istiod, 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 zuvor nicht den Wert istio.io/rev-Label, das Sie bei Neuinstallationen von Cloud Service Mesh oder neue Bereitstellungen. Da die automatische Injektion fehlschlägt, wenn ein Namespace sowohl das Label istio.io/rev als auch das Label istio-injection enthält, werden in allen kubectl 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 einem ImagePullBackOff-Fehler fehl, wenn das Gateway versucht, das auto-Image abzurufen. Dieses Bild sollte durch den Webhook ersetzt werden.

  3. Laden Sie die YAML-Konfigurationsdatei für das Ingress-Gateway aus der anthos-service-mesh-packages-Repository.

  4. Wenden Sie die YAML-Beispielkonfiguration für das Ingress-Gateway unverändert an oder ändern Sie sie als erforderlich.

    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
    

Best Practices für Gateways

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.

  1. 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
    
  2. Aktivieren Sie die automatische Sidecar-Injektion (automatische Injektion). Der erforderliche Befehl hängt davon ab, ob Sie Standard-Injection-Labels (z. B. istio-injection=enabled) oder dasselbe Überarbeitungslabel, 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
    
  3. Stellen Sie die Beispielanwendung im Cluster bereit:

    1. 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
      
    2. 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
      
    3. 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.

  1. Stellen Sie Gateway und VirtualService für den Frontend-Dienst bereit

    kubectl 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
    
  2. 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.

  3. 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.

  1. Rufen Sie in der Google Cloud Console Cloud Service Mesh auf.

    Cloud Service Mesh aufrufen

  2. Wählen Sie das Google Cloud-Projekt aus der Drop-down-Liste in der Menüleiste aus.

  3. 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 vor dem Aufräumen mehr über gegenseitige TLS-Authentifizierung, siehe Cloud Service Mesh – Beispiel: mTLS

  • Wenn Sie den Cluster behalten und das Online Boutique-Beispiel entfernen möchten:

    1. 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
      
    2. 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:

    1. Führen Sie dazu diesen Befehl aus:

      gcloud container clusters delete CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION
      
    2. 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