Menghitung bandwidth dari wadah Docker

13

Saya mencoba mencari cara melacak bandwidth yang berasal dari wadah Docker.

Biasanya saya gunakan --uid-ownersebagai tanda untuk melacak penggunaan bandwidth untuk pengguna tertentu. Namun, bahkan ketika saya menjalankan semua proses sebagai pengguna di dalam wadah buruh pelabuhan --uid-ownertidak berfungsi. Alih-alih menggunakan --uid-owner, saya mencoba melacak semua paket yang berasal dari perangkat ethernet virtual yang dibuat docker.

Namun, ini akhirnya tidak melakukan apa-apa: apa pun yang saya coba, tidak ada paket yang tertangkap.

Karena putus asa, saya mencoba meletakkan aturan di semua rantai tetapi tidak membuahkan hasil.

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

Adakah yang bisa memberi tahu saya cara menandai paket dari wadah buruh pelabuhan? Lebih disukai menggunakan --uid-ownertetapi saya akan mengambil apa pun pada saat ini :)

Maran
sumber

Jawaban:

4

Masalahnya terkait dengan ruang nama. Docker menggunakannya untuk mengisolasi sumber daya, yang juga berarti mereka tidak dihitung dengan total host.

Ketika Anda menjalankan iptableshost, Anda pada dasarnya hanya melihat ke namespace host, dan paket yang Anda minati akan dihitung ke namespace kontainer. Untuk mengatasi masalah ini, Anda dapat menggunakan ip netnsmasih menjalankan iptables pada host, tetapi di namespace jaringan wadah.

Pertama, ip netnsmemiliki antarmuka intuitif yang agak kontra. Untuk melampirkan namespace dari proses yang ada (dalam hal ini wadah Anda), Anda harus membuat tautan /var/run/netns/ke namespace proses:

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

(kamu mungkin harus mkdir /var/run/netns)

Sekarang Anda bebas menjalankan iptables di ruang nama wadah Anda:

# ip netns exec SOME_NAME iptables -L -nv

Perhatikan bahwa ini menghasilkan aturan iptables di dalam wadah, yang mungkin akan kosong.

Jika saat ini Anda menggunakan --uid-pemilik hanya untuk memiliki penghitung per-pengguna, Anda bahkan tidak memerlukannya lagi, karena dalam hal ini penghitung berantai hanya berlaku untuk wadah dan kemudian cukup.

Akhirnya, Anda bisa membersihkan /var/run/netns.

Beberapa kontainer per pengguna

Jika Anda memiliki beberapa kontainer per pengguna dan ingin menghitungnya bersama-sama, Anda dapat memulai wadah Anda --net=container:OTHER_CONTAINER_FROM_USER, sehingga ruang nama mereka digabungkan.

Ini memiliki kelemahan dari menggabungkan semua aspek dari tumpukan jaringan, termasuk port terbuka, jadi Anda tidak dapat memiliki dua kontainer untuk pengguna yang sama mendengarkan pada port yang sama.

Jika ini adalah batasan yang tidak dapat dihindarkan, Anda dapat menghitung kontainer secara individual dan grup berdasarkan pada nanti.

Anda dapat menemukan beberapa informasi lebih lanjut tentang masalah ini di sini .

Leo Antunes
sumber
0

Tidak persis apa yang Anda minta, tapi saya pikir itu akan menyelesaikan pekerjaan.

Kutipan dari blog Docker :

Penghitung tingkat antarmuka

Karena setiap wadah memiliki antarmuka Ethernet virtual, Anda mungkin ingin memeriksa langsung TX dan penghitung RX dari antarmuka ini.

[...]

Tetapi untuk sekarang, cara terbaik adalah memeriksa metrik dari dalam wadah. Saya tidak berbicara tentang menjalankan agen khusus dalam wadah, atau semacamnya. Kita akan menjalankan executable dari lingkungan host, tetapi di dalam namespace jaringan wadah.

Format perintah yang tepat adalah:

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

Contohnya:

ip netns exec mycontainer netstat -i

Trisell
sumber
2
Saya memformat ulang jawaban Anda dengan berat, mencoba mengutip sumber daya dengan gaya yang sama dalam jawaban Anda di masa depan untuk menjadikannya lebih berguna.
fuero