Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
June 23, 2021 01:18 pm GMT

Escalando aplicaes automaticamente no Kubernetes usando KEDA

Para quem ainda no conhece o KEDA (Kubernetes Event-Driven Autoscaling), :

Um componente leve e de finalidade nica que pode ser adicionado a qualquer cluster do Kubernetes. Funciona junto com componentes Kubernetes padro, como o Horizontal Pod Autoscaler (HPA) e pode estender a funcionalidade sem sobrescrever ou duplicao.
Retirado da documentao oficial

Foi lanado no fim de 2019 (anncio oficial) e fruto de uma parceria entre Microsoft & Red Hat.

E ele cumpre bem o lema, que : Application autoscaling made simple.

Nativamente o Kubernetes s permite configurar HPA com as mtricas de CPU e memria.
Se quiser escalar as aplicaes utilizando outro tipo de mtrica, por exemplo, lags de eventos ou filas, voc precisa primeiro criar um adaptador de mtricas (custom metrics) para extrair as mtricas da fonte desejada. Entretanto se precisar obter mtricas de vrias fontes usando vrios adaptadores, voc est sem sorte porque apenas um por vez compatvel (a menos que tenha mudado recentemente).

J o KEDA extrai de uma variedade de fontes e dimensiona automaticamente suas implantaes de 0 a N-instncias com base em sua configurao no ScaledObject.
Alt Text

Outro ponto interessante que o KEDA no reinventa a roda e no construiu seu prprio mecanismo de escalonamento, se aproveitando de HPAs do Kubernetes e dos secrets (TriggerAuthentication) j usados pelas aplicaes.

INSTALANDO O KEDA

As instrues para implantar o KEDA so muito simples e podem ser encontradas aqui.

Existem trs maneiras de implantar KEDA em seu cluster Kubernetes:

  • Helm charts
  • Operator Hub
  • Implantar YAMLs

Vamos usar a primeira opo.

helm repo add kedacore https://kedacore.github.io/chartshelm repo updatekubectl create ns kedahelm install keda kedacore/keda --namespace keda

Aps a instalao teremos 2 deployments (KEDA Operator e KEDA Metrics API) rodando no cluster

kubectl get deployment -n kedaNAME                              READY   UP-TO-DATE   AVAILABLE   AGEkeda-operator                     1/1     1            1           1hkeda-operator-metrics-apiserver   1/1     1            1           1h

e mais alguns CRDs disponveis:

kubectl api-resources --api-group=keda.shNAME                     SHORTNAMES       APIGROUP   NAMESPACED   KINDscaledjobs               sj               keda.sh    true         ScaledJobscaledobjects            so               keda.sh    true         ScaledObjecttriggerauthentications   ta,triggerauth   keda.sh    true         TriggerAuthentication

ScaledJobs*/ScaledObject: Os ScaledJobs/ScaledObjects mapeiam uma fonte de evento para a jobs/deployments que voc deseja dimensionar.
TriggerAuthentication: Se necessrio, este recurso contm a configurao de autenticao necessria para monitorar a origem do evento.

O "ScaledObject" tambm cria o HPA para voc.

  • O KEDA no apenas dimensiona deployments, mas tambm pode dimensionar seus jobs do Kubernetes. Em vez de ter muitos eventos processados em sua implantao e aumentar ou diminuir com base no nmero de mensagens que precisam ser consumidas, o KEDA pode ativar um trabalho para cada mensagem na origem do evento.

EXEMPLO COM KAFKA

Vamos dar uma olhada mais de perto no ScaledObject e Kafka trigger.

apiVersion: keda.sh/v1alpha1kind: ScaledObjectmetadata:  name: kafka-consumer-scaler  labels:    deploymentName: my-kafka-consumer-service  namespace: samplespec:  scaleTargetRef:    deploymentName: my-kafka-consumer-service  pollingInterval: 1        # Optional. Default: 30 seconds  cooldownPeriod:  30       # Optional. Default: 300 seconds  minReplicaCount: 0        # Optional. Default: 0  maxReplicaCount: 10   # Optional. Default: 100  triggers:    - type: kafka      metadata:        topic: test-topic-1        # brokerList: my-cluster-kafka-bootstrap.kafka:9092 - deprecated        bootstrapServers: my-cluster-kafka-bootstrap.kafka:9092            consumerGroup: my-kafka-consumerGroup        lagThreshold: '5'       # Default: 10        offsetResetPolicy: latest        allowIdleConsumers: false      authenticationRef:        name: keda-trigger-auth-kafka-credential    ## Optional: list of topics to trigger    #- type: kafka    #   metadata:    #     topic: test-topic-2    #     bootstrapServers: my-cluster-kafka-bootstrap.kafka:9092        #     consumerGroup: my-kafka-consumerGroup    #     lagThreshold: '5'     # Default: 10    #     offsetResetPolicy: latest    #     allowIdleConsumers: false    #   authenticationRef:    #     name: keda-trigger-auth-kafka-credential

O ScaledObject, TriggerAuthentication e a implantao referenciada em deploymentName precisam estar no mesmo namespace.

  • Apesar de serem valores opcionais, importante definir valores dentro dos padres para seu negcio nos parmetros minReplicaCount e maxReplicaCount. Para evitar rebalanceamento de parties no Kafka E/OU evitar que muitos pods sejam iniciados - consumindo todos os recursos do cluster .
  • O parmetro offsetResetPolicy pode ser earliest ou latest. Como o KEDA vai percorrer todos os tpicos, vale a pena entender como o cdigo (negcio) se comporta com duplicidade de eventos.

Por padro, o nmero de rplicas no exceder o nmero de parties em um tpico. Ou seja, se maxReplicaCount for definido mais do que o nmero de parties, o escalonador no vai atingir o valor definido. Caso queira mudar este comportamento, ajuste o parmetro allowIdleConsumers para true. Porm, se houver mais nmero de consumidores do que nmero de parties em um tpico, o consumidor extra ter que ficar ocioso.

Para facilitar criamos um usurio no Kafka com permisso de somente leitura (list e describe) em todos os grupos e tpicos e referenciamos no TriggerAuthentication o secret com este usurio:

apiVersion: keda.sh/v1alpha1kind: TriggerAuthenticationmetadata:  name: keda-trigger-auth-kafka-credential  namespace: samplespec:  secretTargetRef:  - key: sasl    name: keda-credentials    parameter: sasl  - key: username    name: keda-credentials    parameter: username  - key: password    name: keda-credentials    parameter: password

REFERNCIAS:

https://keda.sh/docs/2.3/
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
https://cloudblogs.microsoft.com/opensource/2020/04/06/kubernetes-event-driven-autoscaling-keda-cncf-sandbox-project/
https://keda.sh/resources/

AGRADECIMENTOS

Obrigado todos os envolvidos que me incentivaram a escrever este artigo e revisaram o texto:

  • Felipe Lamaro Silva (@lipekis)
  • Willian Itiho (@Willian_Itiho)
  • Rafael Gomes (@gomex)

Original Link: https://dev.to/willianccs/escalando-aplicacoes-automaticamente-no-kubernetes-usando-keda-c41

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To