Locust é uma ferramenta de código fonte aberto usada para fazer testes de desempenho/carga no protocolo HTTP e outros.
Os testes do Locust podem ser executados a partir da linha de comando ou usando sua interface web. A taxa de transferência, os tempos de resposta e os erros podem ser visualizados em tempo real e/ou exportados para análise posterior.
O Locust permite a escrita e execução de códigos e bibliotecas Python para a execução dos testes, simulando usuários interagindo com o site.
Um caso de uso no Kubernetes é usar Locust para testar a carga de uma aplicação web (backend ou frontend) para estudar o comportamento e o scaling gerenciados pelo Horizontal Pod Autoscaling (HPA), o Keda ou Knative.
Requisitos
- Neste tutorial, usaremos o Kind para simular um cluster Kubernetes rodando localmente. Se você tiver acesso a cluster on-premisse ou gerenciado na cloud pelo EKS, GKE, AKS, DKS ou outro, pode ignorar o uso do kind.
- Também será necessário o uso do D
ocker
,kubectl
, git ehelm
. Esses softwares podem ser instalados seguindo o tutorial disponível em: https://github.com/aeciopires/adsoft/blob/master/REQUIREMENTS.md
Instalando uma aplicação de teste
Para este ambiente de testes, vamos instalar a aplicação kube-pires, uma simples aplicação web desenvolvida em Golang, que exibe algumas informações do pod de acordo com o endpoint acessado:
/
=> Exibe o nome do host, o nome da interface e os endereços IP;/health
=> Exibe o status da aplicação;/metrics
=> Exibe as métricas no formato suportado pelo Prometheus;/env
=> Exibe as variáveis de ambiente;/css
=> Exibe o modelo CSS;
Acesse o cluster Kubernetes.
Crie o namespace test
com o seguinte comando:
kubectl create namespace test
Faça o deploy da aplicação kube-pires
com os seguintes comandos.
cd /tmp
git clone https://gitlab.com/aeciopires/kube-pires.git
cd kube-pires/helm-chart/
helm upgrade --install kube-pires -f values.yaml . -n test --create-namespace
Referência: https://gitlab.com/aeciopires/kube-pires/-/tree/master/helm-chart?ref_type=heads
Instalação do Locust via helm
Adicione o repositório helm e atualize a lista de helm charts disponíveis para instalação.
helm repo add deliveryhero https://charts.deliveryhero.io
helm repo update
Clone o seguinte repositório git.
cd /tmp
git clone https://github.com/deliveryhero/helm-charts.git
Edite o conteúdo do arquivo main.py
com as informações do script apontando para a URL da integração que deseja usar nos testes, como mostra o exemplo abaixo.
nano /tmp/helm-charts/stable/locust/locustfiles/example/main.py
Conteúdo do main.py
customizado para testes da aplicação kube-pires
from locust import HttpUser, TaskSet, task, between
import random
class SiteUser(HttpUser):
# Define a taxa de "spawn" de usuários entre 1 e 5 segundos (com base na frequência de geração dos usuários)
# Configura o intervalo de tempo entre as requisições que cada usuário simulado vai fazer.
# O valor between(1, 5) significa que o Locust irá esperar entre 1 e 5 segundos entre as requisições feitas.
wait_time = between(1, 5)
# Define as páginas que serão acessadas durante o teste de carga.
pages = [
"http://kube-pires.test.cluster.local/metrics",
"http://kube-pires.test.cluster.local/health",
"http://kube-pires.test.cluster.local/env",
]
# Este método simula o acesso à página principal
@task(1)
def load_home_page(self):
"""Acessa a página inicial"""
self.client.get("http://kube-pires.test.cluster.local/")
# Este método acessa páginas aleatórias dentro da lista pages para simular a navegação do usuário.
@task(2)
def browse_pages(self):
"""Acessa uma página aleatória"""
page = random.choice(self.pages)
self.client.get(page)
class WebsiteUser(HttpUser):
tasks = [SiteUser] # Aqui é especificado que os usuários simulados irão realizar as tarefas da classe SiteUser
min_wait = 1000 # Tempo mínimo de espera entre as requisições
max_wait = 2000 # Tempo máximo de espera entre as requisições
Acesse o cluster Kubernetes.
Execute o seguinte comando para criar um configmap
contendo o conteúdo do script citado anteriormente.
Altere o nome do namespace na variável
$MYNAMESPACE
de acordo com o ambiente.
export MYNAMESPACE="test"
kubectl create namespace $MYNAMESPACE
kubectl -n $MYNAMESPACE create configmap my-loadtest-locustfile --from-file /tmp/helm-charts/stable/locust/locustfiles/example/main.py
No mesmo path do script main.py
, existe as libs, podendo ser alteradas em caso de necessidade. No exemplo que temos, basta aplicar o seguinte comando seguinte para criar outro configmap
referente as libs.
kubectl -n $MYNAMESPACE create configmap my-loadtest-lib --from-file /tmp/helm-charts/stable/locust/locustfiles/example/lib/
Serão criados os seguintes configmaps: my-loadtest-lib
e my-loadtest-locustfile
. Eles podem ser visualizados com o seguinte comando:
kubectl get configmap -n $MYNAMESPACE
Por padrão, o helm chart vem com o arquivo /tmp/helm-charts/stable/locust/values.yaml
configurado para fazer uso da imagem Docker locustio/locust
na versão 2.32.2
, caso seja necessário alterar, é possível visualizar outras versões dessa imagem disponível em https://hub.docker.com/r/locustio/locust/tags.
Como neste caso, eu só preciso alterar alguns poucos valores, vou ignorar o uso do arquivo
values.yaml
e configurar algumas coisas usando o parâmetro--set
do helm.O paramêtro
--set worker.replicas
determina quantos pods work do locust serão instanciados no teste. Neste caso, estarei usando 10. Isso afeta diretamente nos resultados dos testes. Cada worker tende a usar 1 CPU inteira. Poucos workers pode dar a impressão que sua aplicação é lenta ou não aguenta uma carga alta de requisições, mas na verdade pode ser o Locust não conseguindo fazer mais requisições paralelas. Por isso é importante aumentar esse valor para descobrir o limite real de requisições simultâneas que a aplicação suporta.
Com os configmap criados no cluster, execute o seguinte comando para instalar o locust:
LOCUST_VERSION="2.33.2"
CHART_VERSION="0.31.6"
helm -n $MYNAMESPACE upgrade --install locust deliveryhero/locust \
--set image.tag=$LOCUST_VERSION \
--set loadtest.name=my-loadtest \
--set loadtest.locust_locustfile_configmap=my-loadtest-locustfile \
--set loadtest.locust_lib_configmap=my-loadtest-lib \
--set worker.replicas=10 \
--version $CHART_VERSION \
--debug --timeout=900s
O acesso à interface web pode ser feito por meio do port-forward:
kubectl -n $MYNAMESPACE port-forward service/locust 8089:8089
E acessado no browser por meio da URL: http://127.0.0.1:8089
Abaixo estão algumas imagens com o resultado dos testes com o Locust
Imagem 1 – Gráficos de desempenho no Locust

Audiodescrição: A imagem exibe três gráficos:
Começa em 0 e vai até 50 usuários em questão de segundos.
Total Requests per Second (RPS):
- Um gráfico de linha mostrando o número de requisições por segundo em vermelho.
- A linha mostra crescimento constante até cerca de 8 requisições por segundo.
- O gráfico também mostra 100% de falhas (linha vermelha constante).
Response Times (ms):
- Gráfico com duas linhas:
- Laranja: 50º percentil (tempo de resposta mediano).
- Roxo: 95º percentil (tempo de resposta dos piores 5%).
- Mostra aumento gradual dos tempos, com o 95º percentil chegando a cerca de 16 ms.
Number of Users:
- Linha azul representando o número de usuários virtuais.
Imagem 2 – Estatísticas detalhadas por rota

Audiodescrição: A imagem mostra uma tabela com dados estatísticos sobre as requisições feitas:
- Cada linha corresponde a uma rota HTTP testada:
/
,/env
,/health
e/metrics
. - Para cada rota, são mostradas as seguintes informações:
- # Requests: Total de requisições feitas.
- # Fails: Total de falhas (todas as requisições falharam, 100% de falhas).
- Median (ms): Mediana do tempo de resposta (3 ms para todas).
- 95%ile / 99%ile: Percentis 95 e 99 do tempo de resposta.
- Average / Min / Max (ms): Média, mínimo e máximo tempo de resposta.
- Current RPS: Requisições por segundo por rota.
- Current Failures/s: Falhas por segundo por rota.
No topo da tela aparecem os dados globais do teste:
- FAILURES: 100%
- HOST: http://kube-pires.test.cluster.local
- USERS: 50
- WORKERS: 10
- RPS: 8.1
Alterações no script do Locust
Se precisar fazer ajustes no script… após os ajustes, remova o configmap my-loadtest-locustfile
kubectl -n $MYNAMESPACE delete configmap my-loadtest-locustfile
Crie o configmap com as novas configurações de payload
nano /tmp/helm-charts/stable/locust/locustfiles/example/main.py
kubectl -n $MYNAMESPACE create configmap my-loadtest-locustfile --from-file /tmp/helm-charts/stable/locust/locustfiles/example/main.py
Faça o rollout do deployment para atualizar o pod.
kubectl rollout restart deployment/locust-master -n $MYNAMESPACE
Exemplo da interface web do locust, exibindo os resultados após os testes
Removendo os configmaps
Execute o seguinte comando:
kubectl -n $MYNAMESPACE delete configmap my-loadtest-lib my-loadtest-locustfile
Removendo o locust
Execute o seguinte comando:
helm -n $MYNAMESPACE uninstall locust
Locust por linha de comando
Para executar o Locust por terminal é necessário estar conectado no cluster que contém o Locust aplicado, como descrito no passo anterior. Assim, acessar o pod locust-master executando os passos a seguir.
NAMESPACE="CHANGE HERE"
# Descobrir o nome do pod locust
kubectl get pod -n $MYNAMESPACE
POD_NAME="CHANGE HERE"
# Acessar o pod do locust
kubectl exec -it pod/$POD_NAME -n $MYNAMESPACE -- bash
Dentro do pod, o Locust permite setar os seguintes parâmetros para execução:
Parâmetros | Descrição |
---|---|
-u | Quantidade de usuários |
-r | Quantidade de usuários que são iniciados por segundo (ramp up) |
-t | Duração do teste |
--headless | Sem cabeçalho na requisição |
--html | Gera um relatório em html |
--csv | Exporta os dados em CSV |
--host | Host alvo dos testes |
Exemplo:
locust -f main.py --headless -u 800 -r 800 -t 5m --html report.html --csv dados.csv --host
Para exportar o relatório dados.csv gerado pelo teste executado, em outro terminal execute o comando:
POD_NAME="CHANGE HERE"
NAMESPACE="CHANGE HERE"
LOCAL_DIR="CHANGE HERE" # Local que deseja armazenar o relatório do teste executado
kubectl cp $POD_NAME:/home/locust/dados.csv /$LOCAL_DIR/ -n $MYNAMESPACE
Deixe um comentário