Підрахунок пропускної здатності від контейнера Docker


13

Я намагаюся зрозуміти, як відстежувати пропускну здатність, що надходить з контейнера Docker.

Зазвичай я використовую --uid-ownerяк марку для відстеження використання пропускної здатності для певного користувача. Однак, навіть коли я запускаю всі процеси, оскільки користувач усередині контейнера докера --uid-ownerне працює. Замість використання --uid-ownerя намагався просто відстежувати всі пакети, що надходять з віртуального пристрою Ethernet, який створює докер.

Це, однак, теж не зробило нічого: що б я не намагався, жоден пакет не потрапляє.

З відчаю я спробував просто встановити правила у всіх ланцюгах, але жодного результату не мав.

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

Хтось може сказати мені, як успішно маркувати пакунки з докерного контейнера? Переважно використовую, --uid-ownerале в цей момент я все захочу :)

Відповіді:


4

Проблема пов'язана з просторами імен. Docker використовує їх для виділення ресурсів, що також означає, що вони не зараховуються до загальної кількості хостів.

Під час запуску iptablesна хості ви в основному дивитесь лише на простір імен хоста, а пакети, які вас цікавлять, присвоюються простору імен контейнера. Щоб вирішити цю проблему, ви можете ip netnsзапускати iptables на хості, але в мережевому просторі імен контейнера.

По-перше, ip netnsмає дещо протилежний інтуїтивно зрозумілий інтерфейс. Для того, щоб приєднати до простору імен існуючого процесу (у цьому випадку ваш контейнер), вам потрібно створити посилання на /var/run/netns/простір імен процесу:

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

(можливо, доведеться mkdir /var/run/netns)

Тепер ви можете запускати iptables у просторі імен вашого контейнера:

# ip netns exec SOME_NAME iptables -L -nv

Зауважте, що це виводить набір правил iptables всередині контейнера, який, ймовірно, буде порожнім.

Якщо ви зараз використовуєте -uid-власник просто для того, щоб мати лічильники на користувачів, вам це навіть більше не потрібно, тому що в цьому випадку лічильники ланцюгів застосовуються лише до контейнера, і тоді їх повинно вистачити.

Нарешті, ви можете почистити /var/run/netns.

Кілька контейнерів на користувача

Якщо у вас є кілька контейнерів на користувача, і ви хочете їх об'єднати, ви можете запустити контейнери --net=container:OTHER_CONTAINER_FROM_USER, щоб їхні простори імен об'єдналися.

Це має недолік об'єднання всіх аспектів мережевого стека, включаючи відкриті порти, тому ви не можете мати два контейнери для одного і того ж користувача, що прослуховує один і той же порт.

Якщо це заборонне обмеження, пізніше можна складати контейнери окремо та групуватись на основі uid.

Більше інформації щодо цього питання ви можете знайти тут .


0

Не зовсім те, про що ви просили, але я вважаю, що це виконає роботу.

Цитата з блогу Docker :

Інтерфейсні рівні лічильники

Оскільки кожен контейнер має віртуальний інтерфейс Ethernet, ви можете перевірити безпосередньо лічильники TX і RX цього інтерфейсу.

[...]

Але поки що найкращий спосіб - перевірити показники зсередини контейнерів. Я не говорю про запуск спеціального агента в контейнері чи щось подібне. Ми будемо запускати виконуваний файл з хост-середовища, але всередині простору мережевих імен контейнера.

Точний формат команди:

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

Наприклад:

ip netns exec mycontainer netstat -i


2
Я сильно переформатував вашу відповідь, спробуйте цитувати ресурси у подібному стилі у своїх майбутніх відповідях, щоб зробити їх кориснішими.
fuero
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.