2014-05-02 6 views
6

डॉकर प्रत्येक कंटेनर के लिए एक पुल (docker0) से जुड़े veth इंटरफ़ेस बनाता है।जब कोई नया वेथ इंटरफ़ेस जोड़ा जाता है तो एक स्क्रिप्ट चलाएं

http://docs.docker.io/use/networking/

मैं बैंडविड्थ इन नए veth इंटरफेस है सीमित करना चाहते हैं। मुझे आश्चर्यजनक के साथ ऐसा करने का एक तरीका मिला। हालांकि मैं इसे स्वचालित करना चाहता हूं।

क्या कोई हुक रखने का कोई तरीका है जो प्रत्येक बार एक नया veth इंटरफ़ेस संलग्न होता है?

मैंने /etc/network/if-up.d/ में स्क्रिप्ट जोड़ने में देखा है, लेकिन जब वे veth बूट के दौरान जोड़े जाते हैं तो वे नहीं चलते हैं।

यहां कुछ सिसॉग हैं जो मैं अधिसूचित होने की कोशिश कर रहा हूं। मुझे पता है कि मैं इन लॉगों को पूंछ सकता हूं लेकिन यह विधि हैकी की तरह दिखती है और ओएस के माध्यम से इस घटना के बारे में अधिसूचित होने का एक तरीका होना चाहिए।

May 2 23:28:41 ip-10-171-7-2 kernel: [22170163.565812] netlink: 1 bytes leftover after parsing attributes. 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720571] IPv6: ADDRCONF(NETDEV_UP): veth5964: link is not ready 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720587] device veth5964 entered promiscuous mode 
May 2 23:28:42 ip-10-171-7-2 avahi-daemon[1006]: Withdrawing workstation service for vethdc8c. 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743283] IPv6: ADDRCONF(NETDEV_CHANGE): veth5964: link becomes ready 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743344] docker0: port 27(veth5964) entered forwarding state 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743358] docker0: port 27(veth5964) entered forwarding state 
May 2 23:28:48 ip-10-171-7-2 kernel: [22170170.518670] docker0: port 26(vethb06a) entered forwarding state 
May 2 23:28:57 ip-10-171-7-2 kernel: [22170178.774676] docker0: port 27(veth5964) entered forwarding state 

उत्तर

2

आप एक कस्टम udev नियम यह है कि हर बार एक नए इंटरफ़ेस जोड़ा जाता है तुम्हारा एक बार स्क्रिप्ट चलाने से लिखना चाहिए। डेबियन इंटरफ़ेस "हॉटप्लग" को संभालने के लिए यही करता है।

/etc/udev/rules.d/90-my-networking.rules:

SUBSYSTEM=="net",   RUN+="/usr/local/bin/my-networking-agent.sh" 

/usr/local/bin/my-networking-agent.sh:

#!/bin/sh 
logger "hey I just got interface ${INTERFACE} with action ${ACTION}" 

संपादित

यहाँ कैसे आप इसे परीक्षण कर सकते हैं है:

# modprobe dummy0 
# ifconfig dummy0 up 
# tail -n1 /var/log/syslog 
May 3 01:48:06 ernst logger: hey I just got interface dummy0 with action add 
+0

बहुत बहुत धन्यवाद! मैं उबंटू नेटवर्क मैनुअल के माध्यम से खुदाई कर रहा था और कुछ भी नहीं मिला। –

0

udev नियम इसे करने के तरीकों में से एक हैं, हालांकि वहां जानकारी की कुछ कमी है, यानी यह जानने के लिए कोई विश्वसनीय और सरल तरीका नहीं है कि veth किस कंटेनर से जुड़ा हुआ है। मुझे यकीन नहीं है कि आपके मामले में मेजबान के veth जोड़ी के अंत में बैंडविड्थ सीमा निर्धारित करने के लिए पर्याप्त है, जो कि बंद हो सकता है, लेकिन कंटेनर के नामस्थान में इसका दूसरा छोर भी है, जो कुछ आप देख सकते हैं ip netns या nsenter आदेशों का उपयोग करने पर। इसलिए यदि आपको veth जोड़ी के दोनों सिरों पर काम करने की आवश्यकता है, तो कंटेनर आईडी होना सर्वोत्तम है, ताकि आप पीआईडी ​​और इसके साथ जुड़े नेटवर्क नेमस्पेस को देख सकें। ऐसा करने का एक तरीका docker events चलाकर और इसके आउटपुट को पार्स करना है, और फिर भी डॉकर के डोमेन सॉकेट एपीआई का उपयोग करने का एक बेहतर तरीका है। एक उपयोग के मामले में जो मैंने पहले किया था, docker events पर खोलने के लिए पर्याप्त था और यहां एक लिपि है जो मैंने लिखा है, यह एक कंटेनर के अंदर एक मार्ग जोड़ता है और ethtool के साथ चेकसम ऑफ़लोड को बंद करता है।

#!/bin/sh -x 

[ ! $# = 2 ] && exit 1; 

container_interface="$1" 
add_route="$2" 

docker events | while read event 
do 
    echo $event | grep -q -v '\ start$' && continue 

    container_id=`echo $event | sed 's/.*Z\ \(.*\):\ .*/\1/'` 

    nsenter="nsenter -n -t {{ .State.Pid }} --" 
    ip_route_add="ip route add ${add_route} dev ${container_interface} proto kernel scope link src {{ .NetworkSettings.IPAddress }}" 
     ethtool_tx_off="ethtool -K ${container_interface} tx off >/dev/null" 

    eval `docker inspect --format="${nsenter} ${ip_route_add}; ${nsenter} ${ethtool_tx_off};" ${container_id}` 
done 

docker events के अलावा, वहाँ ip monitor आदेश के साथ नेटवर्किंग घटनाओं को पकड़ने का एक और तरीका है। हालांकि, इस तरह आपके पास अभी भी कंटेनर आईडी नहीं हैं, इसी प्रकार udev विधि के समान।

+1

शायद पहले grep की बजाय 'डॉकर इवेंट्स - फिल्टर' ईवेंट = स्टार्ट 'का उपयोग करें? – Bryan

संबंधित मुद्दे

 संबंधित मुद्दे