एक डॉक कंटेनर से बैंडविड्थ की गिनती


13

मैं यह पता लगाने की कोशिश कर रहा हूं कि डॉकटर कंटेनर से आने वाले बैंडविड्थ को कैसे ट्रैक किया जाए।

आम तौर पर मैं --uid-ownerकिसी दिए गए उपयोगकर्ता के लिए बैंडविड्थ उपयोग का ट्रैक रखने के लिए चिह्न के रूप में उपयोग करता हूं । हालाँकि, यहां तक ​​कि जब मैं डॉकटर कंटेनर के अंदर उपयोगकर्ता के रूप में सभी प्रक्रियाओं को चलाता --uid-ownerहै, तो काम नहीं कर रहा है। उपयोग करने के बजाय --uid-owner, मैंने बस वर्चुअल ईथरनेट डिवाइस से आने वाले सभी पैकेटों को ट्रैक करने की कोशिश की जो कि docker बनाता है।

यह, हालांकि, कुछ भी नहीं कर समाप्त हो गया: कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, कोई पैकेट नहीं पकड़ा जा रहा है।

सरासर हताशा से बाहर, मैंने बस सभी जंजीरों में नियम डालने की कोशिश की, लेकिन न तो कोई परिणाम हुआ।

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

ध्यान दें कि यह कंटेनर के अंदर iptables के नियमों को आउटपुट करता है, जो संभवतः खाली होगा।

यदि आप वर्तमान में उपयोग कर रहे हैं - प्रति-स्वामी बस प्रति-उपयोगकर्ता काउंटर हैं, तो आपको इसकी आवश्यकता भी नहीं है, क्योंकि इस मामले में श्रृंखला काउंटर केवल कंटेनर पर लागू होते हैं और तब पर्याप्त होना चाहिए।

अंत में, आप सफाई कर सकते हैं /var/run/netns

प्रति उपयोगकर्ता कई कंटेनर

यदि आपके पास प्रति उपयोगकर्ता कई कंटेनर हैं और आप उन्हें एक साथ जोड़ना चाहते हैं, तो आप अपने कंटेनर को इसके साथ शुरू कर सकते हैं --net=container:OTHER_CONTAINER_FROM_USER, ताकि उनके नाम स्थान विलय कर दें।

इससे नेटवर्क पोर्ट्स के सभी पहलुओं को ओपन पोर्ट सहित मर्ज करने का नुकसान होता है, इसलिए एक ही यूजर के लिए एक ही पोर्ट पर सुनने के लिए आपके पास दो कंटेनर नहीं हो सकते।

यदि यह एक निषेधात्मक सीमा है, तो आप कंटेनरों को अलग-अलग टैली कर सकते हैं और बाद में यूआईडी के आधार पर समूह बना सकते हैं।

आप इस मुद्दे के बारे में कुछ और जानकारी यहाँ पा सकते हैं ।


0

जैसा आपने पूछा था वैसा नहीं, लेकिन मुझे लगता है कि इससे काम पूरा हो जाएगा।

डॉकर ब्लॉग से उद्धरण :

इंटरफ़ेस-स्तरीय काउंटर

चूंकि प्रत्येक कंटेनर में एक वर्चुअल ईथरनेट इंटरफ़ेस होता है, इसलिए आप सीधे इस इंटरफ़ेस के TX और RX काउंटर की जांच कर सकते हैं।

[...]

लेकिन अभी के लिए, सबसे अच्छा तरीका कंटेनरों के भीतर से मैट्रिक्स की जांच करना है। मैं कंटेनर में एक विशेष एजेंट चलाने के बारे में बात नहीं कर रहा हूं, या ऐसा कुछ भी। हम मेजबान वातावरण से एक निष्पादन योग्य चलाने जा रहे हैं, लेकिन एक कंटेनर के नेटवर्क नामस्थान के भीतर।

कमांड का सटीक प्रारूप है:

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

उदाहरण के लिए:

ip netns exec mycontainer netstat -i


2
मैंने आपके उत्तर का भारी सुधार किया, अपने भविष्य के उत्तरों में समान शैली में संसाधनों को उद्धृत करके उन्हें और अधिक उपयोगी बनाने का प्रयास करें।
फुएरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.