Cloner — Playbook Operativo¶
Versión concisa en español. Para una inmersión profunda (estados, recovery completo, métricas detalladas) consulte
CLONER_OPERATIONS.md(inglés).Estado del alcance (post-congelación de alcance 2026-05-10) — Cloner ahora es MÓDULO CLONER.Art con 9 funciones. Runbook de troubleshooting de egress en
runbooks/cloner-egress-troubleshoot.md. Veamodules/cloner-art.mdpara el desglose canónico.
1. Operaciones de rutina¶
Crear un job de clonación¶
ADMIN_PASS=$(grep '^ADMIN_BASIC_AUTH=' .env | cut -d= -f2- | cut -d: -f2)
curl -s -X POST https://<dashboard-host>/api/clone/jobs \
-H "Authorization: Basic $(echo -n admin:$ADMIN_PASS | base64)" \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com","personaName":"shop"}'
personaName debe coincidir con el nombre de una Synthetic Persona existente (validación en el endpoint).
Asignar slot¶
curl -s -X PATCH https://<dashboard-host>/api/clone/persona-slots/3 \
-H "Authorization: Basic $(echo -n admin:$ADMIN_PASS | base64)" \
-H 'Content-Type: application/json' \
-d '{"siteName":"shop","replicas":1}'
El dashboard:
1. Actualiza ConfigMap clone-persona-3-config (SITE_NAME=shop) → Stakater Reloader reinicia pod.
2. Escala Deployment caddy en namespace clone-persona-3 a 1 réplica.
3. Upsert en la tabla targets: URL https://cloned-3.persona.internal/ se vuelve target automáticamente.
Liberar slot¶
curl -s -X PATCH https://<dashboard-host>/api/clone/persona-slots/3 \
-H "Authorization: Basic $(echo -n admin:$ADMIN_PASS | base64)" \
-H 'Content-Type: application/json' \
-d '{"replicas":0}'
El target correspondiente queda deshabilitado (no eliminado — preserva el histórico de runs).
2. Diagnóstico rápido¶
# Pod del cloner
kubectl get pod -n web-agents -l app.kubernetes.io/name=cloner -o wide
# Servidor NFS (debe estar en el mismo nodo que el cloner en multi-node)
kubectl get pod -n web-agents -l app.kubernetes.io/name=nfs-server -o wide
# DHCP daemon (Ready en todos los nodos)
kubectl get ds cni-dhcp-daemon -n web-agents
# IP de VLAN 40 + internet
kubectl exec -n web-agents deploy/cloner -- ip addr show net1
kubectl exec -n web-agents deploy/cloner -- ping -c 3 8.8.8.8
# PVCs cloned-sites
kubectl get pvc -A | grep cloned-sites
# Logs del cloner
kubectl logs -n web-agents -l app.kubernetes.io/name=cloner -f
3. Tabla de problemas¶
| Síntoma | Causa | Solución |
|---|---|---|
ImagePullBackOff |
Imagen no publicada | Build local o esperar CI |
PVC cloned-sites Pending (cualquier namespace) |
Servidor NFS no listo O volumeName inválido |
Revise kubectl describe pv cloned-sites-writer |
Slot MountVolume.SetUp failed: mount.nfs: Connection refused |
Servidor NFS caído | kubectl -n web-agents rollout restart deploy/nfs-server. Contenido persiste en el hostPath. |
Slot Ready pero sirviendo 404/503 |
Cloner aún no terminó job para ese personaName |
Ver clone_jobs en el dashboard |
| Slot sirviendo contenido antiguo | Reloader no reinició pod | kubectl rollout restart deploy/caddy -n clone-persona-N |
Cloner sin IP en net1 |
DHCP daemon ausente del nodo O upstream sin DHCP | kubectl get ds cni-dhcp-daemon -n web-agents; revisar VLAN 40 en Nexus + router |
Init:Error en el cloner |
routing-init falló | kubectl logs -n web-agents <pod> -c routing-init |
| Sin internet (ping 8.8.8.8 falla) | Policy routing roto O upstream offline | kubectl exec deploy/cloner -- ip rule list; revisar ip route show table 100 |
| Job timeout 60s | El sitio bloquea anti-bot O timeout del browser engine | Verificar log del cloner, intentar URL más simple |
4. Multi-node — verificaciones específicas¶
# Cloner debe estar en UCS-4 (role=infra)
kubectl get pod -n web-agents -l app.kubernetes.io/name=cloner -o wide
# NODE debe ser UCS-4
# Servidor NFS debe estar en el MISMO nodo que el cloner
kubectl get pod -n web-agents -l app.kubernetes.io/name=nfs-server -o wide
# NODE debe ser UCS-4
# Slots deben estar en UCS-1
kubectl get pod -A -l app.kubernetes.io/part-of=web-agent-cluster,cloned-persona -o wide
# Todos NODE = UCS-1
# VLAN 40 en UCS-4
kubectl debug node/<ucs4> -it --image=alpine -- ip link show eth1.40
# VLANs 200-209 en UCS-1
for v in $(seq 200 209); do
kubectl debug node/<ucs1> -it --image=alpine -- ip link show eth1.$v
done
Si el cloner y el servidor NFS terminan en nodos diferentes en multi-node:
# Forzar afinidad — generalmente PreferredDuringScheduling se resuelve solo
# tras un restart, pero en apuro:
kubectl rollout restart deploy/nfs-server -n web-agents
5. Notas operativas¶
- Una réplica de cloner — los jobs corren secuencialmente. Para paralelismo, aumentar
replicasen el Deployment. - Sobrescritura — clonar el mismo
personaNamereemplaza el clone anterior (mismo directorio). - Storage NFS RWX — en multi-node el servidor NFS corre en UCS-4 (mismo nodo que el cloner). El hostPath subyacente está en
/var/lib/agent-cluster/cloned-sitesen UCS-4. Slots en UCS-1 leen vía NFS sobre OOBI (eth0). Capacidad depende del disco del UCS-4. - OOBI vs data plane — todo I/O de storage usa OOBI. Las VLANs 200-209 (slots) y VLAN 40 (cloner) llevan SOLO tráfico de prueba agente↔NGFW↔persona, nunca NFS.
- SPAs — sitios que requieren interacción del usuario para renderizar contenido pueden tener clone incompleto.
- robots.txt — ignorado (uso interno de lab).
- Tabla
targets— los slots asignados aparecen automáticamente comohttps://cloned-N.persona.internal/. No es necesarioPOST /api/admin/targets.
© 2026 André Luiz Gallon — Distribuido bajo PolyForm Noncommercial 1.0.0 con Restricciones Adicionales de Uso (Apéndice A).