Neste tutorial, vai percorrer um exemplo de utilização comum: implementar uma implementação canary com a malha de serviços na nuvem através das APIs Istio.
O que é uma implementação de teste?
Uma implementação canary encaminha uma pequena percentagem de tráfego para uma nova versão de um microsserviço e, em seguida, aumenta gradualmente essa percentagem enquanto descontinua a versão antiga. Se algo correr mal durante este processo, o tráfego pode ser novamente direcionado para a versão anterior. Com a Cloud Service Mesh, pode encaminhar o tráfego para garantir que os novos serviços são introduzidos em segurança.
Implemente a loja online
Defina o contexto atual de
kubectlpara o cluster onde planeia implementar a Online Boutique. O comando depende de ter aprovisionado o Cloud Service Mesh num cluster do GKE ou num cluster do Kubernetes fora do GKE:GKE no Google Cloud
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONGKE fora do Google Cloud
kubectl config use-context CLUSTER_NAMECrie o espaço de nomes para a aplicação de exemplo e a gateway de entrada:
kubectl create namespace onlineboutiqueEtiquete o espaço de nomes
onlineboutiquepara injetar automaticamente proxies Envoy. Siga os passos sobre como ativar a injeção automática de sidecar.Implemente a app de exemplo. Para este tutorial, implementa a Online Boutique, uma app de demonstração de microsserviços.
kubectl apply \ -n onlineboutique \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yamlAdicione uma etiqueta
version=v1à implementaçãoproductcatalogexecutando o seguinte comando:kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \ -n onlineboutiqueVeja os serviços que implementou:
kubectl get pods -n onlineboutiqueResultado esperado:
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 2m7sUm
2/2na colunaREADYindica que um pod está em funcionamento com um proxy do Envoy injetado com êxito.Implemente
VirtualServiceeDestinationRulepara a versão v1 deproductcatalog:kubectl apply -f destination-vs-v1.yaml -n onlineboutiqueTenha em atenção que apenas
v1está presente nos recursos.Veja o
Destination Rulecriado.kubectl get destinationrules -n onlineboutiqueResultado esperado:
NAME HOST AGE productcatalogservice productcatalogservice 2mVeja o
VirtualServicecriado.kubectl get virtualservices -n onlineboutiqueResultado esperado:
NAME GATEWAYS HOSTS AGE productcatalogservice ["productcatalogservice"] 2mVisite a aplicação no seu navegador através do endereço IP externo do seu gateway de entrada:
kubectl get services -n GATEWAY_NAMESPACE
A secção seguinte apresenta a IU do Cloud Service Mesh e mostra como pode ver as suas métricas.
Veja os seus serviços na Google Cloud consola
Na Google Cloud consola, aceda à página Serviços da edição Google Kubernetes Engine (GKE) Enterprise.
Aceda aos serviços da edição Enterprise do Google Kubernetes Engine (GKE)
Por predefinição, vê os seus serviços na vista de lista.
A vista geral da tabela permite-lhe observar todos os seus serviços, bem como métricas importantes rapidamente.
Na parte superior direita, clique em Topologia. Aqui, pode ver os seus serviços e a respetiva interação entre si.
Pode expandir os Serviços e ver os Pedidos por segundo de cada um dos seus serviços passando o cursor sobre eles.
Navegue de volta para a vista de tabela.
Na Tabela de serviços, selecione
productcatalogservice. Isto permite aceder a uma vista geral do seu serviço.No lado esquerdo do ecrã, clique em Tráfego.
Certifique-se de que 100% do tráfego de entrada para
productcatalogserviceé direcionado para o serviço de carga de trabalho.
A secção seguinte explica como criar uma v2 do serviço productcatalog.
Implemente a v2 de um serviço
Para este tutorial, o
productcatalogservice-v2introduz uma latência de 3 segundos em pedidos com o campoEXTRA_LATENCY. Isto simula uma regressão na nova versão do serviço.Aplique este recurso ao espaço de nomes
onlineboutique.kubectl apply -f productcatalog-v2.yaml -n onlineboutiqueVerifique os pods da aplicação.
kubectl get pods -n onlineboutiqueResultado esperado:
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 25hRepare que existem agora 2
productcatalogserviceslistados.Use
DestinationRulepara especificar os subconjuntos de um serviço. Neste cenário, existe um subconjunto para a v1 e, em seguida, um subconjunto separado para a v2 deproductcatalogservice.Repare no campo
labels. As versões doproductcatalogservicesão distinguidas depois de o tráfego ser encaminhado peloVirtualService.Aplique o
DestinationRule:kubectl apply -f destination-v1-v2.yaml -n onlineboutique
Divida o tráfego entre a v1 e a v2
Use
VirtualServicepara definir uma pequena percentagem do tráfego a direcionar para a v2 doproductcatalogservice.O campo subset indica a versão e o campo weight indica a divisão percentual do tráfego. 75% do tráfego acede à v1 de productcatalog e 25% acede à v2.
Aplique o
VirtualService:kubectl apply -f vs-split-traffic.yaml -n onlineboutique
Se visitar o EXTERNAL_IP do acesso do cluster, deve reparar que, periodicamente, o carregamento do frontend é mais lento.
Na secção seguinte, explore a divisão do tráfego na Google Cloud consola.
Observe a divisão de tráfego na Google Cloud consola
Regresse à Google Cloud consola e aceda à página GKE Enterprise Services. Aceda aos serviços do GKE Enterprise
Na parte superior direita, clique em Topologia.
Expanda a carga de trabalho
productcatalogservicee tome nota das implementaçõesproductcatalogserviceeproductcatalogservice-v2.Regresse à vista de tabela.
Clique em
productcatalogservicena tabela de serviços.Regresse a Tráfego na barra de navegação do lado esquerdo.
Tenha em atenção que o tráfego recebido é dividido entre a v1 e a v2 pela percentagem especificada no ficheiro
VirtualServicee que existem 2 cargas de trabalho do serviço productcatalog.No lado direito da página, são apresentados os Pedidos, a Taxa de erros e as Métricas de latência. Com a Cloud Service Mesh, cada serviço tem estas métricas descritas para lhe fornecer métricas de observabilidade.
Implemente ou reverta para uma versão
Depois de observar as métricas durante uma implementação canary, pode concluir a implementação da nova versão do serviço ou reverter para a versão original do serviço através do recurso VirtualService.
Implementação
Depois de ficar satisfeito com o comportamento de um serviço v2, pode aumentar gradualmente a percentagem de tráfego direcionado para o serviço v2. Eventualmente, pode direcionar 100% do tráfego para o novo serviço no recurso VirtualService que criou acima, removendo a divisão de tráfego desse recurso.
Para direcionar todo o tráfego para a v2 de productcatalogservice:
kubectl apply -f vs-v2.yaml -n onlineboutique
Reverter
Se precisar de reverter para o serviço v1, aplique o destination-vs-v1.yaml de anteriormente. Isto direciona o tráfego apenas para a v1 de productcatalogservice.
Para direcionar todo o tráfego para a v1 de productcatalogservice:
kubectl apply -f vs-v1.yaml -n onlineboutique