Crea un cluster GKE con Anthos Service Mesh e gcloud CLI

In questo tutorial eseguirai il provisioning di Anthos Service Mesh gestito utilizzando l'API Fleet di Google Kubernetes Engine (GKE) su un nuovo cluster pubblico GKE. Questo tutorial illustra:

  1. È in corso la configurazione del progetto Google Cloud.
  2. Creazione di un cluster GKE con il numero minimo di vCPU richiesto da Anthos Service Mesh.
  3. Registrazione del cluster GKE nel parco risorse del progetto.
  4. Provisioning di Anthos Service Mesh gestito sul cluster utilizzando l'API Fleet.
  5. Deployment di un gateway in entrata per esporre l'applicazione.
  6. Deployment di un'applicazione di esempio in modo da poter visualizzare i dati di telemetria sulle dashboard di Anthos Service Mesh nella console Google Cloud.
  7. Esposizione e accesso all'applicazione di esempio.

API Fleet

Questa guida presuppone che tu conosca i parchi risorse, che sono raggruppamenti logici di cluster GKE e altre risorse che possono essere gestiti insieme. Un parco risorse è un concetto di GKE, non di Kubernetes. La registrazione di un cluster in un parco risorse consente di eseguire il provisioning di Anthos Service Mesh gestito su tale cluster utilizzando il comando gcloud container fleet mesh update. L'utilizzo dei parchi risorse è abilitato dall'API Fleet (gkehub.googleapis.com), che abiliti quando inizi questo tutorial.

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 essere idonei per una prova gratuita.

Al termine di questa guida rapida, puoi evitare di continuare la fatturazione eliminando il cluster. Per ulteriori informazioni, consulta Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API GKE, Fleet (GKE Hub), and Anthos Service Mesh.

    Abilita le API

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

    Go to project selector

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API GKE, Fleet (GKE Hub), and Anthos Service Mesh.

    Abilita le API

  8. Prendi nota dell'ID progetto.

Installa gli strumenti richiesti

Puoi eseguire lo strumento su Cloud Shell o sulla tua macchina locale. Cloud Shell preinstalla tutti gli strumenti necessari.

Cloud Shell

Cloud Shell esegue il provisioning di una macchina virtuale (VM) Compute Engine g1-small che esegue un sistema operativo Linux basato su Debian. I vantaggi dell'utilizzo di Cloud Shell sono:

  • Cloud Shell include gcloud, kubectl, git e gli altri strumenti a riga di comando necessari.

  • La directory $HOME di Cloud Shell ha 5 GB di spazio di archiviazione permanente.

  • Puoi scegliere gli editor di testo:

    • Editor di codice, a cui puoi accedere facendo clic su nella parte superiore della finestra di Cloud Shell.

    • Emacs, Vim o Nano, a cui accedi dalla riga di comando in Cloud Shell.

Nella console Google Cloud, attiva Cloud Shell.

Attiva Cloud Shell

Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

Computer locale

  1. Assicurati di avere installato i seguenti strumenti:

  2. Esegui l'autenticazione con Google Cloud CLI:

    gcloud auth login --project PROJECT_ID
    
  3. Aggiorna i componenti:

    gcloud components update
    

crea un cluster GKE

  1. Esegui questo comando per creare il cluster con il numero minimo di vCPU richieste da Anthos Service Mesh. Nel comando, sostituisci i segnaposto con le seguenti informazioni:

    • CLUSTER_NAME: il nome del tuo cluster. Il nome può contenere solo caratteri alfanumerici minuscoli e -, deve iniziare con una lettera, terminare con un carattere alfanumerico e non deve superare i 40 caratteri.
    • PROJECT_ID: l'ID progetto in cui verrà creato il cluster.
    • CLUSTER_LOCATION: la zona per il cluster, ad esempio us-central1-a.
    • PROJECT_NUMBER: il numero del progetto a cui appartiene il parco risorse. In questo tutorial, il tuo parco risorse e il tuo cluster risiederanno nello stesso progetto. Puoi controllare il numero del progetto eseguendo gcloud projects list --filter=PROJECT_ID --format="value(PROJECT_NUMBER)".
    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 \
        --labels="mesh_id=proj-PROJECT_NUMBER"
    

    La creazione del cluster richiede diversi minuti. Durante la creazione del cluster, il comando gcloud mostra quanto segue:

    Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
    

    L'output previsto una volta creata correttamente è simile al seguente:

    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. Ottieni credenziali di autenticazione per interagire con il cluster.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION
    

    Output previsto:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. Imposta il contesto attuale per kubectl nel cluster.

    kubectl config set-context CLUSTER_NAME
    

    Output previsto:

    Context "CLUSTER_NAME" created.
    

Esegui il provisioning di Anthos Service Mesh

Se non chiudi questa pagina da quando hai creato il cluster, i segnaposto hanno i valori che hai inserito per il comando gcloud container clusters create.

  1. Abilita Anthos Service Mesh sul parco risorse del tuo progetto.

    gcloud container fleet mesh enable --project PROJECT_ID
    

    L'output è simile a questo:

    Waiting for Feature Service Mesh to be created...done.
    
  2. Registra il cluster nel parco risorse del progetto:

    gcloud container fleet memberships register CLUSTER_NAME-membership \
      --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \
      --enable-workload-identity \
      --project PROJECT_ID
    

    L'output è simile a questo:

     Waiting for membership to be created...done.
     Finished registering to the Fleet.
    
  3. Esegui il provisioning di Anthos Service Mesh gestito sul cluster utilizzando l'API Fleet:

    gcloud container fleet mesh update \
      --management automatic \
      --memberships CLUSTER_NAME-membership \
      --project PROJECT_ID
    

    L'output è simile a questo:

    Waiting for Feature Service Mesh to be updated...done.
    
  4. Verifica che Anthos Service Mesh gestito sia stato abilitato per il cluster e che sia pronto per l'uso:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Il provisioning di Anthos Service Mesh e l'utilizzo nel cluster possono richiedere circa 10 minuti. Se visualizzi controlPlaneManagement.state: DISABLED o controlPlaneManagement.state: PROVISIONING, dovrai eseguire di nuovo il comando precedente a intervalli di pochi minuti finché non viene visualizzato controlPlaneManagement.state: ACTIVE.

    L'output è simile a questo:

    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'
    

Scarica il codice campione

Clona il repository Git che contiene il codice di esempio utilizzato in questo tutorial:

   git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git

Le sezioni successive di questo tutorial utilizzano una variabile DIR_PATH. Imposta questa variabile sul percorso del repository anthos-service-mesh-packages che hai clonato (ad esempio, ./anthos-service-mesh-packages).

Esegui il deployment di un gateway in entrata

Anthos Service Mesh ti offre la possibilità di eseguire il deployment e gestire gateway come parte del tuo mesh di servizi. Un gateway descrive un bilanciatore del carico che opera sul perimetro della rete mesh che riceve connessioni HTTP/TCP in entrata o in uscita. I gateway sono proxy Envoy che ti forniscono un controllo granulare sul traffico in entrata e in uscita dal mesh.

  1. Crea uno spazio dei nomi per il gateway in entrata, se non ne hai già uno. I gateway sono carichi di lavoro degli utenti e, come best practice, non deve essere eseguito il deployment nello spazio dei nomi del piano di controllo. Sostituisci GATEWAY_NAMESPACE con il nome del tuo spazio dei nomi.

    kubectl create namespace GATEWAY_NAMESPACE
    

    Output previsto:

    namespace/GATEWAY_NAMESPACE created
    
  2. Attiva l'inserimento automatico sul gateway. I passaggi richiesti variano a seconda che tu voglia utilizzare le etichette di inserimento predefinite (ad esempio istio-injection=enabled) o l'etichetta di revisione nello spazio dei nomi del gateway. Il tag di revisione e l'etichetta di revisione predefiniti vengono utilizzati dal webhook dell'iniettore sidecar per associare i proxy inseriti a una determinata revisione del piano di controllo.

    Etichette di iniezione predefinite

    Applica le etichette di inserimento predefinite allo spazio dei nomi.

    kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
    

    Etichetta revisione

    1. Utilizza il seguente comando per individuare l'etichetta di revisione su istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
        "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
      

      Il comando restituisce l'etichetta di revisione che corrisponde alla versione di Anthos Service Mesh, ad esempio: asm-1157-23

    2. Applica l'etichetta di revisione allo spazio dei nomi. Nel comando seguente, REVISION è il valore dell'etichetta di revisione istiod che hai annotato nel passaggio precedente.

      kubectl label namespace GATEWAY_NAMESPACE \
        istio.io/rev=REVISION --overwrite
      

      Output previsto:

      namespace/GATEWAY_NAMESPACE labeled
      

    Puoi ignorare il messaggio "istio.io/rev" not found nell'output. Ciò significa che lo spazio dei nomi non aveva in precedenza l'etichetta istio.io/rev, cosa che dovresti aspettarti nelle nuove installazioni di Anthos Service Mesh o nei nuovi deployment. Poiché l'inserimento automatico non riesce se uno spazio dei nomi include sia l'etichetta istio.io/rev che l'etichetta istio-injection, tutti i comandi kubectl label nella documentazione di Anthos Service Mesh specificano esplicitamente entrambe le etichette.

    Se lo spazio dei nomi del gateway non è etichettato, i pod istio-ingressgateway non riusciranno e restituirà un errore ImagePullBackOff quando il gateway tenterà di eseguire il pull e l'immagine auto. Questa immagine deve essere sostituita dal webhook.

  3. Scarica il file di configurazione .yaml del gateway in entrata di esempio dal repository anthos-service-mesh-packages.

  4. Applica la configurazione .yaml del gateway in entrata di esempio così com'è o apporta le modifiche necessarie.

    kubectl apply -n GATEWAY_NAMESPACE \
      -f CONFIG_PATH/istio-ingressgateway
    

    Output previsto:

    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
    

Scopri di più sulle best practice per i gateway.

Esegui il deployment dell'esempio di Boutique online

L'applicazione di esempio Online Boutique nel repository anthos-service-mesh-packages viene modificata rispetto all'insieme originale di manifest nel repository microservices-demo. Seguendo le best practice, il deployment di ogni servizio viene eseguito in uno spazio dei nomi separato con un account di servizio univoco.

  1. Crea gli spazi dei nomi per l'applicazione:

    kubectl apply -f \
      DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
    

    Output previsto:

    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. Attiva l'iniezione automatica del sidecar (inserimento automatica). Il comando richiesto dipende se vuoi utilizzare etichette di inserimento predefinite (ad esempio, istio-injection=enabled) o la stessa etichetta di revisione che hai utilizzato per annotare lo spazio dei nomi del gateway in entrata

    Etichette di iniezione predefinite

    Applica le etichette di inserimento predefinite allo spazio dei nomi. Nel seguente comando, GATEWAY_NAMESPACE è lo stesso valore che hai utilizzato per annotare lo spazio dei nomi del gateway in entrata.

    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;
    

    Output previsto:

    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
    

    Etichetta revisione

    Applica l'etichetta di revisione agli spazi dei nomi dell'applicazione. Nel comando seguente, REVISION è lo stesso valore utilizzato per annotare lo spazio dei nomi del gateway in entrata.

    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;
    

    Output previsto:

    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. Eseguire il deployment dell'applicazione di esempio nel cluster.

    1. Crea gli account di servizio e i deployment:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
      

      Output previsto:

      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. Crea i servizi:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/services
      

      Output previsto:

      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. Crea le voci di servizio:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
      

      Output previsto:

      serviceentry.networking.istio.io/allow-egress-googleapis created
      serviceentry.networking.istio.io/allow-egress-google-metadata created
      

Esposizione e accesso all'applicazione

Esistono diversi modi per esporre l'applicazione. In questa guida, utilizzeremo il gateway in entrata di cui abbiamo eseguito il deployment. Per altri modi per esporre l'applicazione Online Boutique, consulta la sezione Esposizione e accesso all'applicazione nella guida Deployment dell'applicazione di esempio Online Boutique.

  1. Esegui il deployment di Gateway e VirtualService per il servizio di frontend

    kubectl apply -f \
        DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
    

    Output previsto:

    gateway.networking.istio.io/frontend-gateway created
    virtualservice.networking.istio.io/frontend-ingress created
    
  2. Recupera l'indirizzo IP esterno del gateway in entrata e sostituisci i segnaposto con le seguenti informazioni:

    • GATEWAY_SERVICE_NAME: il nome del servizio gateway in entrata. Se hai eseguito il deployment del gateway di esempio senza modifiche, sarebbe istio-ingressgateway.
    • GATEWAY_NAMESPACE: lo spazio dei nomi in cui hai eseguito il deployment del gateway in entrata:
    kubectl get service GATEWAY_SERVICE_NAME \
        -n GATEWAY_NAMESPACE
    

    L'output è simile a questo:

    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 questo esempio, l'indirizzo IP del gateway in entrata è 35.239.7.64.

  3. Visita l'applicazione sul tuo browser per confermare l'installazione:

    http://EXTERNAL_IP/
    

Visualizza le dashboard del mesh di servizi

Dopo aver eseguito il deployment dei carichi di lavoro nel tuo cluster con i proxy sidecar inseriti, puoi esplorare le pagine Anthos Service Mesh nella console Google Cloud per vedere tutte le funzionalità di osservabilità offerte da Anthos Service Mesh. Tieni presente che sono necessari circa uno o due minuti per la visualizzazione dei dati di telemetria nella console Google Cloud dopo il deployment dei carichi di lavoro.

L'accesso ad Anthos Service Mesh nella console Google Cloud è controllato da Identity and Access Management (IAM). Per accedere alle pagine di Anthos Service Mesh, un Proprietario progetto deve concedere agli utenti il ruolo Editor di progetto o Visualizzatore oppure i ruoli più restrittivi descritti in Controllare l'accesso ad Anthos Service Mesh nella console Google Cloud.

  1. Nella console Google Cloud, vai ad Anthos Service Mesh.

    Vai ad Anthos Service Mesh

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

  3. Se disponi di più mesh di servizi, selezionalo dall'elenco a discesa Mesh di servizi.

Per scoprire di più, consulta Esplorazione di Anthos Service Mesh nella console Google Cloud.

Esegui la pulizia

Prima di ripulire, se ti interessa saperne di più sulla TLS reciproca, vedi Anthos Service Mesh con l'esempio: mTLS.

  • Se vuoi mantenere il cluster e rimuovere l'esempio di Boutique online:

    1. Elimina gli spazi dei nomi dell'applicazione:

      kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
      

      Output previsto:

      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. Elimina le voci di servizio:

      kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
      

      Output previsto:

      serviceentry.networking.istio.io "allow-egress-googleapis" deleted
      serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
      
  • Per evitare addebiti aggiuntivi, elimina il cluster:

    1. Esegui questo comando:

      gcloud container clusters delete CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION
      
    2. Al prompt Vuoi continuare (Y/n)?, inserisci y.

      Dopo qualche minuto, viene visualizzato il seguente output:

      Deleting cluster CLUSTER_NAME...done.
      Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
      

Passaggi successivi