Kubernetes + Apache Kafka + KEDA: escalando aplicações que processam eventos com facilidade
Esta imagem/print traz uma aplicação no momento exato em que a mesma escala num cluster Kubernetes, utilizando para isto o projeto KEDA (Kubernetes Event-driven Autoscaling) + a ferramenta de linha de comando k9s e tomando por base o número de eventos acumulados em um tópico do Apache Kafka.
Apresentei inclusive um exemplo similar em uma live recente no Canal .NET, cujo conteúdo pode ser assistido gratuitamente no YouTube:
Já disponibilizei toda a configuração que utilizei neste exemplo como um repositório no GitHub:
Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá!
Neste caso utilizei o Kafka a partir de uma instância do Azure Event Hubs (através da porta 9093), uma solução oferecida pela nuvem Microsoft para streaming e processamento de eventos. A listagem a seguir traz o Secret em que foram criadas as configurações esperadas para este deployment no Kubernetes:
O próprio Deployment (baseado na imagem pública renatogroffe/workerquestao-kafka-appinsights-dotnet6) referencia este Secret:
Mas o que faz então nossa aplicação escalar?
Isto acontecerá através da configuração de um ScaledObject, estrutura provida pelo KEDA e que aponta para o Deployment descrito anteriormente.
Neste tipo de objeto teremos o número mínimo e máximo de réplicas Pods que serão criados (minReplicaCount e maxReplicaCount), o período em segundos que servirá de base para que o KEDA aloque ou desaloque mais instâncias, a seção triggers com a configurações para a escalabilidade com Kafka (lagThreshold indica a quantidade de eventos acumulados em um tópico que serve de métrica para escalar a aplicação) e authenticationRef referenciando as permissões de acesso:
As permissões de acesso para este exemplo foram indicadas em um TriggerAuthentication, outra das estruturas oferecidas pelo KEDA:
O deployment de todas essas estruturas aconteceu através do comando a seguir:
kubectl apply -f <ARQUIVO YAML> -n votacao
Em que <ARQUIVO .YAML> indica o YAML com as configurações de cada objeto, com a criação do mesmo ocorrendo no namespace votacao.
E como configurar o KEDA no Kubernetes? Trata-se de uma tarefa relativamente simples, bastando para isto realizarmos um deployment via chart Helm em um namespace criado especificamente para esse fim. Tal ajuste possibilitará então controlar a escalabilidade de qualquer aplicação que possua um ScaledObject em um cluster:
Além do próprio Kafka, o KEDA conta triggers para facilitar a escalabilidade de aplicações baseadas em outras tecnologias como RabbitMQ, Azure Service, Azure Event Hubs, Amazon SQS e muito mais. No post a seguir trago um outro exemplo de uso do KEDA:
Kubernetes: dicas, truques, conteúdos gratuitos… | Abril-2022
Para saber mais aqueles que ficaram curiosos sobre a ferramenta k9s (uma alternativa gratuita para se acessar um cluster Kubernetes em uma interface gráfica via linha de comando), deixo o link de um artigo que publiquei também neste blog:
K9s: monitoramento, gerenciamento e testes com Kubernetes sem complicações