Implementar o exemplo Bookinfo

Esta página explica como implementar uma aplicação de exemplo para demonstrar a Cloud Service Mesh. Se não tiver instalado o Cloud Service Mesh, consulte o guia de instalação.

A instalação do Cloud Service Mesh inclui várias aplicações de exemplo. Este guia explica como implementar a amostra BookInfo. Esta é uma aplicação de livraria simulada simples composta por quatro serviços que fornecem uma página de produto Web, detalhes de livros, críticas (com várias versões do serviço de críticas) e classificações, tudo gerido através da Cloud Service Mesh. Pode encontrar o código fonte e todos os outros ficheiros usados neste exemplo no diretório da instalação do Cloud Service Mesh em samples/bookinfo.

Ativar a injeção automática de sidecar

Para ativar a injeção automática de sidecars, tem de etiquetar os seus espaços de nomes para que o webhook do injetor de sidecars associe os sidecars injetados a uma revisão do plano de controlo específica. Se configurar a etiqueta predefinida, etiquete os seus espaços de nomes com as etiquetas de injeção predefinidas. Caso contrário, etiquete os seus espaços de nomes com a etiqueta de revisão. Além disso, a etiqueta que adiciona também depende de ter implementado uma malha de serviços na nuvem gerida ou instalado o painel de controlo no cluster.

Gerido

  1. Pode usar a etiqueta de injeção predefinida ou a etiqueta de revisão para o seu espaço de nomes

    Etiquetas de injeção predefinidas

    Aplique a etiqueta de injeção predefinida ao espaço de nomes.

    kubectl label namespace NAMESPACE istio-injection=enabled istio.io/rev-
    

    Etiqueta de revisão

    Antes de implementar aplicações, remova todas as etiquetas istio-injection anteriores dos respetivos espaços de nomes e defina a etiqueta istio.io/rev=REVISION_LABEL.

    Para a alterar para uma etiqueta de revisão específica, clique em REVISION_LABEL e substitua-a pela etiqueta aplicável: asm-managed-rapid para o canal rápido, asm-managed para o canal normal ou asm-managed-stable para o canal estável.

    A etiqueta de revisão corresponde a um canal de lançamento:

    Etiqueta de revisão Canal
    asm-managed Normal
    asm-managed-rapid Inovação
    asm-managed-stable Estável
    kubectl label namespace NAMESPACE istio-injection- istio.io/rev=REVISION_LABEL --overwrite
    
  2. Se também implementou o plano de dados gerido opcional, anote o espaço de nomes da seguinte forma:NAMESPACE

    kubectl annotate --overwrite namespace NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    

No cluster

  1. Use o seguinte comando para localizar a etiqueta em istiod:

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    O resultado tem um aspeto semelhante ao seguinte:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-173-3-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-11910-9,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-173-3-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-11910-9,istio=istiod,pod-template-hash=5788d57586
    

    Na saída, na coluna LABELS, repare no valor da etiqueta de revisão istiod, que segue o prefixo istio.io/rev=. Neste exemplo, o valor é asm-11910-9.

  2. Aplique a etiqueta de revisão ao espaço de nomes predefinido. No comando seguinte, REVISION é o valor da istiod etiqueta de revisão que anotou no passo anterior.

    kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
    

    Pode ignorar a mensagem "istio-injection not found" no resultado. Isto significa que o espaço de nomes não tinha anteriormente a etiqueta istio-injection, o que deve esperar em novas instalações do Cloud Service Mesh ou novas implementações. Uma vez que o comportamento de injeção automática não está definido quando um espaço de nomes tem a etiqueta istio-injection e a etiqueta de revisão, todos os comandos kubectl label na documentação do Cloud Service Mesh garantem explicitamente que apenas uma está definida.

Implementar a aplicação

Agora que a injeção automática está ativada no espaço de nomes default, quando implementa os serviços da aplicação BookInfo, os proxies sidecar são injetados juntamente com cada serviço.

  1. Na linha de comandos do computador onde instalou o Cloud Service Mesh, aceda à raiz do diretório de instalação do Cloud Service Mesh. Se precisar, transfira o ficheiro de instalação.

  2. Implemente a sua aplicação no espaço de nomes predefinido através de kubectl:

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. Confirme que a aplicação foi implementada corretamente executando os seguintes comandos:

    kubectl get services
    

    Saída:

    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    e

    kubectl get pod
    

    Saída:

    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. Por fim, defina o encaminhamento do gateway de entrada para a aplicação:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

    Saída:

    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created

Validar a implementação da aplicação

Para ver se a aplicação BookInfo está a funcionar, tem de enviar tráfego para o gateway de entrada.

  • Se instalou o Cloud Service Mesh no Google Distributed Cloud, obtenha o endereço IP externo do gateway de entrada que configurou após a instalação do Cloud Service Mesh

  • Se instalou o Cloud Service Mesh no GKE, obtenha o endereço IP externo do gateway de entrada da seguinte forma:

    kubectl get service istio-ingressgateway -n istio-system
    

    Saída:

    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

    Neste exemplo, o endereço IP do serviço de entrada é 35.239.7.64.

Experimentar a aplicação

  1. Verifique se a app BookInfo está a ser executada com curl:

    curl -I http://EXTERNAL_IP/productpage
    

    Se a resposta mostrar 200, significa que a aplicação está a funcionar corretamente com a malha de serviços na nuvem.

  2. Para ver a página Web BookInfo, introduza o seguinte endereço no seu navegador:

    http://EXTERNAL_IP/productpage
    

    Se atualizar a página várias vezes, deve ver diferentes versões das críticas apresentadas na página do produto, apresentadas num estilo rotativo (estrelas vermelhas, estrelas pretas, sem estrelas).

Agora que tem uma aplicação que está a gerar tráfego, pode explorar as páginas da Cloud Service Mesh na Google Cloud consola para ver as métricas e as outras funcionalidades de observabilidade.

Limpar

Quando terminar de experimentar a amostra Bookinfo, remova-a do cluster.

  1. Desinstale o Bookinfo através do seguinte script:

    samples/bookinfo/platform/kube/cleanup.sh
    
  2. Confirmar encerramento:

    kubectl get virtualservices   #-- there should be no virtual services
    kubectl get destinationrules  #-- there should be no destination rules
    kubectl get gateway           #-- there should be no gateway
    kubectl get pods              #-- the Bookinfo pods should be deleted
    

O que se segue?

Saiba mais acerca do exemplo Bookinfo.