Docker kapsayıcısından bant genişliğini sayma


13

Docker kapsayıcısından gelen bant genişliğini nasıl izleyeceğimizi anlamaya çalışıyorum.

Normalde --uid-owner, belirli bir kullanıcı için bant genişliği kullanımını takip etmek amacıyla işaret olarak kullanırım . Ancak, docker kapsayıcısının içindeki kullanıcı --uid-ownerçalışmıyor gibi tüm işlemleri çalıştırdığımda bile . Kullanmak yerine, --uid-ownerdocker'ın oluşturduğu sanal ethernet cihazından gelen tüm paketleri izlemeyi denedim.

Ancak bu da hiçbir şey yapmıyordu: ne denesem deneyim, hiçbir paket yakalanmıyor.

Çaresizlikten, kuralları tüm zincirlere koymaya çalıştım ama hiçbir sonucu olmadı.

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

Bir kimse bir docker kapsayıcısından paketleri nasıl başarıyla işaretleyebileceğimi söyleyebilir mi? Tercihen kullanmak --uid-ownerama bu noktada bir şey alacağım :)

Yanıtlar:


4

Sorun isim alanlarıyla ilgilidir. Docker, kaynakları izole etmek için kullanır, bu da ana makinenin toplamlarına sayılmadığı anlamına gelir.

iptablesAna bilgisayarda çalıştırdığınızda , temel olarak yalnızca ana bilgisayarın ad alanına bakıyorsunuz ve ilgilendiğiniz paketler kabın ad alanına eklenir. Bu soruna geçici bir çözüm bulmak ip netnsiçin, anasistemde ancak kapsayıcının ağ ad alanında iptables çalıştırmak için kullanabilirsiniz .

İlk olarak, ip netnsbiraz karşı sezgisel bir arayüze sahiptir. Mevcut bir işlemin ad alanına (bu durumda kapsayıcı) eklemek /var/run/netns/için, işlemin ad alanına bir bağlantı oluşturmanız gerekir :

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

(yapmanız gerekebilir mkdir /var/run/netns)

Artık iptables'ı kapsayıcınızın ad alanında çalıştırabilirsiniz:

# ip netns exec SOME_NAME iptables -L -nv

Bunun, iptables'ın konteyner içindeki kural kümesini çıkardığını ve bunun muhtemelen boş olacağını unutmayın.

Şu anda yalnızca kullanıcı başına sayaçlara sahip olmak için --uid-owner kullanıyorsanız, artık buna ihtiyacınız bile yok, çünkü bu durumda zincir sayaçları yalnızca konteyner için geçerlidir ve bu durumda yeterli olmalıdır.

Son olarak, temizleyebilirsiniz /var/run/netns.

Kullanıcı başına birden çok kapsayıcı

Kullanıcı başına birden fazla kapsayıcı varsa ve bunları birlikte --net=container:OTHER_CONTAINER_FROM_USERhesaplamak istiyorsanız, kapsayıcılarınızı başlatarak ad alanlarının birleştirilmesini sağlayabilirsiniz.

Bunun, açık portlar da dahil olmak üzere ağ yığınının tüm yönlerini birleştirmenin dezavantajı vardır, bu nedenle aynı kullanıcı için aynı bağlantı noktasını dinleyen iki kabınız olamaz.

Bu yasaklayıcı bir sınırlama ise, kapları ayrı ayrı hesaplayabilir ve daha sonra uid'e göre gruplandırabilirsiniz.

Bu sorun hakkında daha fazla bilgiyi burada bulabilirsiniz .


0

Tam olarak sorduğunuz şey değil, ama işi halledeceğini düşünüyorum.

Docker blogundan alıntı :

Arayüz düzeyindeki sayaçlar

Her kapsayıcıda sanal bir Ethernet arabirimi bulunduğundan, doğrudan bu arabirimin TX ve RX sayaçlarını denetlemek isteyebilirsiniz.

[...]

Ancak şimdilik, en iyi yol, metrikleri kapların içinden kontrol etmektir. Konteynerde özel bir ajan veya bunun gibi bir şey çalıştırmaktan bahsetmiyorum. Ana bilgisayar ortamından, ancak bir kapsayıcının ağ ad alanında bir yürütülebilir dosya çalıştıracağız.

Komutun tam biçimi:

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

Örneğin:

ip netns exec mycontainer netstat -i


2
Cevabınızı büyük ölçüde yeniden biçimlendirdim, gelecekteki cevaplarınızda kaynakları daha kullanışlı hale getirmek için benzer bir tarzda alıntı yapmayı deneyin.
fuero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.