Agent Podman
L'agent Podman di Status200 è un container che esegui su un host Podman. Legge le statistiche e i file di log di ogni container dell'host e li invia a Status200, dove l'host compare con i suoi container, le metriche e i log. Un secondo container, l'agente IA Podman, permette a Status200 AI di indagare sull'host. I monitor Podman generano avvisi in base a ciò che l'agent invia.
podman run o Podman Compose.Cosa raccoglie l'agentMetriche, log e un inventario di ogni container.I log dei container richiedono k8s-filePodman scrive i log in journald a meno che tu non cambi driver.Risoluzione dei problemiRiavvii in loop, metriche mancanti, log mancanti.Come funziona
L'agent è un OpenTelemetry Collector con la configurazione di Status200 integrata. Tramite il socket dell'API compatibile con Docker di Podman legge le statistiche di ogni container ogni 30 secondi ed elenca ogni container, immagine, rete e volume ogni 5 minuti. Segue i file di log dei container e invia tutto al tuo URL di Status200 tramite OTLP, con la chiave di acquisizione che gli fornisci.
Due container sul tuo host Podman
L'host si registra con i suoi primi dati, con il nome che gli dai in PODMAN_HOST_NAME. L'agente IA è opzionale: se lo ometti, il collector funziona allo stesso modo.
Prima di iniziare
- Podman 4.0 o successivo, e accesso root sull'host.
- Il socket dell'API di Podman in
/run/podman/podman.sock. Attivalo consudo systemctl enable --now podman.socket. - Una chiave di acquisizione. Creane una in Impostazioni del progetto → Telemetria e APM → Chiavi di acquisizione e copiane il valore.
- HTTPS in uscita dall'host verso il tuo URL di Status200.
- Per i log dei container, container che usano il driver di log
k8s-file. Podman in modalità rootful scrive i log injournaldper impostazione predefinita, che l'agent non può leggere. Vedi I log dei container richiedono il driver k8s-file.
Installa l'agent
Avvia l'agent
Sostituisci
YOUR_STATUS200_URLcon il tuo URL di Status200,YOUR_TELEMETRY_INGESTION_TOKENcon la chiave di acquisizione emy-podman-hostcon un nome per questo host, comeprod-podman-01. Il nome è quello con cui l'host compare in Status200, quindi mantienilo stabile: un nome nuovo registra un nuovo host.Podman CLI
podman run -d \ --name status200-podman-agent \ --user 0:0 \ --restart unless-stopped \ -v /run/podman/podman.sock:/run/podman/podman.sock:ro \ -v /var/lib/containers/storage:/var/lib/containers/storage:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e PODMAN_HOST_NAME="my-podman-host" \ status200/podman-agent:releasePoi avvia accanto l'agente IA, con gli stessi valori. Le indagini IA sono attive per impostazione predefinita: mentre Status200 AI indaga su un incidente o un avviso su questo host, esegue comandi
dockerin sola lettura tramite l'agente IA, sull'API compatibile con Docker di Podman, e non modifica nulla a meno che tu non consenta le correzioni. Per installare senza indagini IA, salta questo comando.podman run -d \ --name status200-podman-ai-agent \ --user 0:0 \ --restart unless-stopped \ --read-only --tmpfs /tmp \ -v /run/podman/podman.sock:/run/podman/podman.sock:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e STATUS200_AI_AGENT_RESOURCE_TYPE=podman \ -e PODMAN_HOST_NAME="my-podman-host" \ status200/resource-ai-agent:releasePodman Compose
Salva questo file come
docker-compose.ymlin una cartella sull'host. Il secondo servizio è l'agente IA: omettilo per eseguire il collector senza indagini IA.services: status200-podman-agent: image: status200/podman-agent:release container_name: status200-podman-agent user: "0:0" restart: unless-stopped volumes: - /run/podman/podman.sock:/run/podman/podman.sock:ro - /var/lib/containers/storage:/var/lib/containers/storage:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - PODMAN_HOST_NAME=my-podman-host logging: driver: json-file options: max-size: "10m" max-file: "3" status200-podman-ai-agent: image: status200/resource-ai-agent:release container_name: status200-podman-ai-agent user: "0:0" restart: unless-stopped read_only: true tmpfs: - /tmp volumes: - /run/podman/podman.sock:/run/podman/podman.sock:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - STATUS200_AI_AGENT_RESOURCE_TYPE=podman - PODMAN_HOST_NAME=my-podman-hostAvvialo in quella cartella:
podman compose up -dVerifica che l'agent sia in esecuzione
podman ps --filter name=status200-podman-agent podman logs -f status200-podman-agentI log dovrebbero mostrare questa riga una volta avviato il collector:
Everything is ready. Begin running and processing data.Trova l'host in Status200
Apri Prodotti → Infrastruttura → Podman → Tutti gli host. L'host compare con il suo
PODMAN_HOST_NAMEentro un minuto circa, con i suoi container, le metriche e i log. L'agente IA risulta connesso nella pagina Agente IA dell'host e in fondo alla sua Panoramica. La pagina Topologia dell'host disegna i suoi progetti Compose, container, immagini, reti e volumi su un'unica mappa: vedi Topologia.
Variabili d'ambiente
| Variabile | Obbligatoria | Descrizione |
|---|---|---|
STATUS200_URL | Sì | Il tuo URL di Status200, come https://status200.ru o la tua istanza self-hosted. Usa http:// e la sua porta se l'istanza usa solo HTTP. |
STATUS200_SERVICE_TOKEN | Sì | La chiave di acquisizione da Impostazioni del progetto → Telemetria e APM → Chiavi di acquisizione. |
PODMAN_HOST_NAME | No | Il nome dell'host in Status200. Il valore predefinito è podman-host, quindi dai a ogni host il suo. |
DOCKER_API_VERSION | No | La versione dell'API di Docker che l'agent usa con il socket di Podman. Il valore predefinito è 1.44. Abbassala se il socket riporta un massimo più vecchio, oppure impostala su un valore vuoto per negoziarla (vedi Risoluzione dei problemi). |
Per cambiare un valore, rimuovi l'agent ed esegui di nuovo il suo comando (Podman CLI), oppure modifica docker-compose.yml ed esegui podman compose up -d (Podman Compose).
Cosa raccoglie l'agent
| Dati | Cosa sono |
|---|---|
| Metriche dei container | CPU (utilizzo, percentuale, limitazione), memoria (utilizzo, limite, percentuale), I/O di rete e di blocco, uptime, riavvii e numero di processi, per container, ogni 30 secondi. |
| Log dei container | stdout e stderr di ogni container, dal file ctr.log che scrive il driver di log k8s-file. |
| Inventario | Ogni container in qualsiasi stato, e ogni immagine, rete e volume, ogni 5 minuti. |
Le metriche e i log di ogni container vengono archiviati sotto un servizio con il nome del container. Ogni riga di log riceve una severità in base al livello che indica, come [ERROR], level=warn o {"level":"info"}; una riga che non ne indica nessuno prende quella del suo flusso: stderr è ERROR, stdout è INFO. Le righe che iniziano con uno spazio o una parentesi di chiusura vengono unite alla riga precedente, quindi uno stack trace arriva come un unico record. I log dell'agent stesso vengono esclusi.
Monitor Podman elenca ogni metrica e il suo significato.
I log dei container richiedono il driver k8s-file
L'agent segue /var/lib/containers/storage/overlay-containers/*/userdata/ctr.log, i file che scrive il driver di log k8s-file di Podman (json-file è lo stesso driver in Podman). Il driver predefinito di Podman in modalità rootful è journald, che non lascia alcun file da leggere, e lo stesso vale per un driver remoto come syslog. Le metriche di un container del genere arrivano comunque; i suoi log no.
Controlla il driver di log di un container e quello predefinito di Podman:
podman inspect <container> --format '{{.HostConfig.LogConfig.Type}}'
podman info --format '{{.Host.LogDriver}}'Esegui un container con k8s-file, oppure passa a esso un servizio Compose:
podman run --log-driver k8s-file --log-opt max-size=100m ... <image>services:
my-app:
image: my-app:latest
logging:
driver: "k8s-file"
options:
max-size: "100m"Oppure rendilo il predefinito per ogni container creato in seguito, in containers.conf (/etc/containers/containers.conf in modalità rootful, ~/.config/containers/containers.conf in modalità rootless):
[containers]
log_driver = "k8s-file"
log_size_max = 104857600Poi ricrea i container. Un container mantiene il driver di log con cui è stato creato, quindi riavviarlo non basta.
Aggiornare l'agent
Quando l'agent è più vecchio del tuo Status200, compare un segnale di avviso accanto a Versione dell'agente nella Panoramica dell'host. Selezionalo per vedere questi comandi.
Podman CLI
podman pull status200/podman-agent:release
podman pull status200/resource-ai-agent:release
podman rm -f status200-podman-agent status200-podman-ai-agentPoi esegui di nuovo entrambi i comandi podman run di Avvia l'agent.
Podman Compose
podman compose pull
podman compose up -dIl tag release punta sempre alla release più recente. Per fissare una versione, usa status200/podman-agent:<version>, come status200/podman-agent:10.0.31. La stessa immagine si trova nel GitHub Container Registry come ghcr.io/status200/podman-agent:release.
Disinstallare l'agent
Podman CLI
podman rm -f status200-podman-agent
podman rm -f status200-podman-ai-agentPodman Compose
podman compose downL'host resta in Status200 con i dati che ha inviato. Se non ti serve più, eliminalo con Elimina host nel suo menu.
Agente IA
I comandi e il file Compose qui sopra, l'install.sh dell'agent Podman e il docker-compose.yml nella sua [directory PodmanAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/PodmanAgent) eseguono tutti l'Agente IA Podman: un secondo container, status200-podman-ai-agent (immagine status200/resource-ai-agent:release), che esegue i comandi in sola lettura richiesti da Status200 AI mentre indaga su un incidente o un avviso su questo host — tramite l'API compatibile con Docker di Podman, con la CLI docker: docker ps -a, docker logs --tail 200 web, docker container inspect web — e, solo se lo consenti, applica correzioni come il riavvio di un container specifico. Legge gli stessi STATUS200_URL, STATUS200_SERVICE_TOKEN e PODMAN_HOST_NAME del collector, quindi serve esattamente questo host, e compare nella pagina Agente IA dell'host in Status200.
- Le indagini IA sono attive per impostazione predefinita. Appena l'agent si connette, Status200 AI lo usa per indagare sugli incidenti e sugli avvisi di questo host, e la Panoramica dell'host mostra lo stato dell'agent. Per fermarlo, imposta
STATUS200_AI_INVESTIGATION=falsedove viene eseguito l'agent (Cambia sotto Cosa può fare l'IA, nella pagina dell'agente IA, mostra come), oppure ometti l'agent. - È in sola lettura a meno che tu non lo avvii con
STATUS200_AI_ALLOW_WRITES=true;STATUS200_AI_WRITE_TARGETS(per esempioweb-*,api-*) limita i container che una correzione può toccare. Avvialo anche conSTATUS200_AI_FIXESper indicare come vengono eseguite le correzioni —ask-for-approval(una persona approva ciascuna),automaticobypass-approval— e la pagina dell'agente IA lo mostra in sola lettura (Cosa può fare l'IA, impostato dall'agent). - Richiede lo stesso socket del collector e viene eseguito come root con il socket montato, perché il socket appartiene a root — e per Podman in modalità rootful chi può usare il socket è root su questo host,
:roo no. Il limite è la policy dei comandi dell'agent: non esegue maiexec,run,rmoprune, e non modifica mai sé stesso, il collector o qualsiasi cosa inSTATUS200_AI_PROTECTED_TARGETS(glob di nomi di container). install.sh --no-ai-agentlo omette;podman rm -f status200-podman-ai-agentlo rimuove. Aggiornalo come il collector:podman pull status200/resource-ai-agent:release, rimuovilo e avvialo di nuovo.
Cosa può eseguire, come funzionano le correzioni e come risolverne i problemi: Infrastructure AI Agents.
Risoluzione dei problemi
L'agent si riavvia con "client version is too new"
I log dell'agent mostrano:
Error: cannot start pipelines: failed to start "docker_stats" receiver:
Error response from daemon: client version 1.44 is too new.
Maximum supported API version is 1.41Un server dell'API di Docker che impone una versione massima del client ne rifiuta una più recente, quindi il receiver non parte mai e il collector termina con esso. Controlla la versione dell'API che riporta il socket di Podman:
curl -s -o /dev/null -D - --unix-socket /run/podman/podman.sock http://localhost/_ping | grep -i '^api-version'Poi aggiungi -e DOCKER_API_VERSION=1.41 (o il valore che hai ottenuto) a podman run, oppure imposta DOCKER_API_VERSION in Compose. I server più recenti servono ancora le versioni più vecchie dell'API, quindi l'impostazione resta valida dopo un aggiornamento.
Preferisci non cercare il numero? Imposta DOCKER_API_VERSION sulla stringa vuota. L'agent negozia allora la versione con il socket (un HEAD /_ping, poi il massimo che riporta il socket) invece di fissarne una:
podman run -d ... -e DOCKER_API_VERSION= ...Permesso negato sul socket di Podman, oppure nessun socket
L'agent deve essere eseguito come root per leggere /run/podman/podman.sock. Verifica che --user 0:0 sia nel tuo comando podman run, oppure user: "0:0" in Compose, e che il socket sia attivo: sudo systemctl enable --now podman.socket. Podman in modalità rootless ha invece il socket in /run/user/<uid>/podman/podman.sock (systemctl --user enable --now podman.socket): monta quel percorso al posto di /run/podman/podman.sock.
L'host risulta disconnesso
- Verifica che l'agent sia in esecuzione:
podman ps --filter name=status200-podman-agent - Cerca errori nei suoi log:
podman logs status200-podman-agent 2>&1 | grep -i error - Controlla
STATUS200_URLeSTATUS200_SERVICE_TOKEN: la chiave deve essere una chiave di acquisizione valida che non è stata disattivata. - Verifica che l'host raggiunga il tuo URL di Status200 in rete.
Non compare nessuna metrica
- Verifica che il socket di Podman sia montato nell'agent. La sua immagine non ha una shell, quindi guarda da un container usa e getta che ne condivide i mount:
podman run --rm --volumes-from status200-podman-agent alpine:3.19 ls -la /run/podman/podman.sock - Cerca errori di esportazione nei suoi log:
podman logs status200-podman-agent 2>&1 | tail -100 - Verifica che la chiave di acquisizione sia valida e non sia scaduta.
La CPU dei container è una linea piatta
Un agent più vecchio invia il valore di CPU calcolato dal receiver docker_stats stesso, che ha bisogno della lettura delle statistiche precedente a quella attuale, e l'API compatibile con Docker di Podman non la invia mai: il receiver divide tutta la CPU usata da un container dal suo avvio per tutta la CPU usata dall'host dal suo boot. La linea si muove appena e non segue il carico, mentre container.cpu.usage.total sì. Aggiorna l'agent: dalla sua seconda lettura in poi invia la CPU usata da ogni container in ogni intervallo di 30 secondi. Le letture già salvate restano com'erano.
Le metriche arrivano, ma i log dei container no
Molto probabilmente i tuoi container usano journald, il driver di log predefinito di Podman. Controlla quali file osserva l'agent e quale driver usa un container:
podman logs status200-podman-agent 2>&1 | grep -E "Started watching file|no files match"
podman inspect <container> --format '{{.HostConfig.LogConfig.Type}}'Se l'agent segnala no files match the configured criteria, passa i container a k8s-file e ricreali, come mostra I log dei container richiedono il driver k8s-file.
I log finiscono su un altro host, oppure l'host si chiama podman-host
Il nome dell'host viene da PODMAN_HOST_NAME. Un agent avviato senza di esso riporta podman-host, quindi ogni host configurato così sembra lo stesso; se cambi il nome in seguito, Status200 registra un secondo host, che riceve i nuovi dati. Imposta PODMAN_HOST_NAME su un nome proprio per ogni host e ricrea l'agent. Per verificare il nome che riporta l'agent:
podman inspect status200-podman-agent --format '{{range .Config.Env}}{{println .}}{{end}}' | grep PODMAN_HOST_NAME