# ============================================================================= # 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: 0 # Sem espera - escala imediatamente policies: - type: Pods value: 10 # Remove 10 pods por vez periodSeconds: 1 # A cada 1 segundo # Exemplo: 30 -> 20 -> 10 -> 5 (em 3 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 metricType: AverageValue # desiredReplicas = ceil(metricValue / threshold) metadata: # Endereço do Victoria Metrics (compatível com API do Prometheus) serverAddress: http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring:8428 # Query PromQL - calcula réplicas desejadas diretamente # Fórmula: 5 (base) + (pods_unavailable * 2) # Exemplos: # 0 unavailable → 5 réplicas (mínimo) # 3 unavailable → 5 + 6 = 11 réplicas # 5 unavailable → 5 + 10 = 15 réplicas query: | 5 + (kube_deployment_status_replicas_unavailable{deployment="node-bugado", namespace="default"} * 2) # threshold: cada 1 unidade da query = 1 réplica desejada # Com query=5 (0 unavailable): desiredReplicas = 5 (mínimo) # Com query=15 (5 unavailable): desiredReplicas = 15 threshold: '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 # # =============================================================================