# ============================================================================= # KEDA ScaledObject - Auto-scaling baseado em métricas do Victoria Metrics # ============================================================================= # # O que é KEDA? # KEDA (Kubernetes Event-driven Autoscaling) permite escalar deployments # baseado em métricas externas, como Prometheus, Victoria Metrics, RabbitMQ, etc. # # Como funciona? # 1. KEDA consulta o Victoria Metrics a cada 'pollingInterval' segundos # 2. Se a métrica ultrapassar o 'threshold', ele escala UP # 3. Se a métrica ficar abaixo do 'threshold', ele escala DOWN # 4. O KEDA cria um HPA (Horizontal Pod Autoscaler) automaticamente # # ============================================================================= apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: node-bugado-scaledobject spec: # --------------------------------------------------------------------------- # CONFIGURAÇÃO BÁSICA # --------------------------------------------------------------------------- # Deployment que será escalado scaleTargetRef: name: node-bugado # Limites de réplicas minReplicaCount: 5 # Nunca menos que 5 pods (alta disponibilidade) maxReplicaCount: 30 # Nunca mais que 30 pods (limite de recursos) # Frequência de verificação das métricas pollingInterval: 1 # Verifica a cada 1 segundo (mínimo possível) # Valores menores = reação mais rápida # Valores maiores = menos carga no Victoria Metrics # Tempo de espera antes de iniciar scale down cooldownPeriod: 5 # Aguarda 5s após métricas normalizarem # Evita scale down prematuro # --------------------------------------------------------------------------- # COMPORTAMENTO DO HPA (Horizontal Pod Autoscaler) # --------------------------------------------------------------------------- advanced: horizontalPodAutoscalerConfig: behavior: # SCALE UP - Quando precisa de mais pods scaleUp: stabilizationWindowSeconds: 0 # Sem espera - escala imediatamente policies: - type: Pods value: 5 # Adiciona 5 pods de cada vez periodSeconds: 1 # A cada 1 segundo pode adicionar mais # Exemplo: 5 -> 10 -> 15 -> 20 -> 25 -> 30 (em 5 segundos) # SCALE DOWN - Quando pode reduzir pods scaleDown: stabilizationWindowSeconds: 10 # Aguarda 10s de métricas estáveis policies: - type: Percent value: 50 # Remove 50% dos pods por vez periodSeconds: 5 # A cada 5 segundos # Exemplo: 30 -> 15 -> 8 -> 5 (em 10 segundos) # --------------------------------------------------------------------------- # TRIGGERS - Métricas que disparam o scaling # --------------------------------------------------------------------------- triggers: # ------------------------------------------------------------------------- # TRIGGER 1: Pods Indisponíveis # ------------------------------------------------------------------------- # Métrica: kube_deployment_status_replicas_unavailable # Origem: kube-state-metrics (coletado pelo Victoria Metrics) # Comportamento: Escala quando há pods que não estão prontos para receber tráfego # - type: prometheus metadata: # Endereço do Victoria Metrics (compatível com API do Prometheus) serverAddress: http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring:8428 # Query PromQL - conta pods indisponíveis do deployment node-bugado query: | kube_deployment_status_replicas_unavailable{deployment="node-bugado", namespace="default"} # threshold: valor da métrica que dispara o scaling # Se unavailable >= 1, adiciona pods threshold: '1' # activationThreshold: valor mínimo para ativar o scaler # Só começa a escalar se unavailable >= 1 activationThreshold: '1' # ------------------------------------------------------------------------- # TRIGGER 2: Restarts Frequentes # ------------------------------------------------------------------------- # Métrica: kube_pod_container_status_restarts_total # Origem: kube-state-metrics (coletado pelo Victoria Metrics) # Comportamento: Escala quando pods estão reiniciando muito (indica problemas) # - type: prometheus metadata: serverAddress: http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring:8428 # Query PromQL - soma de restarts nos últimos 2 minutos # increase() calcula o incremento no período # sum() agrega todos os pods do deployment query: | sum(increase(kube_pod_container_status_restarts_total{namespace="default", pod=~"node-bugado.*"}[2m])) # Se houve 1 ou mais restarts nos últimos 2 min, escala threshold: '1' activationThreshold: '1' # ============================================================================= # COMANDOS ÚTEIS PARA DEBUG # ============================================================================= # # Ver status do ScaledObject: # kubectl get scaledobject # kubectl describe scaledobject node-bugado-scaledobject # # Ver HPA criado pelo KEDA: # kubectl get hpa # kubectl describe hpa keda-hpa-node-bugado-scaledobject # # Testar queries no Victoria Metrics: # kubectl run curl --rm -it --restart=Never --image=curlimages/curl -- \ # -s "http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring:8428/api/v1/query?query=kube_deployment_status_replicas_unavailable" # # Ver logs do KEDA operator: # kubectl logs -n keda -l app=keda-operator # # =============================================================================