Conteggio della larghezza di banda da un contenitore Docker


13

Sto cercando di capire come monitorare la larghezza di banda proveniente da un contenitore Docker.

Normalmente uso --uid-ownercome segno per tenere traccia dell'utilizzo della larghezza di banda per un determinato utente. Tuttavia, anche quando eseguo tutti i processi poiché l'utente all'interno del contenitore della finestra mobile --uid-ownernon funziona. Invece di usare --uid-owner, ho provato a tenere traccia di tutti i pacchetti provenienti dal dispositivo Ethernet virtuale creato dalla finestra mobile.

Questo, tuttavia, ha finito per non fare nulla: qualunque cosa io provi, nessun pacchetto viene catturato.

Per pura disperazione, ho provato a mettere le regole in tutte le catene ma non ho avuto alcun risultato.

Chain PREROUTING (policy ACCEPT 3041 packets, 7849454 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain INPUT (policy ACCEPT 273 packets, 23305 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain FORWARD (policy ACCEPT 2750 packets, 7821109 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1
2           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1
3           0        0            all  --  veth5a36 eth0    anywhere             anywhere             mark match 0x1

Chain OUTPUT (policy ACCEPT 293 packets, 80020 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Chain POSTROUTING (policy ACCEPT 3043 packets, 7901129 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Qualcuno può dirmi come contrassegnare correttamente i pacchetti da un contenitore docker? Preferibilmente usando --uid-ownerma prenderò qualsiasi cosa a questo punto :)

Risposte:


4

Il problema è legato agli spazi dei nomi. Docker li usa per isolare le risorse, il che significa anche che non contano ai totali dell'host.

Quando esegui iptablesl'host, in pratica stai solo esaminando lo spazio dei nomi dell'host e i pacchetti a cui sei interessato vengono trasferiti nello spazio dei nomi del contenitore. Per aggirare questo problema, è possibile utilizzare ip netnsancora per eseguire iptables sull'host, ma nello spazio dei nomi di rete del contenitore.

Innanzitutto, ip netnsha un'interfaccia piuttosto intuitiva. Per collegarsi allo spazio dei nomi di un processo esistente (in questo caso il contenitore), è necessario creare un collegamento /var/run/netns/allo spazio dei nomi del processo:

# ln -sf /proc/`docker inspect -f '{{ .State.Pid }}' YOUR_CONTAINER`/ns/net /var/run/netns/SOME_NAME

(potrebbe essere necessario mkdir /var/run/netns)

Ora sei libero di eseguire iptables nello spazio dei nomi del tuo contenitore:

# ip netns exec SOME_NAME iptables -L -nv

Si noti che questo genera il set di regole di iptables all'interno del contenitore, che probabilmente sarà vuoto.

Se al momento stai usando --uid-owner solo per avere contatori per utente, non ne hai nemmeno più bisogno, perché in questo caso i contatori di catene si applicano solo al contenitore e dovrebbero quindi essere sufficienti.

Finalmente puoi pulire /var/run/netns.

Più contenitori per utente

Se si hanno più contenitori per utente e si desidera metterli insieme, è possibile iniziare i contenitori in --net=container:OTHER_CONTAINER_FROM_USERmodo che i loro spazi dei nomi vengano uniti.

Questo ha lo svantaggio di unire tutti gli aspetti dello stack di rete, comprese le porte aperte, quindi non è possibile avere due container per lo stesso utente in ascolto sulla stessa porta.

Se si tratta di una limitazione proibitiva, è possibile raggruppare i contenitori singolarmente e raggrupparli in base all'UID in un secondo momento.

Puoi trovare ulteriori informazioni su questo problema qui .


0

Non esattamente quello che hai chiesto, ma immagino che riuscirà a fare il lavoro.

Citazione dal blog Docker :

Contatori a livello di interfaccia

Poiché ogni contenitore ha un'interfaccia Ethernet virtuale, potresti voler controllare direttamente i contatori TX e RX di questa interfaccia.

[...]

Ma per ora, il modo migliore è controllare le metriche all'interno dei contenitori. Non sto parlando di eseguire un agente speciale nel container o qualcosa del genere. Eseguiremo un eseguibile dall'ambiente host, ma all'interno dello spazio dei nomi di rete di un contenitore.

Il formato esatto del comando è:

ip netns exec <nsname> <command...>

Per esempio:

ip netns exec mycontainer netstat -i


2
Ho riformattato pesantemente la tua risposta, prova a citare le risorse in uno stile simile nelle tue risposte future per renderle più utili.
fuero,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.