Como implantar o aplicativo de amostra Online Boutique
Este guia explica como instalar o aplicativo de exemplo Online Boutique para demonstrar o Cloud Service Mesh. Se você não tiver instalado o Cloud Service Mesh, consulte guia de instalação.
Como fazer o download e implantar a amostra
Para implantar o aplicativo, primeiro faça o download dos manifestos do
Online Boutique no repositório anthos-service-mesh-packages
usando kpt
. O aplicativo de amostra Online Boutique no
repositório anthos-service-mesh-packages
é modificado a partir do conjunto original de
manifestos no repositório
microservices-demo
. Seguindo as práticas recomendadas, cada serviço é implantado em um namespace separado
com uma conta de serviço exclusiva.
Instale
kpt
caso ainda não tenha feito isso:gcloud components install kpt
Faça o download da amostra usando
kpt
:kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/samples/online-boutique \ online-boutique
Resposta esperada
Package "online-boutique": Fetching https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages@main From https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages * branch main -> FETCH_HEAD Adding package "samples/online-boutique". Fetched 1 package(s).
Acesse o diretório
online-boutique
:cd online-boutique
Crie os namespaces do aplicativo:
kubectl apply -f kubernetes-manifests/namespaces
Saída esperada:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
Implante a amostra no cluster.
Crie as contas de serviço e implantações:
kubectl apply -f kubernetes-manifests/deployments
Saída esperada:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
Crie os serviços:
kubectl apply -f kubernetes-manifests/services
Saída esperada:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
Crie as entradas de serviço:
kubectl apply -f istio-manifests/allow-egress-googleapis.yaml
Saída esperada:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Como ativar a injeção automática do arquivo secundário
Para ativar a injeção automática, rotule os namespaces com os rótulos de injeção padrão se a tag padrão estiver configurada ou com o rótulo de revisão ao namespace. O rótulo adicionado depende de você ter implantado o Cloud Service Mesh gerenciado ou instalado o plano de controle no cluster. O rótulo é usado pelo webhook do injetor do arquivo secundário para associar os arquivos secundários injetados a uma revisão específica do plano de controle.
No cluster
Use o seguinte comando para localizar o rótulo em
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
O comando gera o rótulo de revisão que corresponde ao Versão do Cloud Service Mesh, por exemplo:
asm-1233-2
Aplique o rótulo de revisão aos namespaces do aplicativo. No comando a seguir, REVISION é o valor do rótulo de revisão
istiod
que você anotou na etapa anterior.for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Saída esperada:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Reinicie os pods:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
Saída esperada:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
Malha de serviço gerenciada
Aplique o rótulo de revisão aos namespaces do aplicativo. Nos seguintes , é preciso que o rótulo REVISION seja o valor do comando Canal de lançamento gerenciado do Cloud Service Mesh:
asm-managed
para serviços regulares,asm-managed-rapid
para conteúdo rápido ouasm-managed-stable
para estável.for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Saída esperada:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Se você também implantou o plano de dados gerenciado opcional, anote os namespaces do aplicativo da seguinte maneira:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl annotate --overwrite namespace $ns mesh.cloud.google.com/proxy='{"managed":"true"}' done;
Reinicie os pods:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
Saída esperada:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
Como expor e acessar o aplicativo
A maneira como você expõe o aplicativo fora da malha depende da implantação de um gateway de entrada. É possível expor o aplicativo usando um gateway de entrada do Istio ou um serviço do Kubernetes.
Como usar o gateway de entrada
Se você implantou um gateway de entrada no cluster conforme especificado no pré-requisito, siga as etapas abaixo para expor o aplicativo usando o gateway.
Implantar um
Gateway
e umVirtualService
no serviço de front-endkubectl apply -f istio-manifests/frontend-gateway.yaml
Saída esperada:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Consiga o endereço IP externo do gateway de entrada substitua os marcadores pelas seguintes informações:
GATEWAY_SERVICE_NAME: o nome do serviço de gateway de entrada. Se você implantou o gateway de amostra sem modificação ou se implantou o gateway de entrada padrão, o nome é
istio-ingressgateway
.GATEWAY_NAMESPACE: o namespace em que você implantou o gateway de entrada. Se você implantou o gateway de entrada padrão, o namespace é
istio-system
.
kubectl get service GATEWAY_SERVICE_NAME -n GATEWAY_NAMESPACE
A saída é semelhante a:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Nesse exemplo, o endereço IP do serviço do gateway de entrada é
35.239.7.64
.Acesse o aplicativo no navegador para confirmar a instalação:
http://EXTERNAL_IP/
Nenhum gateway de entrada
Se você não implantou um gateway de entrada ou quer expor o aplicativo usando um serviço do Kubernetes, siga estas etapas:
Implante um serviço do tipo
LoadBalancer
para expor o serviço de front-endkubectl apply -f frontend-external.yaml
Encontre o endereço IP externo do serviço
frontend-external
:kubectl get service frontend-external -n frontend
Acesse o aplicativo no navegador para confirmar a instalação:
http://EXTERNAL_IP/
Confira os recursos de observabilidade do Cloud Service Mesh no console do Google Cloud. Pode levar até 10 minutos para o gráfico de topologia exibir os serviços na malha.
Limpar
Antes de excluir o Online Boutique, confira o Cloud Service Mesh por exemplo: mTLS, que usa a amostra. Quando terminar de explorar, use os seguintes comandos para remover a amostra Online Boutique:
Exclua os namespaces do aplicativo:
kubectl delete -f kubernetes-manifests/namespaces
Saída esperada:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
Exclua as entradas de serviço:
kubectl delete -f istio-manifests/allow-egress-googleapis.yaml
Saída esperada:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted