¿Qué hace debug-buttercup?
Depura el sistema de razonamiento cibernético (CRS) Buttercup que se ejecuta en Kubernetes. Utilízalo al diagnosticar caídas de pods, bucles de reinicio, fallos de Redis, presión de recursos, saturación de disco, problemas con DinD o cualquier mal funcionamiento de servicios en el namespace crs. Cubre triaje, análisis de logs, inspección de colas y patrones de fallo comunes para: redis, fuzzer-bot, coverage-bot, seed-gen, patcher, build-bot, scheduler, task-server, task-downloader, program-model, litellm, dind, tracer-bot, merger-bot, competition-api, pov-reproducer, scratch-cleaner, registry-cache, image-preloader, ui.
Triaje Inicial
- Verificar el estado del clúster:
kubectl get nodes -o wide kubectl describe nodes # Buscar presión de recursos (MemoryPressure, DiskPressure, PIDPressure) - Verificar el estado general del namespace
crs:kubectl -n crs get all kubectl -n crs get pods -o wide # Identificar pods en estado CrashLoopBackOff, Error, ImagePullBackOff, etc. - Analizar logs de los pods problemáticos:
kubectl -n crs logs <pod-name> --tail=100 kubectl -n crs logs <pod-name> --previous # Si el pod se reinició
Diagnóstico por Servicio
Redis (redis)
- Síntoma: Caídas o lentitud.
- Acción:
- Obtener métricas de Redis desde dentro del clúster:
kubectl -n crs exec -it <redis-pod> -- redis-cli INFO all - Revisar el uso de memoria (métrica
used_memory_human), número de conexiones (connected_clients) y eventos expulsados (evicted_keys). - Buscar en los logs del pod de Redis errores de persistencia (RDB/AOF) o falta de memoria.
- Obtener métricas de Redis desde dentro del clúster:
Fuzzer-Bot (fuzzer-bot)
- Síntoma: Pods atascados, no procesa trabajo.
- Acción:
- Inspeccionar la cola de trabajo en Redis:
kubectl -n crs exec -it <redis-pod> -- redis-cli LLEN fuzzer_queue - Revisar logs del pod en busca de timeouts de conexión a Redis o errores de inicialización.
- Verificar el consumo de CPU y memoria; puede necesitar más recursos.
- Inspeccionar la cola de trabajo en Redis:
Coverage-Bot (coverage-bot)
- Síntoma: No actualiza la cobertura o falla.
- Acción:
- Verificar la conectividad con el almacenamiento de cobertura (por ejemplo, un bucket S3 o un volumen compartido).
- Revisar logs en busca de errores de escritura o permisos.
- Confirmar que el agente de cobertura (por ejemplo,
sancov) esté instalado y en la versión correcta.
Seed-Gen (seed-gen)
- Síntoma: No genera seeds o se cuelga.
- Acción:
- Verificar que el directorio de entrada/salida de seeds exista y tenga los permisos adecuados.
- Revisar logs en busca de errores relacionados con el motor de generación (por ejemplo, AFL++ o libFuzzer).
- Asegurarse de que los binarios necesarios estén compilados correctamente.
Patcher (patcher)
- Síntoma: Fallos al aplicar parches.
- Acción:
- Verificar la lógica del parche y los archivos de configuración.
- Revisar logs en busca de errores de compilación o enlace.
- Confirmar que el repositorio de código fuente esté accesible.
Build-Bot (build-bot)
- Síntoma: Fallos en la compilación de imágenes o binarios.
- Acción:
- Verificar el espacio en disco del nodo donde se ejecuta.
- Revisar logs de Docker dentro del contenedor (si usa DinD) o logs de Kaniko/buildkit.
- Comprobar la conectividad con el registro de contenedores.
Scheduler (scheduler)
- Síntoma: No asigna tareas.
- Acción:
- Inspeccionar la cola de tareas en Redis:
kubectl -n crs exec -it <redis-pod> -- redis-cli LLEN task_queue - Revisar logs en busca de excepciones o configuraciones inválidas.
- Inspeccionar la cola de tareas en Redis:
DinD (Docker in Docker) (dind)
- Síntoma: Fallos al construir imágenes o ejecutar contenedores.
- Acción:
- Verificar el espacio en disco del nodo, especialmente en
/var/lib/docker. - Revisar logs del daemon de Docker dentro del pod DinD:
kubectl -n crs exec -it <dind-pod> -- docker info - Reiniciar el pod DinD si es necesario:
kubectl -n crs delete pod <dind-pod>.
- Verificar el espacio en disco del nodo, especialmente en
Otros Servicios
Para servicios como tracer-bot, merger-bot, competition-api, pov-reproducer, scratch-cleaner, registry-cache, image-preloader y ui, el enfoque general es:
- Revisar logs con
kubectl -n crs logs <pod-name>. - Verificar conectividad con otros servicios (Redis, bases de datos, APIs).
- Inspeccionar patrones de fallo conocidos (por ejemplo, timeouts de red, permisos insuficientes).
- Aumentar recursos (límites de CPU/memoria) si se observa presión de recursos.
Problemas Comunes
Presión de Recursos
- Síntoma: Múltiples pods en estado
CrashLoopBackOffo conOOMKilled. - Acción:
- Describir el nodo para verificar
MemoryPressure,DiskPressure, etc. - Ajustar límites de recursos en las definiciones de los deployments.
- Considerar escalar el clúster o rebalancear pods.
- Describir el nodo para verificar
Saturación de Disco
- Síntoma: Pods no pueden escribir logs o datos temporales.
- Acción:
- Verificar el uso de disco en los nodos:
kubectl top nodes - Limpiar imágenes Docker no utilizadas o pods antiguos.
- Aumentar el tamaño del volumen si es necesario.
- Verificar el uso de disco en los nodos:
Fallos de Redis
- Síntoma: Servicios que dependen de Redis se comportan erráticamente.
- Acción:
- Conectarse a Redis y verificar la salud (
PING). - Inspeccionar el uso de memoria y la persistencia.
- Reiniciar el pod de Redis como último recurso.
- Conectarse a Redis y verificar la salud (
Comandos Útiles
# Ver todos los pods del namespace
kubectl -n crs get pods
# Ver logs de un pod específico
kubectl -n crs logs <pod-name>
# Ejecutar un comando dentro de un pod
kubectl -n crs exec -it <pod-name> -- /bin/sh
# Describir un pod para ver eventos y recursos
kubectl -n crs describe pod <pod-name>
# Ver el uso de recursos del clúster
kubectl top pods -n crs
kubectl top nodes
Notas Adicionales
- Siempre que sea posible, intenta reproducir el fallo de forma aislada antes de escalar.
- Documenta cualquier hallazgo inusual para mejorar futuras iteraciones del sistema.
- Si no encuentras una solución obvia, verifica las integraciones de monitoreo (Prometheus, Grafana) para obtener más contexto.