Configurando Istio Service Mesh no Oracle Cloud

Por Rodrigo Cândido da Silva
Publicado em Janeiro 2019

Revisado por Elder Moraes




Istio é uma plataforma aberta que fornece uma maneira uniforme de conectar, gerenciar e proteger microsserviços. Suporta o gerenciamento de fluxos de tráfego entre microsserviços, impondo políticas de acesso e agregando dados de telemetria, tudo sem exigir alterações no código fonte dos serviços. Ele funciona por meio de um proxy sidecar especial adicionado em cada serviço que intercepta toda a comunicação de rede entre eles, oferecendo as seguintes funcionalidades:

  • Balanceamento de carga automático para tráfego HTTP, gRPC, WebSocket, e TCP-IP;
  • Controle refinado no comportamento da rede com regras avançadas de roteamento, retries, failovers e injeção de falhas;
  • Métricas, logs e rastreamento automático para todo o tráfego dentro do cluster, incluindo a entrada e saída do cluster (ingress/egress);
  • Comunicação de serviço a serviço seguro em um cluster com autenticação e autorização baseadas em identidade.


Na imagem abaixo, é demonstrada a arquitetura geral do Istio composta pelo data plane (conjunto de proxies inteligentes Envoy implementados como sidecars) e o control plane (gerencia e configura os proxies para rotear o tráfego).


Fonte: Istio website





Criando um novo cluster Kubernetes no Oracle OKE


Para realizar a criação de um novo cluster Kubernetes basta acessar o dashboard do Oracle OKE e solicitar a opção (botão) para criar um novo cluster. Será aberto uma janela com opções e informações adicionais para criação, onde basta definir o nome do cluster, versão Kubernetes suportada, e a opção para criação rápida.




Além disto, é possível habilitar complementos como Kubernetes Dashboard e Tiller (Helm) para serem habilitados durante o processo de criação do cluster. Vale a pena ressaltar que o Tiller será utilizado posteriormente neste artigo para instalação do Istio Service Mesh. Após a confirmação, a criação do cluster deverá estar disponível dentro de alguns minutos.




O cluster Kubernetes estará pronto assim que o status de criação demonstrar ativo, e as instâncias que compõem o cluster ficarem disponíveis.




Para acessar e administrar o ambiente do cluster remotamente, é necessário instalar e configurar os utilitários kubectl (Kubernetes command line) e Oracle CLI (Oracle Cloud command line). Após a instalação e configuração destas ferramentas, você pode realizar a seguinte configuração para acesso.

    
 mkdir -p $HOME/.kube

 oci ce cluster create-kubeconfig --cluster-id [cluster id] --file $HOME/.kube/config
 


Feito isto, você poderá administrar remotamente seu Kubernetes cluster, inclusive definir um proxy de acesso local para o Kubernetes Dashboard.

 
 kubectl proxy

 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
      




Instalando o Istio Service Mesh no OKE


A instalação do Istio no cluster OKE será realizada por meio do Helm. Ele é um gerenciador de pacotes para definição, instalação e atualização de aplicações no Kubernetes. Existem outras possíveis maneiras de instalação do Istio em um cluster Kubernetes, mas o Helm é o método mais fácil e recomendado (principalmente pois já foi previamente instalado na criação do cluster OKE anteriormente).

Para iniciar a instalação, será necessário fazer o download da última versão do Istio em um diretório local, e para isto você pode executar o seguinte comando:

    
 curl -L https://git.io/getLatestIstio | sh -- 
    



Caso você esteja utilizando uma versão do Helm anterior à 2.10.0 será necessário instalar primeiro o Istio CRDs (Custom Resource Definitions) por meio do utilitário kubectl.

    
 kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml 
    



Após finalizada a instalação do CRDs you pode então instalar o Istio Service Mesh. Vale a pena ressaltar que foram informados os parâmetros opcionais para habilitar o suporte as ferramentas de telemetria e monitoramento (Grafrana, Service  Graph, Kiali).

    
 helm install --wait --name=istio --namespace=istio-system --set grafana.enabled=true 
 --set servicegraph.enabled=true --set tracing.enabled=true --set kiali.enabled=true 
 ./install/kubernetes/helm/istio 
    



Este pacote de instalação Helm irá configurar automaticamente seu cluster para realizar injeção do sidecar proxy. Para verificar se a instalação do Istio finalizou com sucesso, você pode utilizar um comando no kubectl para visualizar os containers instalados em execução.

    
 kubectl get pods -n istio-system 
    





Rodando a aplicação de referência: Bookinfo


A maneira mais simples para verificar o funcionamento do ambiente de service mesh em ação é por meio da aplicação de exemplo Bookinfo, que já vem como parte dos exemplos oficiais na distribuição do Istio. Esta aplicação exibe informações sobre um livro, semelhante a uma entrada de catálogo em uma livraria on-line. Na página de exibição, há uma descrição do livro, detalhes do livro (ISBN, número de páginas e assim por diante) e algumas resenhas do mesmo. Na imagem abaixo é demonstrada a arquitetura desta aplicação, que é composta por quatro microsserviços separados (productpage, details, reviews, ratings).


Fonte: Istio Bookinfo page



Para instalar a aplicação no cluster OKE, basta habilitar a injeção dos sidecar proxy automático no namespace default e realizar a instalação por meio dos seguintes comandos:

    
 kubectl label namespace default istio-injection=enabled

 kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
 



Para confirmar que a aplicação Bookinfo foi instalada com sucesso, você pode verificar se os serviços e os pods encontram-se todos em execução no cluster:

    
 kubectl get services
    


    
 kubectl get pods
    



Será necessário também expor o gateway para acesso à aplicação dentro do cluster, por meio do seguinte comando:

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



Para confirmar que o gateway foi criado e definido corretamente:

    
 kubectl get gateway
    



Para acessar a aplicação é necessário descobrir o endereço IP e porta do cluster, para então definir a URL de acesso externo. Você pode realizar as seguintes configurações para descoberta do endereço de acesso:

    
 export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o 
 jsonpath='{.status.loadBalancer.ingress[0].ip}')

 export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o 
 jsonpath='{.spec.ports[?(@.name=="http2")].port}')

 export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
 






Consultando métricas com o Prometheus


Prometheus é um sistema de alerta e monitoramento open-source que coleta métricas de destinos configurados em determinados intervalos, avaliando regras definidas e exibindo os respectivos resultados.

Para acessar o serviço no cluster, verifique se o mesmo encontra-se disponível por meio do seguinte comando:

    
 kubectl -n istio-system get svc prometheus
    



Simule o envio de algum tráfego de acesso à aplicação de exemplo Bookinfo, por meio do seguinte comando:

    
 while true; do sleep 1; curl http://${GATEWAY_URL}/productpage; echo -e '\n\n\n\n'$(date);done
    



Defina o proxy local para acesso e acesse o endereço do Prometheus:

    
 kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o 
 jsonpath='{.items[0].metadata.name}') 9090:9090 &
    




Você pode, por exemplo, testar algumas das seguintes consultadas customizadas pelo Prometheus:


# Total de requests realizados somente ao serviço 'productpage'
istio_requests_total{destination_service="productpage.default.svc.cluster.local"}

# Total de requests realizados somente a v3 do serviço 'reviews'
istio_requests_total{destination_service="reviews.default.svc.cluster.local", destination_version="v3"}

# Taxa de requests realizados nos últimos 5 minutos com HTTP 200 somente ao serviço 'productpage'
rate(istio_requests_total{destination_service=~"productpage.*", response_code="200"}[5m])






Visualizando métricas com o Grafana


Grafana é uma suíte open-source de análise e visualização de dados em tempo real a partir de métricas computadas pelo Graphite, Elasticsearch, OpenTSDB, Prometheus e/ou InfluxDB.

Para acessar o serviço do Grafana, verifique se o mesmo encontra-se disponível no cluster por meio do seguinte comando:

    
 kubectl -n istio-system get svc grafana
 



Defina o proxy local e acesse o endereço do serviço do Grafana:

    
 kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l 
 app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &    
    


Este serviço do já vem configurado com dashboards previamente configurados para Istio, que podem ser acessados:

  1. Pilot Dashboard: http://localhost:3000/dashboard/db/pilot-dashboard
  2. Istio Mesh Dashboard: http://localhost:3000/dashboard/db/istio-mesh-dashboard
  3. Istio Workload Dashboard: http://localhost:3000/dashboard/db/istio-workload-dashboard
  4. Istio Service Dashboard: http://localhost:3000/dashboard/db/istio-service-dashboard








Rastreamento distribuído com Jaeger


Jaeger é um sistema de rastreamento distribuído open-source utilizado para monitorar e solucionar problemas de sistemas distribuídos baseados em microsserviços. Além disto, pode ser utilizado também para:

  • Propagação de contexto distribuído
  • Monitoramento de transação distribuída
  • Análise de causa raiz
  • Análise de dependência de serviço
  • Otimização de desempenho / latência

Para acessar o serviço do Jaeger, primeiramente, verifique se o mesmo encontra-se disponível no cluster por meio do seguinte comando:

    
 kubectl -n istio-system get svc | grep jaeger
 



Defina o proxy local e acesse o endereço do serviço do Jaeger:

    
 kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o   
 jsonpath='{.items[0].metadata.name}') 16686:16686 &
    



Você pode buscar pelos rastros distribuídos tomando como base um determinado serviço, como no exemplo da imagem abaixo...




… E também expandir um determinado rastro para verificar todas as chamadas internas realizadas, com suas respectivas dependências.





Habilitando a geração de um Service Graph


Uma outra ferramenta que está disponível no ambiente do Istio é o Service Graph, responsável pela geração de um gráfico dinâmico de dependências entre os microsserviços da aplicação.

Para acessar o Service Graph, verifique se o mesmo encontra-se disponível no cluster por meio do seguinte comando:

    
 kubectl -n istio-system get svc servicregraph
 



Defina o proxy local e acesse o endereço do serviço do Service Graph:

    
 $ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l 
 app=servicegraph -o jsonpath='{.items[0].metadata.name}') 8088:8088 &
    






Referências


https://istio.io/
https://istio.io/docs/setup/kubernetes/helm-install/
https://istio.io/docs/examples/bookinfo/
https://istio.io/docs/tasks/telemetry/distributed-tracing/
https://istio.io/docs/tasks/telemetry/querying-metrics/
https://istio.io/docs/tasks/telemetry/using-istio-dashboard/
https://istio.io/docs/tasks/telemetry/servicegraph/
https://docs.helm.sh/using_helm/
https://technology.amis.nl/2018/05/26/running-istio-on-oracle-kubernetes-engine-the-managed-kubernetes-cloud-service/
http://www.ateam-oracle.com/istio-on-oke/




Rodrigo Cândido da Silva @rcandidosilva
Consultor independente, Oracle Groundbreaker Ambassador e JUG Leader do GUJavaSC, grupo de usuários Java de Santa Catarina. Com mais de 18 anos de experiência na área de desenvolvimento de software, vem trabalhando atualmente nas áreas de consultoria, desenvolvimento, treinamento e design de arquiteturas de software. Contribuidor ativo de projetos open source e participante frequente em conferências de software pelo Brasil e pelo mundo. 

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle