Provision Cloud Service Mesh su un cluster GKE Autopilot


Questa guida descrive come configurare Cloud Service Mesh gestito su un cluster Google Kubernetes Engine (GKE) Autopilot. Cloud Service Mesh è un mesh di servizi completamente gestito basato su Istio.

Questo tutorial mostra come configurare un mesh di servizi pronto per la produzione in esecuzione su un singolo cluster GKE Autopilot con le impostazioni predefinite. Ti consigliamo di consultare anche la guida al provisioning di Cloud Service Mesh completa durante la progettazione dell'ambiente.

Vantaggi dell'esecuzione di Cloud Service Mesh gestito con GKE Autopilot

Quando utilizzi GKE in modalità Autopilot, Google gestisce la configurazione e la gestione del cluster automaticamente. La modalità Autopilot semplifica l'esperienza di gestione di un cluster e ti consente di concentrarti sulle tue applicazioni. Allo stesso modo, Cloud Service Mesh gestito è un mesh di servizi completamente gestito che puoi eseguire il provisioning seguendo alcuni passaggi.

  • Esegui il provisioning di Cloud Service Mesh gestito utilizzando l'API Fleet, senza la necessità di strumenti lato client come istioctl.
  • Cloud Service Mesh inserisce automaticamente i proxy sidecar nei carichi di lavoro senza la necessità di concedere privilegi elevati ai tuoi container.
  • Puoi visualizzare dashboard avanzate per la tua mesh e i tuoi servizi senza alcuna configurazione aggiuntiva e poi utilizzare queste metriche per configurare gli obiettivi del livello di servizio (SLO) e gli avvisi per monitorare l'integrità delle tue applicazioni.
  • L'upgrade del control plane di Cloud Service Mesh gestito viene eseguito automaticamente per garantire che tu riceva le patch e le funzionalità di sicurezza più recenti
  • Il data plane gestito di Cloud Service Mesh esegue automaticamente l'upgrade dei proxy sidecar nei tuoi workload, in modo da non dover riavviare manualmente i servizi quando sono disponibili upgrade del proxy e patch di sicurezza.
  • Cloud Service Mesh è un prodotto supportato e può essere configurato utilizzando le API Istio open source standard. Consulta le funzionalità supportate.

Obiettivi

  • Crea un cluster GKE Autopilot
  • Esegui il provisioning di Cloud Service Mesh gestito utilizzando l'API Fleet
  • Esegui il deployment dei gateway in entrata mesh in uno spazio dei nomi dedicato
  • Deployment di un'applicazione di esempio
  • Configura Cloud Service Mesh per applicare l'autenticazione TLS reciproca (mTLS) rigorosa per la comunicazione da servizio a servizio
  • Visualizza le dashboard di Cloud Service Mesh e verifica che i servizi si connettano con mTLS

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.

Prima di iniziare

Cloud Shell è preinstallato con il software necessario per questo tutorial, tra cui kubectl, gcloud CLI, Helm e Terraform. Se non utilizzi Cloud Shell, devi installare gcloud CLI.

  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. Install the Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  7. Install the Google Cloud CLI.

  8. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  9. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  10. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.admin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    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.
  13. Configura l'ambiente

    Puoi configurare l'ambiente utilizzando gcloud CLI o Terraform.

    gcloud

    1. Imposta le variabili di ambiente:

      PROJECT_ID=PROJECT_ID
      gcloud config set project ${PROJECT_ID}
      
    2. Abilita l'API Mesh:

      gcloud services enable mesh.googleapis.com
      

      L'abilitazione di mesh.googleapis.com abilita le seguenti API:

      API Finalità Può essere disattivato
      meshconfig.googleapis.com Cloud Service Mesh utilizza l'API Mesh Configuration per trasmettere i dati di configurazione dalla mesh a Google Cloud. Inoltre, l'abilitazione dell'API Mesh Configuration ti consente di accedere alle pagine di Cloud Service Mesh nella console Google Cloud e di utilizzare l'autorità di certificazione Cloud Service Mesh. No
      meshca.googleapis.com Relativo all'autorità di certificazione Cloud Service Mesh utilizzata da Cloud Service Mesh gestito. No
      container.googleapis.com Obbligatorio per creare cluster Google Kubernetes Engine (GKE). No
      gkehub.googleapis.com Obbligatorio per gestire la mesh come parco risorse. No
      monitoring.googleapis.com Obbligatorio per acquisire la telemetria per i carichi di lavoro mesh. No
      stackdriver.googleapis.com Obbligatorio per utilizzare la UI dei servizi. No
      opsconfigmonitoring.googleapis.com Obbligatorio per utilizzare l'interfaccia utente dei servizi per i cluster off-Google Cloud. No
      connectgateway.googleapis.com Obbligatorio per consentire al control plane di Cloud Service Mesh gestito di accedere ai carichi di lavoro mesh. Sì*
      trafficdirector.googleapis.com Consente un control plane gestito altamente disponibile e scalabile. Sì*
      networkservices.googleapis.com Consente un control plane gestito altamente disponibile e scalabile. Sì*
      networksecurity.googleapis.com Consente un control plane gestito altamente disponibile e scalabile. Sì*

    Terraform

    gcloud config set project PROJECT_ID
    GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_PROJECT
    

    Crea un cluster GKE

    Creare un cluster GKE in modalità Autopilot.

    gcloud

    1. Crea un cluster registrato come membro di un parco risorse:

      gcloud container clusters create-auto asm-cluster \
          --location="us-central1" \
          --enable-fleet
      
    2. Verifica che il cluster sia registrato nel parco risorse:

      gcloud container fleet memberships list
      

      L'output è simile al seguente:

      NAME: asm-cluster
      EXTERNAL_ID:
      LOCATION: us-central1
      

      Prendi nota del nome dell'appartenenza, in quanto ti servirà per configurare Cloud Service Mesh.

    Terraform

    Per creare un cluster GKE, puoi utilizzare la risorsa google_container_cluster. Imposta il blocco fleet in modo che il cluster venga aggiunto a un parco risorse al momento della creazione.

    resource "google_container_cluster" "cluster" {
      name                = "asm-cluster"
      location            = var.region
      deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters
    
      enable_autopilot = true
      fleet {
        project = data.google_project.project.name
      }
    }
    
    data "google_project" "project" {}
    

    Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

    Esegui il provisioning di Cloud Service Mesh gestito

    Esegui il provisioning di Cloud Service Mesh gestito utilizzando la funzionalità servicemesh nell'appartenenza al parco risorse per il tuo cluster.

    gcloud

    1. Abilita la funzionalità del parco risorse Cloud Service Mesh nel progetto:

      gcloud container fleet mesh enable
      
    2. Abilita la gestione automatica della mesh:

      gcloud container fleet mesh update \
          --management=automatic \
          --memberships=MEMBERSHIP_NAME \
          --location=us-central1
      

      Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza elencato quando hai verificato che il cluster è registrato nel parco risorse.

    Terraform

    Per abilitare l'API mesh, puoi utilizzare la risorsa google_project_service.

    Utilizzi le risorse google_gke_hub_feature e google_gke_hub_feature_membership per configurare Cloud Service Mesh gestito sul tuo cluster.

    resource "google_project_service" "mesh_api" {
      service = "mesh.googleapis.com"
    
      disable_dependent_services = true
    }
    
    resource "google_gke_hub_feature" "feature" {
      name     = "servicemesh"
      location = "global"
    
      depends_on = [
        google_project_service.mesh_api
      ]
    }
    
    resource "google_gke_hub_feature_membership" "feature_member" {
      location   = "global"
      feature    = google_gke_hub_feature.feature.name
      membership = google_container_cluster.cluster.fleet.0.membership
      membership_location = google_container_cluster.cluster.location
      mesh {
        management = "MANAGEMENT_AUTOMATIC"
      }
    }
    

    Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

    Verifica che il control plane sia attivo

    Attendi che controlPlaneManagement.state sia ACTIVE. L'operazione potrebbe richiedere fino a 15 minuti.

    watch -n 30 gcloud container fleet mesh describe
    

    L'output è simile al seguente:

    membershipSpecs:
      projects/746296320118/locations/us-central1/memberships/asm-cluster:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/746296320118/locations/us-central1/memberships/asm-cluster:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: PROVISIONING
              details: Service is provisioning.
            state: PROVISIONING
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
    

    La sezione dataPlaneManagement rimane nello stato PROVISIONING finché non esegui il deployment del gateway in entrata, perché i cluster Autopilot non eseguono il provisioning di alcun nodo finché non esegui il deployment di un workload.

    Esegui il deployment di un gateway in entrata mesh

    In questa sezione, esegui il deployment di un gateway di ingresso mesh per gestire il traffico in entrata per l'applicazione di esempio. Un gateway in entrata è un bilanciatore del carico che opera al limite del mesh, ricevendo connessioni HTTP/TCP in entrata o in uscita.

    Esegui il deployment del gateway in uno spazio dei nomi dedicato ed etichetta il deployment per assicurarti che il gateway possa essere gestito in modo sicuro e aggiornato automaticamente dal control plane di Cloud Service Mesh.

    1. Scarica le credenziali per poter accedere al cluster:

      gcloud container clusters get-credentials asm-cluster --location=us-central1
      
    2. Crea uno spazio dei nomi per il deployment del gateway:

      kubectl create namespace bank-gateways
      
    3. Aggiungi un'etichetta allo spazio dei nomi in modo che il control plane di Cloud Service Mesh inserisca automaticamente la configurazione del gateway nel deployment.

      kubectl label namespace bank-gateways istio-injection=enabled
      
    4. Esegui il deployment del gateway in entrata nello spazio dei nomi:

      Helm

      helm repo add istio https://istio-release.storage.googleapis.com/charts
      helm repo update
      helm install --wait --namespace bank-gateways \
          --set resources.requests.cpu=250m \
          --set resources.requests.memory=512Mi \
          --set resources.requests.ephemeral-storage=1Gi \
          --set resources.limits.cpu=250m \
          --set resources.limits.memory=512Mi \
          --set resources.limits.ephemeral-storage=1Gi \
          istio-ingressgateway istio/gateway
      

      kubectl

      git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages
      kubectl apply -n bank-gateways \
          -f ./anthos-service-mesh-packages/samples/gateways/istio-ingressgateway
      kubectl -n bank-gateways wait "deployment/istio-ingressgateway"  \
          --for=condition=available --timeout=240s
      

      Assicurati di impostare richieste di risorse adeguate quando esegui il deployment in un ambiente di produzione. GKE Autopilot considera solo i valori delle risorse impostati in requests e non in limits. Il progetto Istio pubblica informazioni su prestazioni e scalabilità.

    Esegui il deployment dell'applicazione di esempio

    1. Crea uno spazio dei nomi Kubernetes per il deployment:

      kubectl create namespace bank-sample
      
    2. Aggiungi un'etichetta allo spazio dei nomi in modo che Cloud Service Mesh inserisca automaticamente i proxy sidecar nei pod di esempio:

      kubectl label namespace bank-sample istio-injection=enabled
      
    3. Esegui il deployment dell'applicazione di esempio:

      git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
      kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml
      kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
      
    4. Attendi che l'applicazione sia pronta. L'operazione richiederà diversi minuti.

      watch kubectl -n bank-sample get pods
      

      Quando l'applicazione è pronta, l'output è simile al seguente:

      NAME                                 READY   STATUS    RESTARTS   AGE
      accounts-db-0                        2/2     Running   0          2m16s
      balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
      contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
      frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
      ledger-db-0                          2/2     Running   0          3m6s
      ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
      loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
      transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
      userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
      
    5. Crea risorse Istio Gateway e VirtualService per esporre l'applicazione dietro il gateway Ingress:

      kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
      
    6. Ottieni un link all'applicazione di esempio:

      INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
          -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo "http://$INGRESS_HOST"
      
    7. In un browser, segui il link per aprire l'applicazione di esempio. Accedi con il nome utente e la password predefiniti per visualizzare l'applicazione.

    Applicare mutual TLS

    Assicurati che la modalità TLS reciproca (mTLS) STRICT sia abilitata. Applica un criterio PeerAuthentication predefinito per il mesh nello spazio dei nomi istio-system.

    1. Salva il seguente manifest come mesh-peer-authn.yaml:

      apiVersion: "security.istio.io/v1beta1"
      kind: "PeerAuthentication"
      metadata:
        name: "default"
        namespace: "istio-system"
      spec:
        mtls:
          mode: STRICT
      
    2. Applica il manifest al cluster:

      kubectl apply -f mesh-peer-authn.yaml
      

    Puoi eseguire l'override di questa configurazione creando risorse PeerAuthentication in spazi dei nomi specifici.

    Esplorare le dashboard di Cloud Service Mesh

    1. Nella console Google Cloud , vai a Cloud Service Mesh per visualizzare le dashboard per la mesh:

      Vai a Cloud Service Mesh

    2. Seleziona il progetto dall'elenco a discesa nella barra dei menu.

      Viene visualizzata una tabella di riepilogo con tutti i microservizi nel mesh e una visualizzazione grafica delle connessioni tra i microservizi. Per ogni microservizio, la tabella mostra tre dei "segnali d'oro" della SRE:

      • Traffico - richieste al secondo
      • Tasso di errore: una percentuale
      • Latenza - millisecondi

      Queste metriche si basano sul traffico effettivo gestito dai microservizi. Il traffico di test costante viene inviato automaticamente al servizio frontend da un client loadgenerator implementato come parte dell'applicazione di esempio. Cloud Service Mesh invia automaticamente metriche, log e (facoltativamente) tracce a Google Cloud Observability.

    3. Fai clic sul servizio frontend nella tabella per visualizzare una dashboard di panoramica del servizio. Vengono visualizzate metriche aggiuntive per il servizio e una visualizzazione delle connessioni in entrata e in uscita. Puoi anche creare un obiettivo del livello di servizio (SLO) per il monitoraggio e gli avvisi sul servizio.

    Verifica che mTLS sia abilitato

    Fai clic sul link di sicurezza nel riquadro per visualizzare una panoramica della sicurezza per il servizio frontend. La tabella e la visualizzazione mostrano un'icona lucchetto verde per ciascuna delle connessioni in entrata e in uscita tra i microservizi. Questa icona indica che la connessione utilizza mTLS per l'autenticazione e la crittografia.

    Esegui la pulizia

    Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

    Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial:

    Elimina il progetto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Elimina le singole risorse

    Se hai utilizzato un progetto esistente e non vuoi eliminarlo, elimina le singole risorse.

    gcloud

    1. Elimina l'applicazione di esempio e i gateway:

      kubectl delete namespace bank-sample
      kubectl delete namespace bank-gateways
      
    2. Segui le istruzioni per disinstallare Cloud Service Mesh

    3. Elimina il cluster GKE:

      gcloud container clusters delete --region us-central1 asm-cluster --quiet
      

    Terraform

    Elimina le risorse che hai creato con Terraform:

      terraform destroy
    

    Passaggi successivi