O documento discute performance engineering e testes de carga usando a ferramenta k6. Ele introduz k6 e mostra como desenvolver testes de performance, construir uma solução escalável no Kubernetes usando k6 para validar a solução, e conclui com as vantagens de usar k6 e estratégias de performance engineering.
2. Motivação
Performance Engineering
Teste de Performance e Monitoramento
Introdução ao k6
Desenvolvendo testes
Construindo e Testando uma solução escalável no Kubernetes
Agenda
Conclusões
2
3. Quemsoueu
Lugares onde trabalhei e aprendi muito
3
Kelvin Silva – Arquiteto de Soluções na
Lugares onde aprendi muito
Coisas que eu gosto
11. Performance
Engineering
Performance Engineering, ou Engenharia de Performance,
é um conjunto de técnicas e estratégias aplicadas no ciclo
de vida de um sistema para tentar garantir requisitos não
funcionais de estabilidade, confiabilidade, escalabilidade e,
enfim, capacidade de resposta do sistema em meio à um
caos
20. Testes de Performance
Como criar meus testes de performance?
Quantos usuários devo suportar? Quantos usuários temos
previsão para suportar?
Meu sistema está crescendo?
Qual o meu tempo de resposta aceitável?
Quanto estou disposto a gastar?
Quanto estou disposto a perder??
Conheço meus clientes?
20
24. Métricas de Performance
Número de Usuários
Chamadas por Segundo
Erros por Segundo
Tempo de Resposta
24
Throughput
Server Connect Time
Internal Integration Data
Conheça seu cliente!
25. Monitoramento+ KPIs
Monitoramento de KPIs
em teste e produção
Como seu sistema está
se comportando durante
a semana?
Serviços mais usados
Tendência de métricas*
25
Monitore ambientes
produtivos para desenvolver
testes de performance
assertivos
27. 27
K6 é uma ferramenta open-source de teste de
performance.
- Dockerizado por natureza
- Integração facilitada para integrações externas
(influxDB, Grafana, etc)
- Suporta NPM com Webpack
- Escrita em GoLang, interface em Javascript
- Facilidade em criar um framework de testes de
performance
- Facilidade e liberdade em customizar os testes
- Extremamente performático
k6
28. 28
- Lançado em 2017
- Escrito em Go
- Originalmente, chamado e mantido pela Load
Impact – "Load Testing as a Service". Embora seja
OpenSource, e dado o devido sucesso do
k6, a empresa passou a se chamar k6.
- Nome k6: o projeto se chamava "speedboat",
avaliaram o nome como Kapablo, mas ouve um
desacordo sobre o nome final. Para ser fácil via CLI,
resumiram, então, o nome para k6. Como
k6 também é o nome de uma montanha, a logo é
uma homenagem à montanha e à gráficos de
testes de performance!
k6
36. Overview
• Utilizando o k6 para validar o que faremos agora, vamos construir uma aplicação no Kubernetes com
auto scaling configurado.
• HPA significa HorizontalPodAutoscaler
36
37. Passo 0: Clonar o repositório do projeto
• Clonar o repositório do exemplo.
$ git clone
https://github.com/KelvinKSPS/example-kubernetes-autoscaling-nodejs-api
• Acompanhar post que motivou este exemplo da apresentação:
$ open shorturl.at/psLOT
37
38. Passo 1: Server
• Vamos criar um servidor que gerencia os dados de todos os eventos do DevTestBR. Vamos adicionar as
métricas preparadas para o Prometheus - uma plataforma open source de monitoramento.
38
NodeJS: Plataforma assíncrona orientada à eventos criada para
desenvolver sistemas escaláveis em Javascript.
39. Passo 2: Kubernetes
Kubernetes é uma plataforma de código aberto que automatiza a
implantação, dimensiona e gerencia aplicativos em contêineres.
39
Fazer deploy da nossa aplicação no Kubernetes
40. Passo 2: Instalação do Kubernetes
O Minikube é uma implementação leve do Kubernetes que cria uma
VM em sua máquina local e implanta um cluster simples contendo
apenas um nó. O Minikube está disponível para sistemas Linux, macOS
e Windows
40
Entretanto, para este caso, iremos usar o minikube.
41. Passo 2: Instalação do Kubernetes
Kubectl é um utilitário de linha de comando que se conecta ao servidor API,
usado pelos administradores para criar pods, deployments, serviços, etc.
Vamos usa-lo bastante para gerenciar nosso cluster.
41
Uma vez instalado o minikube, iremos fazer o deploy do nosso servidor utilizando o kubectl.
42. Passo 3: Configurando o kubernetes
42
Com o kubectl, vamos configurar alguns itens para facilitar nosso desenvolvimento no Kuberbetes.
# habilitando o dashboard do kubernetes
$ minikube addons enable dashboard
# habilitando o ingress, uma interface via API para definir regras e permitir acesso
externo para os serviços dentro do cluster:
$ minikube addons enable ingress
$ minikube addons enable ingress-dns
# habilitando o tunnel para acessar as portas do cluster através da web:
$ minikube tunnel
# acessando o dashboard do kubernetes
$ minikube dashboard
43. Passo 4: Deploy do kube State Metrics
43
kube State Metrics coleta várias métrricas sobre os serviços que estão rodando no Kubernetes, através das APIs.
# Clona o repositório do kube State Metrics
$ git clone https://github.com/devopscube/kube-state-metrics-configs.git
# Cria os objetos do repositório recém criado:
$ kubectl apply -f kube-state-metrics-configs/
# Verifica se o deploy foi realizado corretamente.
$ kubectl get deployments kube-state-metrics -n kube-system
44. Passo 5: Deploy do Prometheus
44
Prometheus é um sistema de monitoramento para serviços e aplicações. Ele coleta as métricas de seus alvos em
determinados intervalos, avalia expressões de regras, exibe os resultados e também pode acionar alertas se alguma
condição for observada como verdadeira.
Na pasta raíz do projeto:
# Criar um namespace no kubernetes
$ kubectl create namespace monitoring
# Criar um clusterRole
$ kubeclt create –f prometheus/clusterRole.yaml
# Criar um Config Map para não precisar buildar o Prometheus toda hora que for
# adicionar ou remover configurações
$ kubectl create –f prometheus/config-map.yaml
# Enfim, deploy do prometheus
$ kubectl create -f prometheus/prometheus-deployment.yaml
45. Passo 6: Externalizar Prometheus
45
Externalizando o Prometheus, podemos acessar o mesmo do lado de fora do k8s.
# Copiar o nome da pod do Prometheus
$ kubectl get pods --namespace=monitoring
# Criar o encaminhamento de porta pelo kubectl
$ kubectl port-forward prometheus-monitoring-<id-da-pod> 8080:9090 -n monitoring
46. Passo 7: Instalar influxDB (V1) e Grafana local ou no k8s
46
Depende do OS, mas, basicamente, é como se fosse instalar uma aplicação comum ou fazer deploy de uma imagem.
InfluxDB => É um banco de dados de código aberto designado para lidar com um alto volume de consultas e
escritas por segundo sem causar muito impacto no sistema operaciona
Grafana => O Grafana é uma plataforma para visualizar e analisar métricas por meio de gráficos. Ele tem suporte
para diversos tipos de bancos de dados — tanto gratuitos quanto pagos — e pode ser instalado em qualquer
sistema operacional.
47. Passo 8: Adicionar dados para o Grafana
47
Iremos indicar ao Grafana as fontes de dados que devem ser monitoradas.
No Grafana, vá em Configuration > Data Sources. Adicione os seguintes sources:
•
influxDB:
Name: InfluxDB-K6
• URL: http://localhost:8086
• Access: Server
• Database: k6
• HTTP Method: GET
• Min time interval: 5s
•
Prometheus:
*Name: InfluxDB-K6
•URL: http://<prometheus ip
address>:8080/
•Access: Server
•Scrape interval: 5s
•Query timeout: 30s
•HTTP Method: GET
48. Passo 9: KEDA
48
KEDA significa Kubernetes Event Driven Autoscaler.
Com o KEDA, podemos configurar nossas pods ou
nossos deployments para escalar
conforme regras que estabelecemos.
49. Passo 9: Configurando o KEDA
49
Configurando o KEDA
# Deploy KEDA to Kubernetes
$ kubectl apply -f
https://github.com/kedacore/keda/releases/download/v2.2.0/ked
a-2.2.0.yaml
# Deploy our scalers configurations to keda
$ kubectl apply -f keda/keda-prometheus-scaledobject
50. Passo 10: Dashboard
5
0
No Grafana, selecione para importar um
Dashboard e selecione o
arquivo grafana/devtestbr-metrics-
dashboard.json
52. Passo 11: Enfim, vamos testar!
52
# Pegar o IP do serviço
$ kubectl get services
ENDPOINT=http://{ip serviço}:4000/devtestbr k6 run -o influxdb=http://localhost:8086/k6
performance-test.js
ou
ENDPOINT=http://{ip serviço}:4000/devtestbr k6 run performance-test.js
54. Algumas conclusões
54
• Performance não é apenas teste de carga. Teste de carga sem conhecer e investigar as necessidades de seu
projeto pode ser uma perda de tempo.
• Existem diferentes tipos de teste de performance. Novamente, basta investigar as necessidades de seu projeto.
• Monitoramento e Análise de Dados ajudam a compreender melhor sua aplicação.
• Estratégias de Arquitetura do projeto pode ajudar a evitar problemas futuros de performance.
• k6 é uma ferramenta muito poderosa e leve para executar testes.
• k6 é poderoso por ser escrito em Go. Acessível por possuir a interface em Javascript.
• Utilizando uma boa ferramenta de teste com estratégias de monitoramento ajuda a verificar configurações de
infra-estrutura, mesmo em produção.
58. Repositórios
• Framework com npm:
https://github.com/KelvinKSPS/k6-with-npm
• K6 com K8s:
https://github.com/KelvinKSPS/example-kubernetes-autoscaling-nodejs-api
• Contato:
https://linkedin.com/in/kelvin-ksps
58
59. Referências: Performance
•Correlsense, 2012. An Introduction to Software Performance Engineering
•Rebecca Clinard, 2017. Top 10 performance engineering techniques that work
•Amber Race, 2017. How to create highly effective performance tests
•Peco Karayanev, 2018. Why a Big Data Approach is Key for APM
•Mark Tomlinson, Perze Ababa, et al., 2017. A Quick Start Guide To Learning Performance Testing
•TangoWhisky37 - Peformance BOK
59