Documente Academic
Documente Profesional
Documente Cultură
Centro de Informática
Trabalho de Graduação
1
ASSINATURAS
______________________________________________________________
Lucas Serra da Cunha Assad
______________________________________________________________
Vinicius Cardoso Garcia
2
AGRADECIMENTOS
Sou imensamente grato aos meus pais que desde pequeno se esforçaram
para que eu estudasse, buscando sempre dar o melhor do ensino possível pra mim.
Agradeço também a cada conselho, dica, bronca que foi dada. Acredito que
sem nenhum dos pontos citados anteriormente este trabalho não seria possível.
Gostaria de agradecer também a todos os meus amigos do CIn que me fizeram não
desistir da faculdade, tornando o ambiente sempre descontraído. Dos amigos do
CIn eu gostaria de agradecer principalmente a Lerisson por estar sempre antenado
nos trabalhos e prazos, creio que sem este ponto eu não estaria nem perto de
escrever este trabalho.
Por fim, gostaria de agradecer ao meu orientador Vinicius Garcia por todos os
seus ensinamentos, não só durante a escrita do meu TG, como durante as cadeiras
de Engenharia de Software que fui monitor por 2 anos e Microsserviços. Creio que
sem esses ensinamentos talvez nem o tema do meu trabalho fosse este.
3
RESUMO
1
URL: https://www.rabbitmq.com/. Último acesso em 30/06/2019.
2
URL: https://kafka.apache.org/. Último acesso em 30/06/2019.
4
Palavras-chave: Monitoramento, microsserviços, métricas, escalabilidade,
kubernetes, monitoramento de kubernetes.
5
ABSTRACT
6
LISTA DE ILUSTRAÇÕES
7
LISTA DE TABELAS
8
SUMÁRIO
1. Introdução 11
1.1 Contexto 11
1.2 Objetivos 13
2. Contexto Histórico 15
3.2 Fluentd 27
3.3 Beats 28
3.5 MangueBeat 29
4. Configuração 34
9
4.1 Configurações de Ambiente 34
5. Comparando as Soluções 37
6.1 Conclusão 41
6.2 Limitações 42
7. Referências 43
10
1. Introdução
1.1 Contexto
3
URL: https://kubernetes.io/. Último acesso em 27/06/2019.
11
das implantações, visto que, as VMS podem ter diferentes versões para diferentes
pacotes e dependências do sistema operacional.
Com o intuito de solucionar a problemática de configuração de ambiente para
implantação surgiram os contêineres, que resumidamente, são isolamentos de
ambientes previamente configurados que executam como processos pelo Sistema
Operacional. Segundo o livro Kubernetes in the Enterprise[2] os contêineres acabam
também por solucionar alguns outros problemas como:
● São muito mais rápidos para iniciar do que uma VM;
○ Iniciar um contêiner é o equivalente a iniciar um processo;
● Construir uma nova imagem para um contêiner é muito mais rápido que
construir uma imagem de uma VM;
○ Basicamente para contêineres para qualquer atualização só são
escritas as mudanças, aproveitando as dependências, imagens bases
necessária a re-escrita do
que já houverem no disco. Para VMS é
disco por completo;
● As imagens de contêineres são muito mais leves que as imagens de VM’S.
De acordo com as facilidades impostas pelos contêineres surgiram algumas
ferramentas para ajudar na orquestração das aplicações em contêineres.
Ferramentas essas que auxiliam com escala, atualização, distribuição de carga,
regras de tráfego, e alguns outros artifícios para monitoramento do estado das
aplicações. O Kubernetes atualmente(2019) é o maior expoente quando nos
referimos aos Orquestradores de Contêineres [3].
Colocar as aplicações de forma distribuída e uniforme se tornou mais fácil e
escalável através desta ferramenta. Porém, com o crescimento de clusters de
máquinas virtuais, distribuídos por múltiplas zonas de disponibilidade, pode até
resolver a problemática de termos aplicações redundantes e mitigar possíveis
indisponibilidades dos sistemas.
Mas como saber o tamanho de recurso (i.e. CPU/Memória) ideal para que
sua aplicação seja executada? Como visualizar os logs das aplicações de forma
centralizada? E como identificar o momento certo para escalar as aplicações. Tudo
isso se tornou possível através das soluções de monitoramento do consumo dos
recursos dos softwares/microsserviços/programas isolados.
12
O objetivo principal deste trabalho é investigar e expor algumas soluções
possíveis e o melhor caso para a(s) sua(a) utilização(ões) no universo do
Kubernetes.
1.2 Objetivos
Neste contexto, este trabalho tem como objetivo fazer um “benchmark” entre
soluções de monitoramento de microsserviços comumente utilizados pelo mercado
como, por exemplo, o prometheus4 da Cloud Native Computing Foundation5, beats6
do Elasticsearch7, e MangueBeat que será desenvolvida durante este trabalho.
Desta forma, pretende-se conduzir uma avaliação de desempenho das soluções
citadas anteriormente em 3 cenários:
● Principais características (funcionalidades e capacidades);
● Consumo de recursos, tanto Memória quanto CPU e rede;
● Granularidade das informações;
Facilitando assim, uma análise de qual seria o melhor cenário para a
aplicação de cada uma das soluções analisadas, e onde elas poderiam melhor se
enquadrar de acordo com o que se propoẽm a fazer.
4
URL: https://prometheus.io/. Último acesso em 30/06/2019.
5
URL: https://www.cncf.io/. Último acesso em 30/06/2019.
6
URL: https://www.elastic.co/products/beats. Último acesso em 30/06/2019.
7
URL https://www.elastic.co/. Último acesso em 30/06/2019.
13
O terceiro capítulo apresenta uma análise de como o monitoramento deve ser
feito segundo a documentação oficial do Kubernetes, e como as soluções
analisadas neste trabalho fazem para coletar as métricas e logs. Além disso, neste
capítulo é apresentada a justificativa para o desenvolvimento de uma solução de
monitoramento única para múltiplos clusters Kubernetes.
O Capítulo 4 detalha como o ambiente para o desenvolvimento do trabalho
foi configurado e como instalar cada solução utilizada durante o trabalho.
Durante o quinto Capítulo é feita uma comparação entre as soluções,
buscando fazer ressalvas aos diferenciais de cada uma.
Por fim, o capítulo 6 apresenta as conclusões chegadas pelo autor durante o
desenvolvimento do trabalho, e um levantamento de possíveis trabalhos futuros.
14
2. Contexto Histórico
15
receberem uma entrada junto ao programa e devolver uma saída dificultavam todo o
processo.
16
softwares escritos nessas linguagens são mantidos até hoje, como sistemas de
grande bancos.
O PDP-8 foi um microcomputador desenvolvido pela Digital Equipment
Corporation lançado em 1965. Chegou a ter mais de 50 mil exemplares vendidos e
custava cerca de 18,500 dólares[8], era considerado uma versão bem mais básica
dos supercomputadores.
Para essa geração foi iniciado o uso de algumas linguagens de programação
citadas anteriormente, e criação de algumas sub rotinas facilitando o
armazenamento de alguns poucos logs do sistema. Facilitando assim o processo de
debug das operações realizadas. Fora isso, o desenvolvimento de testes para
validação de funcionalidades poderiam auxiliar no processo pré execução dos
códigos.
17
2.1.3 Terceira Geração
18
2.1.4 Da Quarta Geração até os dias atuais
19
Podemos dividir o sistema de locação em módulos de pesquisa, módulo de compra,
módulo de listagem, módulo de cadastro. Ao dividir o sistema em módulos
garantimos que caso um desses microsserviços do módulo fiquem sobrecarregados
apenas o microsserviço que foi sobrecarregado cresça e não necessariamente a
aplicação/módulo inteiro, evitando custos excessivos de forma desnecessária. Se
algum módulo entrar em loop, de algum erro, apenas a parte referente a este
módulo ficará indisponível. Caso nosso sistema fosse um grande monolítico como
ilustrado no lado esquerdo da Figura 2.4, ou seja, com todos os módulos juntos, ao
passo que seja necessário escalar a aplicação precisaríamos levantar todos os
módulos de uma vez. Consideramos a divisão da aplicação em módulos como
distribuição de aplicação em micro serviços.
20
Figura 2.5 Divisão de microsserviços em cluster.
Fonte: thoughtworks, 2015.
21
porta de destino, o path da requisição, a resposta esperada pela requisição e um
timer para que se repita. É de costume e boa prática que sejam criados paths para
health-check da aplicação que tenham um retorno simples, as vezes apenas um
STATUS 200 na requisição HTTP. Geralmente são utilizadas aplicações como
zabbix, appbeat, pingdom, uptime e muitas outras soluções. Para Kubernetes há um
componente nativo do próprio sistema que pode ser configurado para desempenhar
esse papel e chama-se readinessprobe.
8
URL: https://www.nginx.com/. Último acesso em 30/06/2019.
22
loop quantas repetições acontecem, quanto de memória está sendo consumido, e
se é factível que aconteçam overflows. Os relatórios e traces capturados são
utilizados como base para as possíveis mudanças, com o intuito de garantir o
melhor desempenho do software.
Para Kubernetes não há nenhuma solução nativa. Isto não significa que não
dê para se fazer, por exemplo, se configurarmos o Ingress Nginx podemos
identificar o tempo de resposta para cada requisição e com base nos logs tomar as
devidas medidas para solucionar o problema. Existem também diversas ferramentas
onde pode-se o uso desta técnica como por exemplo: Java Profilers, JHM, Java
Application Performance Management (APM).
23
novas réplicas idênticas que executam o mesmo papel das já existentes. Seja ela
vertical, onde são elevados os pontos de máximo e mínimo de consumo de
CPU/Memória ou disco.
Para fazer este monitoramento é necessário atentar sempre ao consumo
atual dos recursos de cada microsserviço do sistema, identificando futuros pontos
de elevação de uso. Como, por exemplo, no caso de black fridays, onde as
empresas preparam seus sistemas para crescer de forma ordenada,
desordenadamente.
No Kubernetes, o monitoramento do cluster é feito por meio do metric-server9
onde é possível coletar algumas informações sensíveis referentes às aplicações
embarcadas que estão rodando, como consumo de CPU, Memória, tráfego de rede
e com base nessas informações criar o escaladores horizontais de pods10.
9
URL: https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/. Último
acesso em 30/06/2019.
10
URL: https://kubernetes.io/docs/concepts/workloads/pods/pod/. Último acesso em 30/06/2019.
24
colocando alguns outputs do sistema para facilitar a detecção de possíveis erros.
Fora isso alguns outros artifícios de linguagens compiladas podem ser utilizados
para que quando erros aconteçam, sejam indicados qual linha, em qual método e
qual o motivo do erro.
Quando lidamos com sistemas distribuídos, identificar de qual serviço/ori é o
log e onde centralizar os logs destes serviços é um ponto chave para identificação
do problema e tomada de decisão eficiente.
Seguindo as boas práticas no Kubernetes, os logs devem ser armazenados
de forma centralizada guardando sempre as referências de qual serviço eles vieram,
permitindo assim aplicar filtros para facilitar essa análise. Estes filtros podem ser por
tipo de output(stdout, stderr), conteúdo da mensagem de log, deployment o qual
pertencia o log.
Existem diversas soluções para essa problemática no kubernetes, algumas
delas são: a Stack EFK(Elasticsearch11, Fluentd12, Kibana13), beats do elasticsearch
dentre várias outras soluções.
11
URL: https://www.elastic.co/. Último acesso em 13/06/2019.
12
URL: https://www.fluentd.org/. Último acesso em 13/06/2019.
13
URL: https://www.elastic.co/products/kibana. Último acesso em 13/06/2019.
25
3. Análise das Soluções Utilizadas no Trabalho
26
Figura 3.1. Agente para coleta de logs dos nós.
3.2 Fluentd
14
URL: https://tools.ietf.org/html/rfc7159. Último acesso em 23/06/2019.
15
URL: https://www.fluentd.org/plugins. Último acesso em 09/07/2019.
16
URL:https://www.ruby-lang.org/pt/documentation/. Último acesso em 23/06/2019.
27
Figura 3.2. Arquitetura do Fluentd.
3.3 Beats
17
URL: https://www.nagios.org/. Último acesso em 23/06/2019.
18
URL: https://www.elastic.co/products/logstash. Último acesso em 23/06/2019.
19
URL: https://golang.org/doc/. Último acesso em 23/06/2019.
28
consomem cerca de 80MB de memória a mais que o Fluentd por operador, o que
em um servidor com 1000 máquinas pode chegar a 80GB [22].
A Figura 3.3 apresenta a forma como o beats armazena as informações,
juntamente com a utilização de alguns filtros destacados.
3.5 MangueBeat
29
O MangueBeat foi uma solução desenvolvida, pelo autor deste trabalho, em
NodeJS20, cuja propriedade intelectual pertence a Ustore21. Além disso, a Ustore
mantém o agente em código fechado e de uso interno.
Ao contrário das demais soluções o MangueBeat integra-se com o servidor
de métricas mantido pelo Kubernetes, não precisando ser um operador rodando em
cada node do cluster. O fato de não ser um operador reduz drasticamente seu
consumo de recursos computacionais por node no cluster, visto que são
necessárias apenas uma instância do MangueBeat operacional para que o
monitoramento seja feito. O que implica diretamente no custo financeiro para manter
a infraestrutura do cluster.
Sua configuração é feita por meio de variáveis de ambiente, definindo por
exemplo: tempo entre o intervalo da coleta das métricas, servidor onde está o
elasticsearch, servidor onde está o servidor de métricas.
Além disso, o serviço de monitoramento do MangueBeat possibilita o
monitoramento de mais de um cluster por vez, podendo haver a centralização do
agente de monitoramento, e salvando as informações de forma descentralizada.
Podendo partir para abordagens como, criar um cluster dedicado para
monitoramento, alocar resource quotas [ 23] e
specíficas para o namespace22 de
monitoramento.
20
URL: https://nodejs.org/en/docs/. Ú ltimo acesso em 23/06/2019.
21
URL: http://ustore.com.br/. Ú
ltimo acesso em 23/06/2019.
22
URL: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/. Último
acesso em 23/06/2019.
30
Figura 3.4. Arquitetura de monitoramento MangueBeat
23
URL: https://telegram.org/blog/bot-revolution. Último acesso em 23/06/2019.
24
URL: https://kubernetes.io/docs/concepts/configuration/secret/. Último acesso em 23/06/2019.
31
Figura 3.5 Scale e informações de deployment via TelegramBot
25
URL: https://www.mysql.com/. Ú
ltimo acesso em 23/06/2019.
32
Este capítulo teve como objetivo mostrar como a documentação oficial do
Kubernetes sugere que o monitoramento de métricas e logs devem ser feitos no
orquestrador, e como as ferramentas analisadas por este trabalho funcionam.
Buscando uma abordagem mais visual para a análise do que cada solução
contempla foi desenvolvida a Tabela 3.1.
Beats X X X
Fluentd X X X
MangueBeat X X
33
4. Configuração
CPU 4 Cores
Memória RAM 8 GB
Disco 50 GB
34
Sistema Operacional Ubuntu Server 16.04
Etcd v3.2.18
Kubelet v1.11.3
Docker 17.06
Elasticsearch 6.5.0
MetricBeat 7.1.1
Kibana 6.4.3
Fluentd v1.0
MangueBeat v0.9
Tabela 4.2. Configuração de Software
A escolha por utilizar o docker na versão 17.06 foi feita pelo fato de ser a
versão mais estável para o Ubuntu Server 16.04 segundo a documentação oficial do
docker[26]. A versão escolhida para o Kubernetes foi a v1.11.3 por ter sido
aproveitado um cluster já pronto para testes de soluções do autor deste trabalho.
35
Os arquivos utilizados para deploy das ferramentas de monitoramento e do
banco de dados encontram-se no pastebin26.
26
URL: https://pastebin.com/X1FJcZmB. Último acesso em 09/07/2019.
36
5. Comparando as Soluções
Partindo para uma análise das soluções apresentadas fica evidente que
existem diversas formas para implementar e manter o monitoramento de aplicações
no cenário de sistemas distribuídos em Kubernetes.
Vendo pelo ponto de vista de alocação dos sistemas de monitoramento em
VM’S é possível identificar 2 possibilidades: a instalação de operadores em cada
Worker ou a integração do sistemas de monitoramento ao servidor de métricas do
Kubernetes. As soluções do Beats e o Fluentd utilizam dos operados nos workers
como mecanismo de coleta de logs e métricas, coletando periodicamente os dados
e salvando-os no banco de dados. Já a solução do MangueBeat, é integrada ao
servidor de métricas do Kubernetes, sendo assim, necessita apenas de uma
instância operacional para monitorar as aplicações.
Analisando por esta ótica, pode-se fazer uma análise de consumo de CPU,
Memória e Network por unidade de monitoramento (operators e servidores de
monitoramento) utilizando as métricas coletadas por eles. No gráfico abaixo são
sumarizadas as soluções e as suas respectivas médias de consumo em um
intervalo de 30 minutos, para clusters com uma média de 10 aplicações
instaladas(backends, frontends e bancos de dados). Para o caso do Beats não
foram usadas todas as soluções de monitoramento, apenas o MetricBeat e o
Filebeat.
37
Figura 5.1. Informações de consumo de CPU por instância.
38
Figura 5.3. Informações de consumo de Rede por instância.
A partir dos gráficos 5.1, 5.2 e 5.3 é notório que as soluções Beats e Fluentd
consomem mais recursos computacionais e de rede que a ManguetBeat. Vale
ressaltar que essa quantidade de recurso é por unidade de monitoramento, sendo
assim para o Beats e Fluentd o consumo total de recurso seria a multiplicação da
quantidade de VM’S workers por quantidade de recursos computacionais e rede.
Logo, seguindo as instruções anteriores e a documentação oficial do Kubernetes27 é
possível obter a seguinte equação:
27
URL: https://kubernetes.io/pt/docs/home/. Último acesso em 09/07/2019.
39
aplicação está até o tempo que a aplicação está rodando, Logs, métricas de
recursos computacionais. Já a solução MangueBeat atém se apenas na coleta de
métricas do consumo de recursos computacionais como CPU, Memória e de rede.
Pelo fato da ferramenta desenvolvida pelo autor ater-se apenas para o
monitoramento mais a fundo dos consumos de recursos computacionais e de rede,
pode-se justificar a disparidade encontrada no consumo de recursos da ferramenta.
Vale ressaltar que em um cenário de múltiplos clusters, onde há a
necessidade de monitoramento de recursos de computacionais e de rede,
unicamente, a solução do MangueBeat pode ser encarada como unanimidade. Visto
que, seria necessário apenas uma instância em alta disponibilidade do serviço de
monitoramento para monitorar todos os clusters.
Outro caso interessante é a facilidade de integração com serviços de
terceiros ou implementação de funcionalidades simples como de alerta. No caso da
ferramenta do MangueBeat podem ser cadastrados alertas via TelegramBot para
avisar a permanência acima da média dos recursos de uma aplicação do cluster.
40
6. Conclusão e Trabalhos Futuros
6.1 Conclusão
41
6.2 Limitações
42
aumento do consumo de recursos destinado à aplicação ou uma escalabilidade
horizontal, ou seja, aumentar a quantidade de instâncias da aplicação sendo
executadas no orquestrador.
43
7. Referências
44
[11] Histórico e Evolução dos computadores. Disponível em:
<https://histricoeevolucaodoscomputadores.wordpress.com/2016/> Acesso em: 23
jun 2019.
[12] CHANDLER, A. D. Século eletrônico: A história da evolução da indústria
eletrônica e de Informática. São Paulo: Campus, 2002.
[13] COUTINHO, Gustavo Leuzinger. Histórico e Evolução Era dos
Smartphones: Um estudo Exploratório sobre o uso dos Smartphones no
Brasil. 2014. 67 f., Universidade de Brasília, Brasília, 2014.
[14] Wikipédia: a enciclopédia livre. Disponível em:
<https://pt.wikipedia.org/wiki/Sistema_de_processamento_distribu%C3%ADdo>
Acesso em: 23 jun 2019.
[15] JARWAR, Muhammad Aslam; KIBRIA, Muhammad Golam; ALI, Sajjad.
Microservices in Web Objects Enabled IoT Environment for Enhancing
Reusability. 2017. Hankuk University Of Foreign Studies, Seoul, 2017.
[16] Comparando: Elasticsearch vs MongoDB. Disponível em:
<https://medium.com/data-hackers/comparando-elasticsearch-vs-mongodb-4b5932c
613d9> Acesso em: 23 jun 2019.
[17] Kubernetes the official documentation. Disponível em:
<https://kubernetes.io/docs/concepts/cluster-administration/logging/#cluster-level-log
ging-architectures> Acesso em: 23 jun 2019.
[18] YANG, Kaichuang. Aggregated Containerized Logging Solution with
Fluentd, Elasticsearch and Kibana. 2016. 150 v. Monografia (Especialização) -
Curso de Computer Applications, University Of International Relations, Beijing, 2016.
[19] Fluentd vs. Logstash: A Comparison of Log Collectors. Disponível em: <
https://logz.io/blog/fluentd-logstash/> Acesso em: 23 jun 2019.
[20] JAMES HAMILTON. Scada statistics monitoring using the elastic stack
(elasticsearch, logstash, kibana). Barcelona, Spain, 20 apr. 2017.
[21] Loading the Beats Dashboards. Disponível em:
<https://www.elastic.co/guide/en/beats/libbeat/1.3/load-kibana-dashboards.html>
Acesso em: 23 jun 2019.
[22] Fluentd vs. Logstash: A Comparison of Log Collectors. Disponível em:
<https://logz.io/blog/fluentd-logstash/> Acesso em: 30 jun 2019.
45
[23] Kubernetes the official documentation. Disponível em:
<https://kubernetes.io/docs/concepts/policy/resource-quotas/> Acesso em: 16 jun
2019.
[24] Fox, Geoffrey & Ishakian, Vatche & Muthusamy, Vinod & Slominski, Aleksander.
(2017). Status of Serverless Computing and Function-as-a-Service(FaaS) in
Industry and Research. 10.13140/RG.2.2.15007.87206.
[25] Building a Telegram Message Sender with OpenFaaS. Disponível em:
<https://medium.com/@lucasscassad/building-a-telegram-message-sender-with-ope
nfaas-1b7a5138998c> Acesso em: 16 jun 2019.
[26] Docker the official documentation. Disponível em:
<https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/#set-up-t
he-repository> Acesso em: 16 jun 2019.
46