Keda é um Event Driven Autoscaler baseado em Kubernetes. Com o KEDA, você pode controlar o dimensionamento de qualquer pod no Kubernetes com base no número de eventos que precisam ser processados.
Os detalhes sobre o funcionamento do Keda estão na doc: https://keda.sh/docs/concepts/
Neste tutorial será utilizada a versão 2.17 do Keda compatível com o Kubernetes 1.32. Você pode usar versões diferentes de acordo com a tabela de compatibilidade https://keda.sh/docs/operate/cluster/#kubernetes-compatibility
Pontos de atenção
- O Keda tem suporte a vários tipos de addons, também chamados de scalers. Ele servem para escalar os pods do deployment/statefulset. Neste tutorial serão considerados: o Cron, CPU e Memory por serem os mais simples de testar. Existem outros scalers disponíveis e você pode escolher o que mais se adequa à arquitetura da aplicação e regra de negócio: https://keda.sh/docs/scalers/
- O Keda só consegue gerenciar deployments e statefulset que não contenham
Horizontal Pod Autoscalers (HPA)
associado. Logo, é necessário remover o HPA nativo de cada uma das aplicações a serem gerenciadas pelos scalers do Keda. O próprio Keda irá criar um HPA com configurações diferentes para cada aplicação.
Exemplo de mensagem de erro ao aplicar uma configuração de scaledObject (do Keda) para uma aplicação que tem o HPA nativo do Kubernetes.
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 - Instale o Locust e a aplicação kube-pires conforme mostrado no tutorial: https://blog.aeciopires.com/instalando-o-locust-no-kubernetes-para-testes-de-carga/
Instalando o metrics-server (caso não exista)
ATENÇÃO!!! O cluster Kubernetes deve ter o metrics-server
instalado. Se ainda não estiver instalado, siga um dos links abaixo para instalar:
- https://gist.github.com/sanketsudake/a089e691286bf2189bfedf295222bd43?permalink_comment_id=4458547#gistcomment-4458547
- https://github.com/kubernetes-sigs/metrics-server
- https://artifacthub.io/packages/helm/metrics-server/metrics-server
Para instalar o metrics-server
, use os seguintes comandos:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
helm upgrade --install --set args={--kubelet-insecure-tls} metrics-server metrics-server/metrics-server --namespace kube-system
Instalando o KEDA no cluster kind k8s 1.32
Adicione o repositório Helm:
helm repo add kedacore https://kedacore.github.io/charts
Atualize todos os repositórios para garantir que o Helm conheça as versões mais recentes:
helm repo update
Pesquise todas as versões do Helm Chart do KEDA:
helm search repo kedacore/keda --versions
Para instalar o keda
, use o seguinte comando:
# ATTENTION!!! See table compatibility with Kubernetes: <https://keda.sh/docs/operate/cluster/#kubernetes-compatibility>
export KEDA_VERSION=2.17.0
# Install Keda and CRDs
helm upgrade --install keda \
kedacore/keda --version "$KEDA_VERSION" \
--namespace keda --create-namespace --debug --timeout=900s
Corrigindo problemas na instalação
Se olhar o pod do keda-operator
e encontrar no log a mensagem:
"Failed to watch *v1alpha1.ClusterCloudEventSource: failed to list *v1alpha1.ClusterCloudEventSource: clustercloudeventsources.eventing.keda.sh is forbidden: User \\"system:serviceaccount:keda:keda-operator\\" cannot list resource \\"clustercloudeventsources\\" in API group \\"eventing.keda.sh\\" at the cluster scope" logger="UnhandledError"
Aplique a correção abaixo conforme citados nos links:
Atenção!!! Isso é necessário pois o helm chart mais novo (até esse momento) foi lançado em Dez/2024, mas esse problema só foi corrigido em Jan/2025.
Edite a ClusterRole
do KEDA:
kubectl edit clusterrole keda-operator-minimal-cluster-role
No final do arquivo, adicione o seguinte trecho:
- apiGroups:
- eventing.keda.sh
resources:
- cloudeventsources
- cloudeventsources/status
- clustercloudeventsources
- clustercloudeventsources/status
verbs:
- get
- list
- patch
- update
- watch
Recrie o pod do keda-operator
:
kubectl get pod -n keda -l app=keda-operator
kubectl delete pod POD_NAME -n keda
Crie o cronScaleObject para cada aplicações alvo do teste
Como dito antes, neste tutorial será usado os scalers do tipo Cron, CPU e Memory. Mais detalhes sobre a configuração destes scalers podem ser encontrados nas docs:
- https://keda.sh/docs/2.17/scalers/cron/
- https://keda.sh/docs/2.17/scalers/cpu/
- https://keda.sh/docs/2.17/scalers/memory/
Foi criado o arquivo kube-pires-scaledobject.yaml
com o seguinte conteúdo (altere o período de agendamento, número de pods e percentual de uso de CPU e memória de acordo com a necessidade). Para auxiliar na sintaxe de agendamento do cron, você pode usar o site: https://crontab.guru/
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kube-pires
namespace: test
spec:
scaleTargetRef:
name: kube-pires
cooldownPeriod: 2
minReplicaCount: 2
maxReplicaCount: 30
triggers:
- type: cron
metadata:
timezone: America/Sao_Paulo
start: 42 10 * * *
end: 50 10 * * *
desiredReplicas: "30"
- type: cpu
metricType: Utilization # Allowed types are 'Utilization' or 'AverageValue'
metadata:
value: "50"
- type: memory
metricType: Utilization # Allowed types are 'Utilization' or 'AverageValue'
metadata:
value: "50"
O keda irá avaliar quando cada um desses eventos ocorrer: o periodo de agendamento, o consumo de CPU e memória. Em cada tipo de ocorrência, os pods serão escalados de acordo com a configuração realizada para cada evento:
- 8 pods de forma constante durante todo o período de agendamento;
- De 2 até 30 pods quando o uso de CPU e/ou memória atingir 50% fora do período de agendamento;
Esse conteúdo foi aplicado com os seguintes comandos:
# test é o mesmo namespace em que foi feito o deploy da aplicação kube-pires no tutorial: https://blog.aeciopires.com/instalando-o-locust-no-kubernetes-para-testes-de-carga/
export MY_NAMESPACE=test
kubectl apply -f kube-pires-scaledobject.yaml -n $MY_NAMESPACE
Como dito anteriormente, pode haver um erro na hora de criar o scaledobject se a aplicação alvo for gerenciada por um HPA nativo do Kubernetes. A solução é remover o HPA antes.
Obtendo informações sobre o KEDA
Liste os recursos do KEDA:
kubectl get all -n keda
Para começar a usar, implante os ScaledObjects
no cluster:
- Informações sobre Scaled Objects: https://keda.sh/docs/latest/concepts/
- Exemplos: https://github.com/kedacore/samples
Obtenha informações sobre os ScaledObjects
implantados:
kubectl get scaledobject [--namespace <namespace>]
Detalhes de um ScaledObject
específico:
kubectl describe scaledobject <scaled-object-name> [--namespace <namespace>]
Obtenha informações sobre TriggerAuthentications
implantados:
kubectl get triggerauthentication [--namespace <namespace>]
Detalhes de um TriggerAuthentication
específico:
kubectl describe triggerauthentication <trigger-authentication-name> [--namespace <namespace>]
Para visualizar os Horizontal Pod Autoscalers (HPA)
que o KEDA está gerenciando nos bastidores:
kubectl get hpa [--all-namespaces] [--namespace <namespace>]
Evidências dos testes
Keda escalando a aplicação kube-pires para 30 pods
de forma constante durante todo o período de agendamento.


Keda escalando a aplicação kube-pires para 2 pods
(mínimo) fora do período de agendamento.


Keda escalando a aplicação kube-pires para 16 pods
fora do período de agendamento, mas com alta demanda de CPU no microsserviço.

Resultado final do teste de carga na aplicação kube-pires
gerando alta demanda de CPU no microsserviço.

O Keda escalou os pods adequadamente sem variação no número de pods durante o período de agendamento.
Fora do período de agendamento, o Keda escalou os pods adequadamente de acordo com a métrica de CPU ou memória para cada aplicação.
Desinstalação
Para desinstalar/remover o Helm Chart do KEDA:
helm uninstall keda -n keda
Referências
- https://keda.sh/docs/operate/cluster/#kubernetes-compatibility
- https://keda.sh/docs/concepts/
- https://github.com/kedacore/keda/releases
- https://github.com/kedacore/keda/
- https://keda.sh/docs/concepts/scaling-deployments/
- https://keda.sh/docs/concepts/scaling-jobs/
- https://keda.sh/docs/concepts/authentication/
- https://keda.sh/docs/2.17/setupscaler/
- https://artifacthub.io/packages/helm/kedacore/keda
- https://keda.sh/docs/2.17/deploy/
- https://keda.sh/docs/2.17/scalers/cron/
- https://keda.sh/docs/2.17/scalers/cpu/
- https://keda.sh/docs/2.17/scalers/memory/
- https://keda.sh/docs/2.17/troubleshooting/
- https://crontab.guru/
Deixe um comentário