2014-10-15 10 views
11

मुझे डॉकर कंटेनर और यूयूआईडी पीढ़ी के भीतर चल रहे अनुप्रयोगों के बारे में एक सवाल था।डॉकर मैक पता जनरेशन

  • वर्तमान में हमारे अनुप्रयोगों एक घटना संचालित ढांचे का उपयोग कर रहे हैं:

    यहाँ हमारे परिदृश्य है।

  • घटनाओं के लिए हम मैक एड्रेस, पिड,
    टाइम-स्टैम्प और काउंटर पर आधारित यूयूआईडी उत्पन्न करते हैं।

  • कोरोज़ (जैसे बहुत बहुत कम मौका) पर वितरित सिस्टम पर कंटेनरों को चलाने के लिए, इस बात की कोई गारंटी नहीं है कि यूयूआईडी उत्पन्न करने के लिए उपयोग किए जाने वाले सभी पैरामीटर प्रत्येक कंटेनर के लिए एक सर्वर पर एक कंटेनर के रूप में अद्वितीय होंगे क्लस्टर एक ही मैक, पिड, टाइम-स्टैम्प और क्लस्टर पर एक और कंटेनर के रूप में काउंटर का उपयोग करके यूयूआईडी उत्पन्न कर सकता है।

  • संक्षेप में यदि इन दो यूयूआईडी दोनों एक घटना उत्पन्न करने और इसे हमारी संदेश बस में भेजने के लिए थे, तो जाहिर है कि एक संघर्ष होगा।

हमारे विश्लेषण में, यह परिदृश्य प्रत्येक डॉकर कंटेनर पर मैक पते की विशिष्टता को उबालता प्रतीत होता है।

तो खुलकर होने के लिए:

  • कैसे अद्वितीय कंटेनरों के भीतर मैक पते दिए गए हैं?
  • मैक पते मैन्युअल रूप से सेट किए जाने पर कैसे उत्पन्न होते हैं?

उत्तर

6

generateMacAddr function की मेरी पढ़ने से (संपादित: जवाब 1.3.0-dev का संबंध है, लेकिन अभी 17.05 के लिए सही है), docker द्वारा उत्पन्न MAC पते अनिवार्य रूप से docker0 पुल पर container's interface की IPv4 पता कर रहे हैं: उन्हें आईपी पते के अनुरूप होने की गारंटी है।

docker0 पुल के सबनेट आप में काम करने के लिए है, आम तौर पर 172.17.42.1/16 की this example अनुसार 255.255.0.0, 65,534 रॉटेबल पते हैं। यह यूयूआईडी पीढ़ी के लिए एन्ट्रॉपी को कम करता है, लेकिन मैक एड्रेस टकराव संभव नहीं है क्योंकि आईपी अद्वितीय होना चाहिए, और उसी डॉकर सर्वर/कोरोस होस्ट पर दो कंटेनर में समान मैक, पीआईडी, समय और काउंटर का परिदृश्य एक संभावना नहीं होनी चाहिए ।

हालांकि दो कोरोस होस्ट (प्रत्येक एक docker सर्वर चला रहा है) संभावित रूप से एक ही यादृच्छिक सबनेट चुन सकता है, जिसके परिणामस्वरूप अलग-अलग मेजबानों पर कंटेनर के लिए डुप्लीकेट मैक की संभावना होती है। आप प्रत्येक मेजबान पर docker सर्वर के लिए एक fixed CIDR सेट करके ऐसा बचने सकता है:

--fixed-cidr=CIDR - docker0 सबनेट से IP श्रेणी प्रतिबंधित, 172.167.1.0/28 जैसे मानक CIDR संकेतन का उपयोग कर। यह रेंज निश्चित आईपी के लिए और आईपीवी 4 रेंज होनी चाहिए (उदा: 10.20.0.0/16) और पुल आईपी रेंज (docker0 का एक सबसेट होना चाहिए या --bridge का उपयोग करके सेट होना चाहिए)।उदाहरण के लिए --fixed-cidr=192.168.1.0/25 के साथ, आपके कंटेनर के लिए आईपी 192.168.1.0/24 सबनेट के पहले भाग से चुने जाएंगे।

यह क्लस्टर में अद्वितीय मैक पते सुनिश्चित करना चाहिए।

मूल आईईईई 802 मैक पता मूल जेरोक्स ईथरनेट एड्रेसिंग स्कीम से आता है। यह 48-बिट पता स्थान संभावित रूप से 248 या 281,474,976,710,656 संभावित मैक पते शामिल है।

source

आप एन्ट्रापी की कमी के बारे में चिंतित हैं, तो एक बेहतर विकल्प UUID पीढ़ी के लिए एक अलग तंत्र का उपयोग हो सकता है (आईपी मैक के लिए मानचित्रण यह काफी कम कर देता है)। UUID संस्करण 3, 4 और 5 do not take MAC address खाते में। वैकल्पिक रूप से आप यूयूआईडी पीढ़ी में मेजबान मशीन के मैक को शामिल कर सकते हैं।

बेशक, क्या यह "काफी मैक स्पेस कमी" का यूयूआईडी पीढ़ी का कोई असर होगा, किसी भी कोड को बदलने से पहले शायद परीक्षण किया जाना चाहिए।

स्रोत ऊपर लिंक किया गया:

// Generate a IEEE802 compliant MAC address from the given IP address. 
// 
// The generator is guaranteed to be consistent: the same IP will always yield the same 
// MAC address. This is to avoid ARP cache issues. 
func generateMacAddr(ip net.IP) net.HardwareAddr { 
    hw := make(net.HardwareAddr, 6) 

    // The first byte of the MAC address has to comply with these rules: 
    // 1. Unicast: Set the least-significant bit to 0. 
    // 2. Address is locally administered: Set the second-least-significant bit (U/L) to 1. 
    // 3. As "small" as possible: The veth address has to be "smaller" than the bridge address. 
    hw[0] = 0x02 

    // The first 24 bits of the MAC represent the Organizationally Unique Identifier (OUI). 
    // Since this address is locally administered, we can do whatever we want as long as 
    // it doesn't conflict with other addresses. 
    hw[1] = 0x42 

    // Insert the IP address into the last 32 bits of the MAC address. 
    // This is a simple way to guarantee the address will be consistent and unique. 
    copy(hw[2:], ip.To4()) 

    return hw 
} 
+0

जवाब के लिए धन्यवाद! यह वास्तव में पुष्टि करता है कि हम अपने कार्यान्वयन पर पुनर्विचार करना चाहेंगे। – Blanco

+0

इसके अतिरिक्त, क्या आप कृपया स्पष्टीकरण दे सकते हैं कि यह कंटेनर या मेजबान का आईपीवी 4 पता है? डॉकर आईपी पते होस्ट के आईपी पते पर NAT'd हैं। दो अलग-अलग मेजबानों पर सैद्धांतिक रूप से डॉकर कंटेनर उसी सबनेट के भीतर काम कर रहे हैं जिसका मतलब है कि इस परिदृश्य में मैक पता टक्कर वास्तव में संभव है। – Blanco

+1

@ ब्लांको ने उत्तर दिया - यह कंटेनर का आईपी है – Andy

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