अमेज़न ईसीएस (डॉकर): विशिष्ट आईपी पते के लिए बाध्यकारी कंटेनर


24

मैं अमेज़ॅन ईसीएस (डॉकटर का पुन: लाभ) के साथ खेल रहा हूं और मुझे पता चल रहा है कि एक डॉकर क्षमता है जिसे ईसीएस प्रदान नहीं करता है। अर्थात्, मैं एक उदाहरण में कई कंटेनरों को चलाना चाहूंगा, और अनुरोधों को आईपी पते 1 कंटेनर 1 में आ रहा हूं, और आईपी पते 2 मैप कंटेनर 2 पर आने का अनुरोध करता हूं, आदि।

डॉकर में, कंटेनर को एक विशिष्ट आईपी पते से बांधना होता है:

docker run -p myHostIPAddr:80:8080 imageName command

हालाँकि, Amazon ECS में, ऐसा करने का कोई तरीका प्रतीत नहीं होता है।

मैंने कई लोचदार IP पतों के साथ EC2 उदाहरण स्थापित किया है। जब एक कंटेनर को कार्य परिभाषा के भाग के रूप में कॉन्फ़िगर किया जाता है, तो कंटेनर पोर्ट में होस्ट पोर्ट को मैप करना संभव है। हालांकि, डॉकर के विपरीत, ईसीएस मैपिंग के हिस्से के रूप में होस्ट आईपी पते को निर्दिष्ट करने का एक तरीका प्रदान नहीं करता है।

एक अतिरिक्त मोड़ यह है कि मैं कंटेनर एन से कंटेनर एन के बाहरी आईपी पते के आउटबाउंड अनुरोध करना चाहूंगा।

क्या उपरोक्त सभी करने का कोई तरीका है?

मैंने AWS सीएलआई प्रलेखन के साथ-साथ जावा के लिए AWS SDK को देखा है। मैं देख सकता हूं कि सीएलआई एक नेटवर्कबाइंडिंग सरणी वापस कर सकता है जिसमें इस तरह के तत्व हैं:

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},

और जावा एसडीके में नेटवर्कबाइंडिंग नामक एक वर्ग है जो समान जानकारी का प्रतिनिधित्व करता है। हालाँकि, यह जानकारी केवल अनुरोध के जवाब में आउटपुट-प्रतीत होती है। मुझे ECS को यह बाध्यकारी जानकारी प्रदान करने का कोई तरीका नहीं मिल रहा है।

इसका कारण यह है कि मैं यह करना चाहता हूं कि मैं एक ही EC2 उदाहरण पर संभावित रूप से विभिन्न कंटेनरों का उपयोग करके, विभिन्न निर्वाचन क्षेत्रों के लिए पूरी तरह से अलग वीएम सेट करना चाहता हूं। प्रत्येक वीएम का अपना एक वेब सर्वर (अलग एसएसएल प्रमाणपत्र सहित) होगा, साथ ही साथ इसकी अपनी एफ़टीपी और एसएसएच सेवा भी होगी।

धन्यवाद।


मैं हमारे कार्यप्रवाह के साथ एक ही मुद्दा रहा हूँ। aws ecs describe-container-instancesमदद करने के लिए प्रतीत नहीं होता। वे वास्तव में आपको एक ईएलबी का उपयोग करने के लिए धक्का देना चाहते हैं, जो हमारे मामले के लिए गूंगा है।
चार ४३

अब ऐसा करने का एक तरीका प्रतीत होता है (Q4 2017): stackoverflow.com/a/46577872/6309
VonC

जवाबों:


4

एक विकल्प: प्रत्येक ग्राहक के लिए एक ईएलबी बनाएं, और फिर प्रत्येक ईएलबी को कुछ कंटेनरों को असाइन करें।

[१] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html


13
सीए-चिंग! एक ईएलबी के लिए 18 रुपये प्रति माह। अब, ईसीएस के साथ माइक्रो सर्विस कौन चाहते हैं? aws.amazon.com/elasticloadbalancing/pricing
नॉट्स

1
@Knots में भी यही समस्या थी। फिर हमने लैम्ब्डा + एपीआई गेटवे पर स्विच किया और हमारी लागत 10 सेंट तक कम हो गई।
१५:४

अब आप अपनी सभी सेवाओं के लिए 1 प्रति सेवा के बजाय एक एकल ALB (क्लासिक ELB के बजाय) का उपयोग कर सकते हैं। उन्हें या तो अलग-अलग होस्टनाम या होस्टनाम पर अलग-अलग रास्तों पर होना चाहिए।
एजे ब्राउन

4

यहाँ यह करने के लिए एक वास्तविक, तार्किक तरीका है। यह बहुत जटिल लगता है, लेकिन आप वास्तव में इसे कुछ ही मिनटों में लागू कर सकते हैं, और यह काम करता है। मैं वास्तव में इसे लागू कर रहा हूं जैसा कि हम बोलते हैं।

आप प्रत्येक कंटेनर के लिए एक कार्य बनाते हैं, और आप प्रत्येक कार्य के लिए एक सेवा बनाते हैं, प्रत्येक सेवा के लिए लक्ष्य समूह के साथ मिलकर। और फिर आप सिर्फ 1 इलास्टिक लोड बैलेंसर बनाएं।

आवेदन-आधारित इलास्टिक लोड बैलेंसर अनुरोधित पथ के आधार पर अनुरोधों को रूट कर सकते हैं। लक्ष्य समूहों का उपयोग करके, आप elb-domain.com/1कंटेनर 1, elb-domain.com/2कंटेनर 2 आदि के लिए आने वाले अनुरोधों को रूट कर सकते हैं ।

अब आप केवल एक कदम दूर हैं। एक रिवर्स प्रॉक्सी सर्वर बनाएं।

मेरे मामले में हम nginx का उपयोग कर रहे हैं, इसलिए आप जितने चाहें उतने IP के साथ एक nginx सर्वर बना सकते हैं, और nginx की रिवर्स प्रॉक्सिंग क्षमता का उपयोग करके आप अपने IP को अपने ELB के रास्तों पर ले जा सकते हैं, जो तदनुसार उन्हें सही कंटेनर में ले जाता है। (रों)। यदि आप डोमेन का उपयोग कर रहे हैं तो यहां एक उदाहरण है।

server {
    server_name domain1.com;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://elb-domain.com/1;
    }
}

बेशक, अगर आप वास्तव में आईपी सुन रहे हैं तो आप server_nameलाइन को छोड़ सकते हैं और बस संबंधित इंटरफेस को सुन सकते हैं ।

यह वास्तव में एक स्थिर आईपी प्रति कंटेनर निर्दिष्ट करने से बेहतर है क्योंकि यह आपको डॉकटर मशीनों के क्लस्टर प्रदान करने की अनुमति देता है जहां आपके प्रत्येक "आईपी" के लिए उस क्लस्टर पर अनुरोध संतुलित होते हैं। एक मशीन को फिर से बनाना स्थिर आईपी को प्रभावित नहीं करता है और आपको बहुत कॉन्फ़िगरेशन को फिर से करना नहीं पड़ता है।

यद्यपि यह आपके प्रश्न का पूरी तरह से उत्तर नहीं देता है क्योंकि यह आपको एफ़टीपी और एसएसएच का उपयोग करने की अनुमति नहीं देगा, मेरा तर्क है कि आपको ऐसा करने के लिए कभी भी डॉकर का उपयोग नहीं करना चाहिए, और आपको इसके बजाय क्लाउड सर्वर का उपयोग करना चाहिए। यदि आप डॉकर का उपयोग कर रहे हैं, तो एफ़टीपी या एसएसएच का उपयोग करके सर्वर को अपडेट करने के बजाय, आपको कंटेनर को ही अपडेट करना चाहिए। हालाँकि, HTTP और HTTPS के लिए, यह विधि पूरी तरह से काम करती है।


1

आप स्वयं कंटेनर में नहीं जा सकते, लेकिन आप EC2 उदाहरण को एक विशिष्ट कंटेनर को समर्पित कर सकते हैं। फिर, जहां आपको उस सेवा तक पहुंचने की आवश्यकता है, आप कंटेनर चलाने वाले ईसी 2 होस्ट का संदर्भ ले सकते हैं।

  • इस आवश्यकता के साथ अपनी सेवाओं के लिए एक समर्पित क्लस्टर बनाएं
  • अपने पसंदीदा उदाहरण प्रकार का उपयोग करके एक एएमआई-अनुकूलित ईसी 2 इंस्टेंस बनाएं
    • उस गाइड में वर्णित अनुसार UserData विकल्प का उपयोग करके उपरोक्त क्लस्टर को उस उदाहरण को निर्दिष्ट करना सुनिश्चित करें।
  • "ब्रिज" (अपने डेस्कटॉप के समान) के लिए सेट NetworkMode के साथ एक टास्कफाइनेशन बनाएं
  • इसके साथ एक सेवा परिभाषा बनाएँ:
    • LaunchType EC2 पर सेट किया गया
    • क्लस्टर आपके द्वारा बनाए गए क्लस्टर पर सेट है
    • टास्क परिभाषा आपके द्वारा ऊपर बनाई गई कार्य परिभाषा पर सेट है
  • EC2 उदाहरण के लिए किसी भी सुरक्षा समूह को असाइन करें जैसा कि आप अन्यथा करेंगे।

हालाँकि आप अभी भी सीधे EC2 उदाहरण से बात कर रहे हैं, आप EC2 उदाहरण के रूप में कंटेनर (अप्रत्यक्ष रूप से) के आईपी को नियंत्रित कर सकते हैं। यह आपको "नंगे धातु" पर सेवाओं को चलाने के सिरदर्द को बचाता है जिससे आपको सेवा और कॉन्फ़िगरेशन को आसानी से प्रबंधित और कॉन्फ़िगर करने की अनुमति मिलती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.