Questo tutorial mostra come eseguire la migrazione di un'applicazione da un cluster Google Kubernetes Engine (GKE) utilizzando Istio a un nuovo cluster utilizzando Anthos Service Mesh gestito, il mesh di servizi completamente gestito e conforme a Istio di Google.
In questo tutorial:
- Crea un nuovo cluster Google Kubernetes Engine e installa Istio e il gateway in entrata Istio nel cluster. Questo cluster fungerà da cluster esistente da cui vuoi eseguire la migrazione.
- Esegui il deployment dell'applicazione di esempio Online Boutique nel cluster con Istio.
- Creare un altro cluster Google Kubernetes Engine, nello stesso progetto Google Cloud.
- Abilita Anthos Service Mesh gestito sul secondo cluster ed esegui il deployment del gateway in entrata Anthos Service Mesh.
- Esegui il deployment di Online Boutique sul cluster con Anthos Service Mesh per replicare il deployment dal cluster con Istio.
- Shift il 50% del traffico degli utenti dal cluster con Istio al cluster con Anthos Service Mesh, utilizzando le capacità di suddivisione del traffico di Istio sul cluster con Istio.
- Completa la migrazione da Istio ad Anthos Service Mesh puntando la voce DNS (Domain Name System) del cluster con Istio al cluster con Anthos Service Mesh.
Deployment canary
Il "deployment canary" è una tecnica utilizzata nello sviluppo del software per testare una nuova versione di un software prima di rilasciarla per tutti gli utenti. Prevede l'aumento incrementale della percentuale di traffico inviato alla nuova versione. In questo tutorial configurerai un nuovo cluster con Anthos Service Mesh gestito e sposterai su di esso in modo incrementale il traffico degli utenti. Inizierai indirizzando lo 0% del traffico degli utenti al nuovo cluster, poi il 50% e, infine, il 100%. In produzione, ti consigliamo di 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%.
Piano di controllo canary e cluster canary
Esistono due strategie di uso comune per le migrazioni da Istio ad Anthos Service Mesh gestito:
- Migrazione del piano di controllo canary: in questa strategia devi eseguire il provisioning di Anthos Service Mesh gestito sullo stesso cluster in cui è attualmente installato Istio.
- Migrazione del cluster canary: in questa strategia devi creare un nuovo cluster e quindi eseguire il provisioning di Anthos Service Mesh gestito.
In questo tutorial, analizzerai la strategia di migrazione dei cluster canary.
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
Al termine di questo tutorial, puoi evitare i costi continui eliminando le risorse che hai creato. Per ulteriori informazioni, consulta Pulizia.
Prima di iniziare
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
Avvia Cloud Shell
In questo tutorial utilizzerai Cloud Shell, un ambiente shell ospitato su Google Cloud che consente di gestire le risorse Google Cloud.
In Cloud Shell sono preinstallati gli strumenti a riga di comando Google Cloud CLI, kubectl e istioctl. gcloud CLI fornisce l'interfaccia a riga di comando principale per Google Cloud.
Apri una sessione di Cloud Shell nell'angolo in alto a destra di questa pagina, fai clic su terminal, quindi su Conferma. Si apre una sessione di Cloud Shell all'interno di un frame più in basso nella pagina. Completa i comandi seguenti nella 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
Nella sezione creerai il cluster che utilizza Istio. In pratica, si tratta dei cluster che stai già utilizzando.
Sostituisci
PROJECT_ID
con l'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
Rinomina il contesto del cluster in modo da semplificarne l'utilizzo:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-istio \ cluster-with-istio
Verifica che il contesto del cluster sia stato rinominato:
kubectl config get-contexts --output="name"
Installa Istio sul cluster. Per semplicità, installerai il profilo predefinito di Istio e la versione corrispondente alla tua installazione di
istioctl
.istioctl install
Ti verrà chiesto di digitare "y" e poi premere Invio.
L'output è simile a questo:
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.
Implementa Boutique online
Eseguirai il deployment di Boutique Online in uno spazio dei nomi separato chiamato
onlineboutique
. Crea lo spazio dei nomi:kubectl \ --context cluster-with-istio \ create namespace onlineboutique
Esegui il deployment dei 12 servizi di Boutique Online, che include 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
Nel passaggio precedente è stato anche eseguito il deployment di un servizio chiamato
frontend-external
(di tipoLoadBalancer
) a cui viene assegnato un indirizzo IP pubblico. Tuttavia, vuoi consentire il traffico pubblico in entrata solo tramite il deployment del gateway in entrata Istio. Elimina la risorsa del serviziofrontend-external
:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ delete service frontend-external
Esegui il deployment di una risorsa
Gateway
Istio e una risorsaVirtualService
Istio per il traffico pubblico al fine di accedere a Online Boutique:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
Recupera l'indirizzo IP pubblico del gateway in entrata Istio:
kubectl \ --namespace istio-system \ --context=cluster-with-istio \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
Copia l'indirizzo IP pubblico del servizio
istio-ingressgateway
, quindi accedi allo stesso tramite il tuo browser web. Vedrai l'app di esempio Boutique online.
Configura il nuovo cluster con Anthos Service Mesh gestito
Crea il cluster ed esegui il provisioning di Anthos Service Mesh gestito
In questa sezione creerai il cluster in cui eseguirai la migrazione. Eseguirai il provisioning di Anthos Service Mesh gestito e il deployment di Online Boutique per replicare i deployment dal cluster che utilizza Istio.
Memorizza il numero del progetto in una variabile di ambiente:
export PROJECT_NUMBER=$(gcloud projects \ describe PROJECT_ID --format='get(projectNumber)')
Crea un nuovo cluster:
gcloud container clusters create cluster-with-managed-asm \ --project=PROJECT_ID --zone=us-central1-a \ --machine-type=e2-standard-4 --num-nodes=2 \ --workload-pool PROJECT_ID.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}
Rinomina il contesto del cluster in modo da semplificarne l'utilizzo:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-managed-asm \ cluster-with-managed-asm
Verifica che il contesto del cluster sia stato rinominato:
kubectl config get-contexts --output="name"
Abilita Anthos Service Mesh sul 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 a questo:
Waiting for Feature Service Mesh to be created...done.
Registra il cluster nel parco risorse del progetto:
gcloud container fleet memberships register cluster-with-managed-asm-membership \ --gke-cluster=us-central1-a/cluster-with-managed-asm \ --enable-workload-identity \ --project PROJECT_ID
L'output è simile a questo:
Waiting for membership to be created...done. Created a new membership [projects/your-project-id/locations/global/memberships/cluster-with-gke-membership] for the cluster [cluster-with-gke-membership] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [cluster-with-gke-membership] in namespace [gke-connect]... Deployed the Connect Agent on cluster [cluster-with-gke-membership] in namespace [gke-connect]. Finished registering the cluster [cluster-with-gke-membership] with the Fleet.
Abilita Anthos Service Mesh gestito sul cluster:
gcloud container fleet mesh update \ --management automatic \ --memberships cluster-with-managed-asm-membership \ --project PROJECT_ID
L'output è simile a questo:
Waiting for Feature Service Mesh to be updated...done.
Verifica che sia stato eseguito il provisioning di Anthos Service Mesh gestito 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
ocontrolPlaneManagement.state: PROVISIONING
, dovrai eseguire di nuovo il comando precedente a intervalli di pochi minuti finché non viene visualizzatocontrolPlaneManagement.state: ACTIVE
.L'output è simile a questo:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/cluster-with-managed-asm-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/cluster-with-managed-asm-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 Anthos Service Mesh
Eseguirai il deployment del gateway in entrata di Anthos Service Mesh in uno spazio dei nomi separato chiamato
asm-ingress
. Crea lo spazio dei nomi:kubectl \ --context cluster-with-managed-asm \ create namespace asm-ingress
Utilizza l'etichetta
istio.io/rev=asm-managed
per aggiungere lo spazio dei nomiasm-ingress
al mesh di servizi e abilitare l'inserimento automatico del proxy sidecar.kubectl \ --context cluster-with-managed-asm \ label namespace asm-ingress 'istio.io/rev=asm-managed'
Esegui il deployment del gateway in entrata di Anthos Service Mesh:
kubectl \ --context cluster-with-managed-asm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml kubectl \ --context cluster-with-managed-asm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
L'output è simile a questo:
namespace/asm-ingress configured serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Implementa Boutique online
Eseguirai il deployment di Boutique Online in uno spazio dei nomi separato chiamato
onlineboutique
. Crea lo spazio dei nomi:kubectl \ --context cluster-with-managed-asm \ create namespace onlineboutique
Utilizza l'etichetta
istio.io/rev=asm-managed
per aggiungere lo spazio dei nomionlineboutique
al mesh di servizi e attivare l'inserimento automatico del proxy sidecar.kubectl \ --context cluster-with-managed-asm \ label namespace onlineboutique 'istio.io/rev=asm-managed'
Esegui il deployment dei 12 servizi di Boutique Online, incluso il generatore di carico che imita il traffico degli utenti:
kubectl \ --context cluster-with-managed-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml kubectl \ --context cluster-with-managed-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
Ottieni l'indirizzo IP pubblico del gateway in entrata di Anthos Service Mesh:
kubectl \ --context cluster-with-managed-asm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
Copia l'indirizzo IP pubblico del servizio
asm-ingressgateway
e accedi tramite il tuo browser web. Vedrai l'app di esempio Online Boutique. Utilizzerai l'indirizzo IP pubblico nella sezione successiva, quindi copialo in una variabile di ambiente:export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \ kubectl \ --context cluster-with-managed-asm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Testa il cluster con Anthos Service Mesh utilizzando un deployment canary
In questa sezione configurerai il cluster con Istio in modo che il 50% del traffico degli utenti verso Online Boutique venga spostato sull'istanza di Boutique online sul cluster con Anthos Service Mesh gestito. Per ottenere questo risultato, esegui il deployment di due risorse Istio nel cluster con Istio:
- una ServiceEntry per indicare a Istio l'endpoint Boutique online del cluster Anthos Service Mesh
- un VirtualService per indicare al gateway in entrata Istio di suddividere il traffico 50-50.
Imposta l'indirizzo IP del gateway in entrata del cluster Anthos 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
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
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
Visita l'indirizzo IP del gateway in entrata del cluster con Istio nel tuo browser web:
kubectl \ --context cluster-with-istio \ --namespace istio-system \ get service
Aggiornare più volte la home page di Boutique online e controllare il piè di pagina della pagina ogni volta. Nota che il 50% delle richieste è gestito da un pod nel cluster con Anthos Service Mesh gestito.
Esegui la migrazione al cluster con Anthos Service Mesh gestito
Questa sezione presuppone che tu possieda un nome di dominio e abbia accesso alle relative impostazioni DNS (server dei nomi di dominio).
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.
Accedi a Online Boutique visitando il nome di dominio nel tuo browser web.
Riduci al minimo la durata (TTL) dei record DNS per assicurarti di poter ripristinare rapidamente la voce DNS se devi eseguire il rollback.
Imposta il record A del tuo nome di dominio sull'indirizzo IP pubblico del gateway in entrata del cluster con Anthos Service Mesh gestito.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina le risorse
Elimina il cluster con Anthos Service Mesh gestito:
gcloud container clusters delete cluster-with-managed-asm \
--zone=us-central1-a \
--project=PROJECT_ID
Passaggi successivi
- Scopri di più su Anthos Service Mesh gestito.
- Scopri di più sulle best practice per la sicurezza di Anthos Service Mesh.