Cloner — Playbook Operacional¶
Versão concisa em português. Para mergulho profundo (estados, recovery completo, métricas detalhadas) consulte
CLONER_OPERATIONS.md(inglês).Status do escopo (pós-congelamento de escopo 2026-05-10) — Cloner agora é MÓDULO CLONER.Art com 9 funções. Runbook de troubleshooting de egress em
runbooks/cloner-egress-troubleshoot.md. Vermodules/cloner-art.mdpara detalhamento canônico.
1. Operações de rotina¶
Criar um job de clonagem¶
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 precisa coincidir com o nome de uma Synthetic Persona existente (validação no endpoint).
Vincular 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}'
O dashboard:
1. Atualiza ConfigMap clone-persona-3-config (SITE_NAME=shop) → Stakater Reloader reinicia pod.
2. Escala Deployment caddy no namespace clone-persona-3 para 1 réplica.
3. Upsert na tabela targets: URL https://cloned-3.persona.internal/ vira target automaticamente.
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}'
Target correspondente é desabilitado (não deletado — preserva histórico de runs).
2. Diagnóstico rápido¶
# Cloner pod
kubectl get pod -n web-agents -l app.kubernetes.io/name=cloner -o wide
# NFS server (deve estar no mesmo nó do cloner em multi-node)
kubectl get pod -n web-agents -l app.kubernetes.io/name=nfs-server -o wide
# DHCP daemon (Ready em todos os nós)
kubectl get ds cni-dhcp-daemon -n web-agents
# IP da 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 do cloner
kubectl logs -n web-agents -l app.kubernetes.io/name=cloner -f
3. Tabela de problemas¶
| Sintoma | Causa | Solução |
|---|---|---|
ImagePullBackOff |
Imagem não publicada | Build local ou aguardar CI |
PVC cloned-sites Pending (qualquer namespace) |
NFS server não pronto OU volumeName inválido |
Cheque kubectl describe pv cloned-sites-writer |
Slot MountVolume.SetUp failed: mount.nfs: Connection refused |
NFS server caiu | kubectl -n web-agents rollout restart deploy/nfs-server. Conteúdo persiste no hostPath. |
Slot Ready mas servindo 404/503 |
Cloner ainda não terminou job pra aquele personaName |
Ver clone_jobs no dashboard |
| Slot servindo conteúdo antigo | Reloader não reiniciou pod | kubectl rollout restart deploy/caddy -n clone-persona-N |
Cloner sem IP em net1 |
DHCP daemon ausente do nó OU upstream sem DHCP | kubectl get ds cni-dhcp-daemon -n web-agents; checar VLAN 40 no Nexus + roteador |
Init:Error no cloner |
routing-init falhou | kubectl logs -n web-agents <pod> -c routing-init |
| Sem internet (ping 8.8.8.8 falha) | Policy routing quebrado OU upstream offline | kubectl exec deploy/cloner -- ip rule list; checar ip route show table 100 |
| Job timeout 60s | Site bloqueia anti-bot OU timeout do browser engine | Verificar log do cloner, tentar URL mais simples |
4. Multi-node — verificações específicas¶
# Cloner deve estar em UCS-4 (role=infra)
kubectl get pod -n web-agents -l app.kubernetes.io/name=cloner -o wide
# NODE deve ser UCS-4
# NFS server deve estar no MESMO nó do cloner
kubectl get pod -n web-agents -l app.kubernetes.io/name=nfs-server -o wide
# NODE deve ser UCS-4
# Slots devem estar em 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 no UCS-4
kubectl debug node/<ucs4> -it --image=alpine -- ip link show eth1.40
# VLANs 200-209 no UCS-1
for v in $(seq 200 209); do
kubectl debug node/<ucs1> -it --image=alpine -- ip link show eth1.$v
done
Se cloner e NFS server estiverem em nós diferentes em multi-node:
# Forçar afinidade — geralmente PreferredDuringScheduling resolve sozinho
# após restart, mas em pinch:
kubectl rollout restart deploy/nfs-server -n web-agents
5. Notas operacionais¶
- Uma réplica de cloner — jobs executam sequencialmente. Pra paralelismo aumentar
replicasno Deployment. - Sobrescrita — clonar mesma
personaNamesubstitui o clone anterior (mesmo diretório). - Storage NFS RWX — em multi-node o NFS server roda no UCS-4 (mesmo nó do cloner). O hostPath subjacente fica em
/var/lib/agent-cluster/cloned-sitesno UCS-4. Slots em UCS-1 leem via NFS sobre OOBI (eth0). Capacidade depende do disco do UCS-4. - OOBI vs data plane — todo I/O de storage usa OOBI. As VLANs 200-209 (slots) e VLAN 40 (cloner) carregam APENAS tráfego de teste agente↔NGFW↔persona, nunca NFS.
- SPAs — sites que exigem interação do usuário pra renderizar conteúdo podem ter clone incompleto.
- robots.txt — ignorado (uso interno de lab).
- Tabela
targets— slots vinculados aparecem automaticamente comohttps://cloned-N.persona.internal/. Não é necessárioPOST /api/admin/targets.
© 2026 André Luiz Gallon — Distribuído sob PolyForm Noncommercial 1.0.0 com Restrições Adicionais de Uso (Apêndice A).