Esegui la migrazione del control plane in-cluster a quello gestito su un nuovo cluster

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

In questo tutorial:

  1. Crea un nuovo cluster Google Kubernetes Engine e installa Cloud Service Mesh in-cluster e il gateway in entrata di Cloud Service Mesh 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 Cloud Service Mesh in-cluster.
  3. Crea un altro cluster Google Kubernetes Engine nello stesso Google Cloud progetto.
  4. Esegui il provisioning di Cloud Service Mesh gestito sul secondo cluster ed esegui il deployment del gateway in entrata di Cloud Service Mesh.
  5. Esegui il deployment di Online Boutique nel cluster con Cloud Service Mesh gestito per replicare il deployment dal cluster con Cloud Service Mesh in-cluster.
  6. Shift il 50% del traffico utente dal cluster con Cloud Service Mesh in-cluster al cluster con Cloud Service Mesh gestito utilizzando le funzionalità di suddivisione del traffico di Istio nel cluster con Cloud Service Mesh in-cluster.
  7. Completa la migrazione da Cloud Service Mesh in-cluster a Cloud Service Mesh gestito puntando la voce DNS (Domain Name System) del cluster con Cloud Service Mesh in-cluster al cluster con Cloud Service Mesh gestito.

Il traffico utente è suddiviso al 50% tra un cluster con Cloud Service Mesh in-cluster e un cluster con Cloud Service Mesh gestito. Ogni cluster contiene la propria implementazione di Online Boutique.

Deployment canary

Il "deployment canary" è una tecnica utilizzata nello sviluppo software per testare una nuova versione di un software prima di rilasciarla a tutti gli utenti. Comporta l'aumento incrementale della percentuale di traffico inviato alla nuova versione. In questo tutorial, configurerai un nuovo cluster con Cloud Service Mesh gestito e sposterai gradualmente il traffico utente. Inizierai indirizzando lo 0% del traffico utente al nuovo cluster, poi il 50% e, infine, il 100%. In produzione, devi utilizzare incrementi più piccoli e maggiori. 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 rispetto al cluster canary

Esistono due strategie di uso comune per le migrazioni da Cloud Service Mesh in-cluster a Cloud Service Mesh gestito:

  • Migrazione del cluster canary: in questa strategia, crei un nuovo cluster e poi esegui il provisioning di Cloud Service Mesh gestito.
  • Migrazione del control plane canary: in questa strategia, esegui il provisioning di Cloud Service Mesh gestito nello stesso cluster in cui è installato Cloud Service Mesh in-cluster. Questo non è un percorso di migrazione supportato con Cloud Service Mesh.

In questo tutorial, esaminerai 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 l'addebito di costi ricorrenti eliminando le risorse create. Per ulteriori informazioni, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. Se non hai mai utilizzato Google Cloud, crea un account per valutare il rendimento dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per eseguire, testare ed eseguire il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Avvia Cloud Shell

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

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 Riconosci. Una sessione di Cloud Shell si apre in un frame nella parte inferiore della pagina. Completa i seguenti comandi in questa sessione di Cloud Shell session.

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 Cloud Service Mesh in-cluster

Crea il cluster e installa Cloud Service Mesh in-cluster

In questa sezione, crei il cluster che utilizza Cloud Service Mesh in-cluster. In pratica, si tratta dei cluster che stai già utilizzando.

  1. Sostituisci PROJECT_ID con l' ID progetto e crea un nuovo cluster:

    gcloud container clusters create cluster-with-in-cluster-asm \
      --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 lavorare con il cluster:

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

    kubectl config get-contexts --output="name"
    
  4. Scarica la versione che installa Cloud Service Mesh 1.23.6 nella directory di lavoro attuale:

    curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.23 > asmcli
    

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

    L'output è simile al seguente:

    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
    100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
    
  5. Rendi eseguibile lo script asmcli:

    chmod +x asmcli
    
  6. Installa Cloud Service Mesh in-cluster utilizzando asmcli:

    ./asmcli install \
      --project_id PROJECT_ID \
      --cluster_name cluster-with-in-cluster-asm \
      --cluster_location us-central1-a \
      --output_dir . \
      --enable_all \
      --ca mesh_ca
    

    Il completamento dello strumento asmcli può richiedere diversi minuti. Lo strumento genera messaggi informativi per consentirti di monitorare l'avanzamento.

    In caso di esito positivo, l'output è simile al seguente:

    ...
    asmcli: Successfully installed ASM.
    

Esegui il deployment del gateway in entrata di Cloud Service Mesh

  1. Esegui 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-in-cluster-asm \
      create namespace asm-ingress
    
  2. Utilizza l'etichetta istio.io/rev=asm-1236-11 per aggiungere lo spazio dei nomi asm-ingress al mesh di servizi e abilitare l'inserimento automatico del proxy sidecar.

    kubectl \
      --context cluster-with-in-cluster-asm \
      label --overwrite namespace asm-ingress istio.io/rev=asm-1236-11
    

    L'output è simile al seguente:

    namespace/asm-ingress labeled
    
  3. Esegui il deployment del gateway in entrata di Cloud Service Mesh :

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

    L'output è simile al seguente:

    serviceaccount/asm-ingressgateway created
    service/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    gateway.networking.istio.io/asm-ingressgateway created
    

Esegui il deployment di Online Boutique

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

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

    kubectl \
      --context cluster-with-in-cluster-asm \
      label --overwrite namespace onlineboutique istio.io/rev=asm-1236-11
    

    L'output è simile al seguente:

    namespace/onlineboutique labeled
    
  3. Esegui il deployment dei 12 servizi di Online Boutique, incluso il generatore di carico che imita il traffico utente:

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

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace asm-ingress \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  5. Copia l'indirizzo IP esterno del gateway in entrata e accedi tramite il browser web. Verrà visualizzata l'app di esempio Online Boutique.

Configura il nuovo cluster con Cloud Service Mesh gestito

Crea il cluster ed esegui il provisioning di Cloud Service Mesh gestito

In questa sezione, crei il cluster di cui eseguirai la migrazione. Esegui il provisioning di Cloud Service Mesh gestito ed esegui il deployment di Online Boutique per replicare i deployment dal cluster che utilizza Cloud Service Mesh in-cluster.

  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 lavorare con il cluster:

    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 progetto. Un parco risorse è un raggruppamento logico di cluster Kubernetes e altre risorse che possono essere gestite 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 sia stato eseguito il provisioning di Cloud Service Mesh gestito per il cluster e che sia pronto per l'uso:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Il provisioning e la preparazione all'uso di Cloud Service Mesh sul cluster possono richiedere circa 10 minuti. Se vedi controlPlaneManagement.state: DISABLED o controlPlaneManagement.state: PROVISIONING, dovrai eseguire di nuovo il comando precedente ogni 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. Esegui 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 al mesh di servizi e abilitare 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. Esegui il deployment di Online Boutique in uno spazio dei nomi separato denominato 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 abilitare 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 utente:

    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. Ottieni l'indirizzo IP esterno del gateway in entrata di 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}' \
      )
    

Testa il cluster con Cloud Service Mesh utilizzando un deployment canary

In questa sezione, configuri il cluster con Cloud Service Mesh in-cluster 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, esegui il deployment di due risorse Istio nel cluster con Cloud Service Mesh in-cluster:

  • Un ServiceEntry per comunicare a Cloud Service Mesh in-cluster l'endpoint di Online Boutique del cluster Cloud Service Mesh gestito.
  • Un VirtualService per indicare al gateway in entrata di Cloud Service Mesh in-cluster di suddividere il traffico 50-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 Cloud Service Mesh in-cluster:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --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 Cloud Service Mesh in-cluster:

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

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace asm-ingress \
      get service
    

    Aggiorna più volte la home page di Online Boutique e controlla il piè di 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 impostazioni DNS (Domain Name Server).

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

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

  3. Riduci al minimo il durata (TTL) del record DNS per assicurarti di poter ripristinare rapidamente la voce DNS, se necessario.

  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 Cloud Service Mesh in-cluster:

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

Libera spazio

Per evitare addebiti sul tuo Google Cloud account per le risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina progetto

  1. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare e fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.

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