In questo tutorial viene illustrato un caso d'uso comune: l'implementazione di un deployment canary con Cloud Service Mesh utilizzando le API Istio.
Che cos'è un deployment canary?
Un deployment canary indirizza una piccola percentuale di traffico a una nuova versione di un microservice, quindi aumenta gradualmente questa percentuale durante il ritiro della vecchia versione. Se qualcosa va storto durante questa procedura, il traffico può essere riportato alla versione precedente. Con Cloud Service Mesh puoi indirizzare il traffico per assicurarti che i nuovi servizi vengano introdotti in sicurezza.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine di questo tutorial, puoi evitare costi ricorrenti eliminando le risorse che hai creato. Per maggiori informazioni, vedi Pulizia.
Prima di iniziare
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud. Scopri come verificare che la fatturazione sia attivata per il tuo progetto.
Esegui il provisioning di Cloud Service Mesh su un cluster GKE o su un altro cluster Kubernetes supportato.
Clona il repository:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples/docs/canary-service
Esegui il deployment di Online Boutique
Imposta il contesto corrente per
kubectl
sul cluster in cui prevedi di eseguire il deployment di Online Boutique. Il comando dipende dall'eventuale provisioning Cloud Service Mesh su un cluster GKE o su un cluster Kubernetes esterno a GKE:GKE su Google Cloud
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
GKE al di fuori di Google Cloud
kubectl config use-context CLUSTER_NAME
Crea lo spazio dei nomi per l'applicazione di esempio e il gateway in entrata:
kubectl create namespace onlineboutique
Etichetta lo spazio dei nomi
onlineboutique
per inserire automaticamente i proxy Envoy. Segui la procedura descritta in Come attivare l'iniezione automatica di sidecar.Esegui il deployment dell'app di esempio. Per questo tutorial, eseguirai il deployment Boutique online, un'app demo basata su microservizi.
kubectl apply \ -n onlineboutique \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yaml
Aggiungi l'etichetta
version=v1
al deploymentproductcatalog
eseguendo seguente comando:kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \ -n onlineboutique
Visualizza i servizi di cui hai eseguito il deployment:
kubectl get pods -n onlineboutique
Output previsto:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Un
2/2
nella colonnaREADY
indica che un pod è attivo e funzionante con un proxy Envoy iniettato correttamente.Esegui il deployment di
VirtualService
eDestinationRule
per la versione 1 diproductcatalog
:kubectl apply -f destination-vs-v1.yaml -n onlineboutique
Tieni presente che nelle risorse è presente solo
v1
.Visita l'applicazione nel browser utilizzando l'indirizzo IP esterno del gateway di ingresso:
kubectl get services -n GATEWAY_NAMESPACE
La prossima sezione esplora l'UI di Cloud Service Mesh e mostra come visualizzare le tue metriche.
Visualizzare i servizi nella console Google Cloud
Nella console Google Cloud, vai alla pagina Servizi Google Kubernetes Engine (GKE) Enterprise Edition.
Vai ai servizi della versione Google Kubernetes Engine (GKE) Enterprise
Per impostazione predefinita, puoi visualizzare i tuoi servizi nella visualizzazione Elenco.
La panoramica della tabella ti consente di osservare tutti i servizi e le metriche importanti a colpo d'occhio.
In alto a destra, fai clic su Topologia. Qui puoi visualizzare i tuoi servizi e la loro interazione tra loro.
Puoi espandere la sezione Servizi e visualizzare le Richieste al secondo per ciascuno dei tuoi servizi passandoci sopra con il cursore.
Torna alla Visualizzazione tabella.
Nella tabella Servizi, seleziona
productcatalogservice
. In questo modo a una panoramica del servizio.Sul lato sinistro dello schermo, fai clic su Traffico.
Assicurati che il 100% del traffico in entrata su
productcatalogservice
venga indirizzato al servizio di carico di lavoro.
La sezione successiva illustra la creazione della versione 2 del servizio productcatalog
.
Deployment della versione 2 di un servizio
Per questo tutorial,
productcatalogservice-v2
introduce un video da 3 secondi di latenza nelle richieste con il campoEXTRA_LATENCY
. In questo modo viene simulata una regressione nella nuova versione del servizio.Applica questa risorsa allo spazio dei nomi
onlineboutique
.kubectl apply -f productcatalog-v2.yaml -n onlineboutique
Controlla i pod delle applicazioni.
kubectl get pods -n onlineboutique
Risultato previsto:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-8wqfd 2/2 Running 0 25h cartservice-c77f6b866-7jwcr 2/2 Running 0 25h checkoutservice-654c47f4b6-n8c6x 2/2 Running 0 25h currencyservice-59bc889674-l5xw2 2/2 Running 0 25h emailservice-5b9fff7cb8-jjr89 2/2 Running 0 25h frontend-77b88cc7cb-bwtk4 2/2 Running 0 25h loadgenerator-6958f5bc8b-lqmnw 2/2 Running 0 25h paymentservice-68dd9755bb-dckrj 2/2 Running 0 25h productcatalogservice-84f95c95ff-ddhjv 2/2 Running 0 25h productcatalogservice-v2-6df4cf5475-9lwjb 2/2 Running 0 8s recommendationservice-64dc9dfbc8-7s7cx 2/2 Running 0 25h redis-cart-5b569cd47-vw7lw 2/2 Running 0 25h shippingservice-5488d5b6cb-dj5gd 2/2 Running 0 25h
Tieni presente che ora sono elencati due
productcatalogservices
.Usa
DestinationRule
per specificare i sottoinsiemi di un servizio. In questo scenario, esiste un sottoinsieme per la versione 1 e un sottoinsieme separato per la versione 2 diproductcatalogservice
.Prendi nota del campo
labels
. Le versioni diproductcatalogservice
vengono distinte dopo che il traffico è instradato daVirtualService
.Applica il
DestinationRule
:kubectl apply -f destination-v1-v2.yaml -n onlineboutique
Suddividi il traffico tra la versione 1 e la versione 2
Utilizza
VirtualService
per definire una piccola percentuale di traffico da indirizzare alla versione 2 diproductcatalogservice
.Il campo sottoinsieme indica la versione e il campo ponderazione indica la suddivisione percentuale del traffico. Il 75% del traffico va alla versione 1 del catalogo prodotti e il 25% alla versione 2.
Applica i
VirtualService
:kubectl apply -f vs-split-traffic.yaml -n onlineboutique
Se visiti il EXTERNAL_IP
dell'ingress del cluster, dovresti notare che periodicamente il caricamento del frontend è più lento.
Nella sezione successiva, esaminerai la suddivisione del traffico nella console Google Cloud.
Osserva la suddivisione del traffico nella console Google Cloud
Torna alla console Google Cloud e vai alla pagina dei servizi GKE Enterprise. Vai a GKE Enterprise Services
In alto a destra, fai clic su Topologia.
Espandi il carico di lavoro
productcatalogservice
e prendi nota dei deployment diproductcatalogservice
eproductcatalogservice-v2
.Torna alla visualizzazione tabella.
Fai clic su
productcatalogservice
nella tabella Servizi.Torna a Traffico nella barra di navigazione a sinistra.
Tieni presente che il traffico in entrata viene suddiviso tra v1 e v2 in base alla percentuale specificata nel file
VirtualService
e che esistono due carichi di lavoro del servizio productcatalog.Sul lato destro della pagina, vedrai Richieste, Tasso di errore e Metriche sulla latenza. Con Cloud Service Mesh, ogni servizio presenta queste metriche per fornirti metriche di osservabilità.
Eseguire il rollback o il rollback a una versione
Dopo aver osservato le metriche durante un deployment canary, puoi completare
implementare la nuova versione del servizio o eseguirne il rollback alla versione originale
sfruttando la risorsa VirtualService
.
Implementazione
Quando il comportamento di un servizio v2 ti soddisfa, puoi aumentare gradualmente la percentuale di traffico indirizzato al servizio v2. Alla fine, il traffico può essere indirizzato al 100% al nuovo servizio nella risorsa VirtualService che hai creato in precedenza rimuovendo la suddivisione del traffico da quella risorsa.
Per indirizzare tutto il traffico alla versione 2 di productcatalogservice
:
kubectl apply -f vs-v2.yaml -n onlineboutique
Rollback
Se devi eseguire il rollback al servizio v1, applica destination-vs-v1.yaml
di cui sopra. In questo modo il traffico viene indirizzato solo alla versione 1 di productcatalogservice
.
Per indirizzare tutto il traffico alla versione 1 di productcatalogservice
:
kubectl apply -f vs-v1.yaml -n onlineboutique
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 continui per le risorse utilizzate in questo tutorial, puoi eliminare il progetto o le singole risorse.
Elimina il progetto
In Cloud Shell, elimina il progetto:
gcloud projects delete PROJECT_ID
Elimina le risorse
Se vuoi evitare addebiti aggiuntivi, elimina il cluster:
gcloud container clusters delete CLUSTER_NAME \
--project=PROJECT_ID \
--zone=CLUSTER_LOCATION
Se hai registrato il cluster con il parco risorse utilizzando gcloud container fleet memberships
(anziché --enable-fleet
o --fleet-project
durante la creazione del cluster)
quindi rimuovi l'abbonamento inattivo:
gcloud container fleet memberships delete MEMBERSHIP \
--project=PROJECT_ID
Se vuoi mantenere il cluster configurato per Cloud Service Mesh, ma rimuovi l'esempio di Online Boutique:
Elimina gli spazi dei nomi dell'applicazione:
kubectl delete -f namespace onlineboutique
Risultato previsto:
namespace "onlineboutique" deleted
Elimina le voci del servizio:
kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend.yaml -n onlineboutique kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend-gateway.yaml -n onlineboutique
Risultato previsto:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
Passaggi successivi
- Per una guida generale sulla configurazione dei criteri
PeerAuthentication
, consulta Configurare la sicurezza del trasporto.