Autoscaling orientado a eventos no Kubernetes usando o Keda

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

  1. 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/
  2. 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.

Requisitos

  1. 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.
  2. Também será necessário o uso do Dockerkubectlgit e helm. Esses softwares podem ser instalados seguindo o tutorial disponível em: https://github.com/aeciopires/adsoft/blob/master/REQUIREMENTS.md
  3. 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:

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

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm search repo kedacore/keda --versions
# 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

"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"

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.

kubectl edit clusterrole keda-operator-minimal-cluster-role
  - apiGroups:
    - eventing.keda.sh
    resources:
    - cloudeventsources
    - cloudeventsources/status
    - clustercloudeventsources
    - clustercloudeventsources/status
    verbs:
    - get
    - list
    - patch
    - update
    - watch
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

---
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"
  • 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;
# 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

Obtendo informações sobre o KEDA

kubectl get all -n keda
kubectl get scaledobject [--namespace <namespace>]
kubectl describe scaledobject <scaled-object-name> [--namespace <namespace>]
kubectl get triggerauthentication [--namespace <namespace>]
kubectl describe triggerauthentication <trigger-authentication-name> [--namespace <namespace>]
kubectl get hpa [--all-namespaces] [--namespace <namespace>]

Evidências dos testes

Desinstalação

helm uninstall keda -n keda

Referências

Categories: , , , , , , ,

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *