Zliczanie przepustowości z kontenera Docker

13

Próbuję dowiedzieć się, jak śledzić przepustowość pochodzącą z kontenera Docker.

Zwykle używam --uid-ownerjako znaku do śledzenia wykorzystania przepustowości dla danego użytkownika. Jednak nawet po uruchomieniu wszystkich procesów, ponieważ użytkownik w kontenerze dokera --uid-ownernie działa. Zamiast używać --uid-owner, próbowałem po prostu śledzić wszystkie pakiety pochodzące z wirtualnego urządzenia Ethernet, które tworzy doker.

To jednak ostatecznie nic nie zrobiło: bez względu na to, co spróbuję, żadne pakiety nie zostaną przechwycone.

Z czystej desperacji próbowałem po prostu wprowadzić zasady we wszystkie łańcuchy, ale nie przyniosłem rezultatu.

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

Czy ktoś może mi powiedzieć, jak skutecznie oznaczyć paczki z kontenera dokowanego? --uid-ownerWolę używać, ale wezmę wszystko w tym momencie :)

Maran
źródło

Odpowiedzi:

4

Problem dotyczy przestrzeni nazw. Docker używa ich do izolowania zasobów, co oznacza również, że nie liczą się do sum hosta.

Podczas uruchamiania iptablesna hoście zasadniczo patrzysz tylko na przestrzeń nazw hosta, a pakiety, które Cię interesują, są porównywane z przestrzenią nazw kontenera. Aby obejść ten problem, możesz ip netnsnadal używać iptables na hoście, ale w sieciowej przestrzeni nazw kontenera.

Po pierwsze, ip netnsma nieco przeciwny intuicyjny interfejs. Aby dołączyć do przestrzeni nazw istniejącego procesu (w tym przypadku kontenera), musisz utworzyć łącze /var/run/netns/do przestrzeni nazw procesu:

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

(być może będziesz musiał mkdir /var/run/netns)

Teraz możesz uruchamiać iptables w przestrzeni nazw swojego kontenera:

# ip netns exec SOME_NAME iptables -L -nv

Zauważ, że to generuje zestaw reguł iptables wewnątrz kontenera, który prawdopodobnie będzie pusty.

Jeśli obecnie używasz opcji --uid-owner tylko po to, aby mieć liczniki na użytkownika, nie potrzebujesz już tego, ponieważ w tym przypadku liczniki łańcucha odnoszą się tylko do kontenera i powinny wystarczyć.

Wreszcie możesz oczyścić /var/run/netns.

Wiele pojemników na użytkownika

Jeśli masz wiele kontenerów na użytkownika i chcesz je zrównać, możesz uruchomić swoje kontenery --net=container:OTHER_CONTAINER_FROM_USER, aby ich przestrzenie nazw zostały scalone.

Ma to tę wadę, że łączy wszystkie aspekty stosu sieciowego, w tym otwarte porty, więc nie można mieć dwóch kontenerów dla tego samego użytkownika nasłuchującego na tym samym porcie.

Jeśli jest to ograniczenie wygórowane, możesz zsumować pojemniki indywidualnie i pogrupować je na podstawie UID później.

Więcej informacji na temat tego problemu można znaleźć tutaj .

Leo Antunes
źródło
0

Nie do końca to, o co prosiłeś, ale sądzę, że wykona zadanie.

Cytat z bloga Docker :

Liczniki na poziomie interfejsu

Ponieważ każdy kontener ma interfejs wirtualnego Ethernetu, możesz chcieć bezpośrednio sprawdzić liczniki TX i RX tego interfejsu.

[...]

Ale na razie najlepszym sposobem jest sprawdzenie danych z kontenerów. Nie mówię o prowadzeniu specjalnego agenta w kontenerze ani nic podobnego. Zamierzamy uruchomić plik wykonywalny ze środowiska hosta, ale w przestrzeni nazw sieciowych kontenera.

Dokładny format polecenia to:

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

Na przykład:

ip netns exec mycontainer netstat -i

Trisell
źródło
2
Ponownie sformatowałem twoją odpowiedź, spróbuj zacytować zasoby w podobnym stylu w swoich przyszłych odpowiedziach, aby były bardziej przydatne.
fuero