การนับแบนด์วิดท์จากคอนเทนเนอร์ Docker


13

ฉันกำลังพยายามหาวิธีติดตามแบนด์วิดท์ที่มาจากคอนเทนเนอร์ Docker

ปกติฉันจะใช้--uid-ownerเป็นเครื่องหมายเพื่อติดตามการใช้แบนด์วิดธ์สำหรับผู้ใช้ที่กำหนด อย่างไรก็ตามแม้ว่าฉันจะเรียกใช้กระบวนการทั้งหมดในขณะที่ผู้ใช้ภายในคอนเทนเนอร์นักเทียบท่า--uid-ownerไม่ทำงาน แทนที่จะลองใช้--uid-ownerฉันพยายามติดตามทุกแพ็กเก็ตที่มาจากอุปกรณ์อีเธอร์เน็ตเสมือนที่นักเทียบท่าสร้าง

อย่างไรก็ตามสิ่งนี้ก็ไม่ได้ทำสิ่งใดเกินไป: ไม่ว่าฉันจะพยายามอะไรก็ตาม

จากความสิ้นหวังอย่างแท้จริงฉันพยายามแค่วางกฎลงในโซ่ทั้งหมด แต่ก็ไม่ได้ผล

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

ปัญหาเกี่ยวข้องกับเนมสเปซ นักเทียบท่าใช้เพื่อแยกทรัพยากรซึ่งหมายความว่าพวกมันจะไม่นับรวมกับโฮสต์

เมื่อคุณเรียกใช้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

โปรดทราบว่าสิ่งนี้จะส่งออก ruleset ของ iptables ภายในคอนเทนเนอร์ซึ่งอาจจะว่างเปล่า

หากคุณกำลังใช้ - uid-owner เพียงเพื่อให้มีตัวนับต่อผู้ใช้คุณไม่จำเป็นต้องใช้อีกต่อไปเพราะในกรณีนี้ตัวนับลูกโซ่ใช้กับคอนเทนเนอร์เท่านั้นและควรจะเพียงพอ

/var/run/netnsสุดท้ายคุณก็สามารถทำความสะอาด

หลายคอนเทนเนอร์ต่อผู้ใช้

หากคุณมีหลายคอนเทนเนอร์ต่อผู้ใช้และต้องการนับรวมเข้าด้วยกันคุณสามารถเริ่มต้นคอนเทนเนอร์ด้วย--net=container:OTHER_CONTAINER_FROM_USERดังนั้นเนมสเปซของพวกเขาจะถูกรวมเข้าด้วยกัน

นี่เป็นข้อเสียของการรวมทุกด้านของเครือข่ายสแต็กรวมถึงพอร์ตที่เปิดดังนั้นคุณจึงไม่สามารถมีสองคอนเทนเนอร์สำหรับผู้ใช้เดียวกันที่กำลังฟังบนพอร์ตเดียวกัน

หากนี่เป็นข้อ จำกัด ที่ห้ามใช้คุณสามารถนับคอนเทนเนอร์แต่ละรายการและจัดกลุ่มตาม uid ได้ในภายหลัง

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้ที่นี่


0

ไม่ใช่สิ่งที่คุณถาม แต่ฉันคิดว่ามันจะทำให้งานเสร็จ

อ้างอิงจากบล็อกนักเทียบท่า :

ตัวนับระดับอินเตอร์เฟส

เนื่องจากแต่ละคอนเทนเนอร์มีอินเตอร์เฟสอีเทอร์เน็ตเสมือนคุณอาจต้องการตรวจสอบเคาน์เตอร์ TX และ RX ของอินเตอร์เฟสนี้โดยตรง

[ ... ]

แต่สำหรับตอนนี้วิธีที่ดีที่สุดคือการตรวจสอบการวัดจากภายในตู้คอนเทนเนอร์ ฉันไม่ได้พูดเกี่ยวกับการใช้ตัวแทนพิเศษในภาชนะบรรจุหรืออะไรแบบนั้น เราจะเรียกใช้ไฟล์ปฏิบัติการจากสภาพแวดล้อมโฮสต์ แต่ภายในเนมสเปซเครือข่ายของคอนเทนเนอร์

รูปแบบที่แน่นอนของคำสั่งคือ:

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

ตัวอย่างเช่น

ip netns exec mycontainer netstat -i


2
ฉันจัดรูปแบบคำตอบของคุณใหม่อย่างหนักลองอ้างถึงแหล่งข้อมูลในรูปแบบที่คล้ายกันในคำตอบในอนาคตของคุณเพื่อให้เป็นประโยชน์มากขึ้น
fuero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.