Esegui la migrazione da Istio 1.11 o versioni successive a Cloud Service Mesh

Questo tutorial mostra come eseguire la migrazione di un'applicazione da un cluster Google Kubernetes Engine (GKE) che utilizza Istio a un nuovo cluster che utilizza Cloud Service Mesh gestito, mesh di servizi completamente gestito e conforme a Istio di Google.

In questo tutorial:

  1. Crea un nuovo cluster Google Kubernetes Engine e installa Istio e il gateway in entrata Istio sul cluster. Questo cluster fungerà da cluster esistente da cui vuoi eseguire la migrazione.
  2. Esegui il deployment dell'applicazione di esempio Online Boutique nel cluster con Istio.
  3. Crea un altro cluster Google Kubernetes Engine nello stesso progetto Google Cloud .
  4. Attiva Cloud Service Mesh gestito sul secondo cluster e distribuisci il gateway in entrata di Cloud Service Mesh.
  5. Esegui il deployment di Online Boutique sul cluster con Cloud Service Mesh per replicare il deployment dal cluster con Istio.
  6. Shift il 50% del traffico utente dal cluster con Istio al cluster con Cloud Service Mesh utilizzando le funzionalità di suddivisione del traffico di Istio sul cluster con Istio.
  7. Completa la migrazione da Istio a Cloud Service Mesh indirizzando la voce del sistema dei nomi di dominio (DNS) del cluster con Istio al cluster con Cloud Service Mesh.

Il traffico utente è suddiviso al 50% tra un cluster con Istio e un cluster con
Cloud Service Mesh. Ogni cluster contiene il proprio deployment di Online
Boutique.

Deployment canary

Il "canary deployment" è una tecnica utilizzata nello sviluppo di software per testare una nuova versione di un software prima di rilasciarla a tutti gli utenti. Consiste nell'aumentare in modo incrementale la percentuale di traffico inviato alla nuova versione. In questo tutorial configurerai un nuovo cluster con Cloud Service Mesh gestito e sposterai gradualmente il traffico degli utenti. Inizierai indirizzando lo 0% del traffico utenti al nuovo cluster, poi il 50% e infine il 100%. In produzione, dovresti utilizzare incrementi più piccoli e più numerosi. Se in qualsiasi momento noti che il nuovo cluster non è in grado di gestire una percentuale di traffico, puoi eseguire il rollback riducendo la percentuale allo 0%.

Control plane canary e cluster canary

Esistono due strategie comunemente utilizzate per le migrazioni da Istio a Cloud Service Mesh gestito:

  • Migrazione del control plane canary: in questa strategia, esegui il provisioning di Service Mesh gestito su Cloud nello stesso cluster in cui è installato Istio.
  • Migrazione del cluster canary: in questa strategia, crei un nuovo cluster e poi esegui il provisioning di Cloud Service Mesh gestito.

In questo tutorial, esamineremo la strategia di migrazione del cluster canary.

Costi

Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:

Al termine di questo tutorial, puoi evitare costi continui eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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 required 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 required APIs.

    Enable the APIs

  8. Avvia Cloud Shell

    In questo tutorial utilizzerai Cloud Shell, un ambiente shell ospitato su Google Cloud che ti consente di gestire le tue risorseGoogle Cloud .

    Cloud Shell include gli strumenti a riga di comando Google Cloud CLI, kubectl e istioctl preinstallati. gcloud CLI fornisce l'interfaccia a riga di comando principale per Google Cloud.

    Apri una sessione di Cloud Shell dall'angolo in alto a destra di questa pagina, fai clic su e poi su Conferma. Una sessione di Cloud Shell si apre in un frame nella parte inferiore della pagina. Completa i seguenti comandi in quella sessione di Cloud Shell.

    Scarica il codice campione.

    Clona i repository Git contenenti le risorse Kubernetes e Istio che utilizzerai:

      git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
      git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
    

    Configura il cluster con Istio

    Crea il cluster e installa Istio

    In questa sezione crei il cluster che utilizza Istio. In pratica, si tratta dei cluster che stai già utilizzando.

    1. Sostituisci PROJECT_ID con il tuo ID progetto e crea un nuovo cluster:

      gcloud container clusters create cluster-with-istio \
        --project=PROJECT_ID \
        --zone=us-central1-a \
        --machine-type=e2-standard-2 --num-nodes=3
      
    2. Rinomina il contesto del cluster in modo che sia più facile da utilizzare:

      kubectl config rename-context \
        gke_PROJECT_ID_us-central1-a_cluster-with-istio \
        cluster-with-istio
      
    3. Verifica che il contesto del cluster sia stato rinominato:

      kubectl config get-contexts --output="name"
      
    4. Installa Istio sul cluster. Per semplicità, installerai il profilo predefinito di Istio e la versione corrispondente all'installazione di istioctl.

      istioctl install
      

      Ti verrà chiesto di digitare "y" e poi premere Invio.

      L'output è simile al seguente:

      This will install the Istio X.Y.Z default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N)
      ✔ Istio core installed
      ✔ Istiod installed
      ✔ Ingress gateways installed
      ✔ Installation complete
      Making this installation the default for injection and validation.
      

    Esegui il deployment di Online Boutique

    1. Eseguirai il deployment di Online Boutique in uno spazio dei nomi separato chiamato onlineboutique. Crea lo spazio dei nomi:

      kubectl \
        --context cluster-with-istio \
        create namespace onlineboutique
      
    2. Esegui il deployment dei 12 servizi di Online Boutique, incluso un generatore di carico che imita il traffico degli utenti:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        apply -f microservices-demo/release/kubernetes-manifests.yaml
      
    3. Il passaggio precedente ha anche eseguito il deployment di un servizio chiamato frontend-external (di tipo LoadBalancer) a cui viene assegnato un indirizzo IP esterno. Tuttavia, vuoi consentire l'ingresso pubblico solo tramite il deployment del gateway in entrata Istio. Elimina la risorsa di servizio frontend-external:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        delete service frontend-external
      
    4. Esegui il deployment di una risorsa Istio Gateway e di una risorsa Istio VirtualService per consentire al traffico pubblico di accedere a Online Boutique:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
      
    5. Ottieni l'indirizzo IP esterno del gateway in entrata Istio:

      kubectl \
        --namespace istio-system \
        --context=cluster-with-istio \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    6. Copia l'indirizzo IP esterno del servizio istio-ingressgateway e poi accedi tramite il browser web. Vedrai l'app di esempio Online Boutique.

    Configura il nuovo cluster con Cloud Service Mesh gestito

    Crea il cluster ed esegui il provisioning di Service Mesh gestito

    In questa sezione, crei il cluster a cui eseguire la migrazione. Eseguirai il provisioning di Cloud Service Mesh gestito ed eseguirai il deployment di Online Boutique per replicare i deployment dal cluster che utilizza Istio.

    1. Crea un nuovo cluster:

      gcloud container clusters create cluster-with-csm \
        --project=PROJECT_ID --zone=us-central1-a \
        --machine-type=e2-standard-4 --num-nodes=2 \
        --workload-pool PROJECT_ID.svc.id.goog
      
    2. Rinomina il contesto del cluster in modo che sia più facile da utilizzare:

      kubectl config rename-context \
        gke_PROJECT_ID_us-central1-a_cluster-with-csm \
        cluster-with-csm
      
    3. Verifica che il contesto del cluster sia stato rinominato:

      kubectl config get-contexts --output="name"
      
    4. Abilita Cloud Service Mesh nel parco risorse del tuo progetto. Un parco risorse è un raggruppamento logico di cluster Kubernetes e altre risorse che possono essere gestiti insieme.

      gcloud container fleet mesh enable --project PROJECT_ID
      

      L'output è simile al seguente:

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

      gcloud container fleet memberships register cluster-with-csm-membership \
        --gke-cluster=us-central1-a/cluster-with-csm \
        --enable-workload-identity \
        --project PROJECT_ID
      

      L'output è simile al seguente:

      Waiting for membership to be created...done.
      Finished registering to the Fleet.
      
    6. Abilita Cloud Service Mesh gestito sul cluster:

      gcloud container fleet mesh update \
        --management automatic \
        --memberships cluster-with-csm-membership \
        --project PROJECT_ID
      

      L'output è simile al seguente:

      Waiting for Feature Service Mesh to be updated...done.
      
    7. Verifica che Cloud Service Mesh gestito sia stato sottoposto al provisioning per il cluster e sia pronto per l'uso:

      gcloud container fleet mesh describe --project PROJECT_ID
      

      Potrebbero essere necessari circa 10 minuti prima che Cloud Service Mesh venga sottoposto al provisioning e sia pronto per l'uso sul cluster. Se vedi controlPlaneManagement.state: DISABLED o controlPlaneManagement.state: PROVISIONING, dovrai eseguire di nuovo il comando precedente a intervalli di pochi minuti finché non vedi controlPlaneManagement.state: ACTIVE.

      L'output è simile al seguente:

      createTime: '2022-07-06T01:05:39.110120474Z'
      membershipSpecs:
        projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/123456789123/locations/global/memberships/cluster-with-csm-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'
      

    Esegui il deployment del gateway in entrata di Cloud Service Mesh

    1. Eseguirai il deployment del gateway in entrata di Cloud Service Mesh in uno spazio dei nomi separato denominato asm-ingress. Crea lo spazio dei nomi:

      kubectl \
        --context cluster-with-csm \
        create namespace asm-ingress
      
    2. Utilizza l'etichetta istio.io/rev=asm-managed per aggiungere lo spazio dei nomi asm-ingress almesh di servizih e attivare l'inserimento automatico del proxy sidecar.

      kubectl \
        --context cluster-with-csm \
        label namespace asm-ingress 'istio.io/rev=asm-managed'
      
    3. Esegui il deployment del gateway in entrata di Cloud Service Mesh:

      kubectl \
        --context cluster-with-csm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
      kubectl \
        --context cluster-with-csm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
      

      L'output è simile al seguente:

      namespace/asm-ingress configured
      serviceaccount/asm-ingressgateway configured
      service/asm-ingressgateway configured
      deployment.apps/asm-ingressgateway configured
      gateway.networking.istio.io/asm-ingressgateway configured
      

    Esegui il deployment di Online Boutique

    1. Eseguirai il deployment di Online Boutique in uno spazio dei nomi separato chiamato onlineboutique. Crea lo spazio dei nomi:

      kubectl \
        --context cluster-with-csm \
        create namespace onlineboutique
      
    2. Utilizza l'etichetta istio.io/rev=asm-managed per aggiungere lo spazio dei nomi onlineboutique al mesh di servizi e attivare l'inserimento automatico del proxy sidecar.

      kubectl \
        --context cluster-with-csm \
        label namespace onlineboutique 'istio.io/rev=asm-managed'
      
    3. Esegui il deployment dei 12 servizi di Online Boutique, incluso il generatore di carico che imita il traffico degli utenti:

      kubectl \
        --context cluster-with-csm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
      kubectl \
        --context cluster-with-csm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
      
    4. Recupera l'indirizzo IP esterno del gateway in entrata Cloud Service Mesh:

      kubectl \
        --context cluster-with-csm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    5. Copia l'indirizzo IP esterno del servizio asm-ingressgateway e accedi tramite il browser web. Verrà visualizzata l'app di esempio Online Boutique. Utilizzerai l'indirizzo IP esterno nella sezione successiva, quindi copialo in una variabile di ambiente:

      export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \
        kubectl \
          --context cluster-with-csm \
          --namespace asm-ingress \
          get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
        )
      

    Testare il cluster con Cloud Service Mesh utilizzando un deployment canary

    In questa sezione, configuri il cluster con Istio in modo che il 50% del traffico utente verso Online Boutique venga spostato all'istanza di Online Boutique sul cluster con Cloud Service Mesh gestito. Per farlo, devi eseguire il deployment di due risorse Istio nel cluster con Istio:

    • una ServiceEntry per comunicare a Istio l'endpoint Online Boutique del cluster Cloud Service Mesh gestito
    • un VirtualService per indicare al gateway in entrata Istio di dividere il traffico al 50%.
    1. Imposta l'indirizzo IP del gateway in entrata del cluster Cloud Service Mesh gestito all'interno della risorsa ServiceEntry:

      sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
      
    2. Esegui il deployment di ServiceEntry nel cluster con Istio:

      kubectl \
        --context cluster-with-istio \
        --namespace onlineboutique \
        apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
      
    3. Esegui il deployment di VirtualService nel cluster con Istio:

      kubectl \
        --context cluster-with-istio \
        --namespace onlineboutique \
        apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service.yaml
      
    4. Visita l'indirizzo IP del gateway in entrata del cluster con Istio nel browser web:

      kubectl \
        --context cluster-with-istio \
        --namespace istio-system \
        get service
      

      Aggiorna più volte la home page di Online Boutique e controlla il piè di pagina della pagina ogni volta. Tieni presente che il 50% delle richieste viene gestito da un pod sul cluster con Cloud Service Mesh gestito.

    Esegui la migrazione al cluster con Cloud Service Mesh gestito

    Questa sezione presuppone che tu sia proprietario di un nome di dominio e che tu abbia accesso alle relative impostazioni DNS (Domain Name Server).

    1. Aggiungi un record A alle impostazioni DNS per indirizzare il nome di dominio (ad esempio example.com) all'indirizzo IP del gateway in entrata in esecuzione sul cluster con Istio.

    2. Accedi a Online Boutique visitando il nome di dominio nel browser web.

    3. Riduci al minimo la durata (TTL) del record DNS per assicurarti di poter ripristinare rapidamente la voce DNS in caso di rollback.

    4. Imposta il record A del tuo nome di dominio sull'indirizzo IP esterno del gateway in entrata del cluster con Cloud Service Mesh gestito.

    5. Al termine della migrazione, elimina il cluster con Istio:

      gcloud container clusters delete cluster-with-istio \
        --zone=us-central1-a \
        --project=PROJECT_ID
      

    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.

    Elimina progetto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Elimina le risorse

    Elimina il cluster con Cloud Service Mesh gestito:

      gcloud container clusters delete cluster-with-managed-asm \
        --zone=us-central1-a \
        --project=PROJECT_ID
    

    Passaggi successivi