Docker Swarm वॉल्यूम शेयरिंग को कैसे लागू करता है?


93

डोकर झुंड दो प्रकार के भंडारण का प्रबंधन कर सकता है:

volume तथा bind

जबकि bindडॉकर डॉक्यूमेंटेशन द्वारा सुझाव नहीं दिया गया है क्योंकि यह किसी कार्य के लिए स्थानीय निर्देशिका (प्रत्येक झुंड नोड पर) के बीच एक बंधन बनाता है, volumeकार्यान्वयन का उल्लेख नहीं किया जाता है, इसलिए मुझे समझ नहीं आता कि कार्यों के बीच वॉल्यूम कैसे साझा किए जाते हैं?

  • डॉकर झुंड नोड्स के बीच वॉल्यूम कैसे साझा करता है?
  • वॉल्यूम कहां सहेजे गए हैं (एक प्रबंधक पर? और अगर एक से अधिक प्रबंधक हैं?)
  • क्या नोड्स के बीच कोई समस्या नहीं है अगर यह अलग-अलग नेटवर्क पर विभिन्न मशीनों पर चल रहा है?
  • क्या यह एक वीपीएन बनाता है?

1
झुंड साझा करता है? यह एक साल पहले की बात है जब मैंने डॉकटर झुंड से निपटा था, लेकिन मुझे लगता है कि झुंड नोड्स के बीच वॉल्यूम साझा करने के लिए जिम्मेदार नहीं है। यदि आप अपने नोड्स को समान वॉल्यूम साझा करना चाहते हैं, तो आपको वॉल्यूम प्लग इन का उपयोग करना होगा जैसे azure volumedriver।
मुंचकिन

जवाबों:


66

आप जो पूछ रहे हैं वह एक सामान्य प्रश्न है। वॉल्यूम डेटा और उस वॉल्यूम की विशेषताओं को वॉल्यूम ड्राइवर द्वारा प्रबंधित किया जा सकता है। जैसे आप विभिन्न नेटवर्क ड्राइवरों का उपयोग कर सकते हैं overlay, जैसे bridge, या host, आप विभिन्न वॉल्यूम ड्राइवरों का उपयोग कर सकते हैं।

डॉकर और झुंड केवल मानक localचालक के साथ बॉक्स से बाहर आते हैं । इसमें झुंड के बारे में कोई जागरूकता नहीं है, और यह आपके डेटा के लिए नए संस्करणों का निर्माण करेगा, जो भी आपके सेवा कार्यों को निर्धारित कर रहे हैं। यह आमतौर पर वह नहीं है जो आप चाहते हैं।

आप एक 3 पार्टी ड्राइवर प्लगइन चाहते हैं जो कि स्वार्म अवगत है, और आपके द्वारा किसी सेवा कार्य के लिए बनाई गई मात्रा को सही समय पर सही नोड पर उपलब्ध है। विकल्पों में "एडब्ल्यूएस / एज़्योर के लिए डॉकर" और इसके शामिल क्लाउडस्टोर चालक, या लोकप्रिय ओपन सोर्स आरईएक्स-रे समाधान का उपयोग करना शामिल है।

बहुत सारे 3 पार्टी वॉल्यूम ड्राइवर हैं, जिन्हें आप डॉकर स्टोर पर पा सकते हैं ।


क्या हूपअप इस तरह के एक साझा वॉल्यूम के रूप में कार्य कर सकता है?
ढेर

55

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

GlusterFS जैसे कुछ सॉफ़्टवेयर आधारित स्टोरेज सॉल्यूशन हैं, और Docker ने एक Infinit कहा है जो अभी GA नहीं है और उस पर विकास ने EE में कुबेरनेट्स एकीकरण के लिए एक पीछे की सीट ले ली है।

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

सबसे आम फ़ाइल आधारित नेटवर्क स्टोरेज NFS है (यह EFS द्वारा उपयोग किया जाने वाला एक ही प्रोटोकॉल है)। और आप बिना किसी 3rd पार्टी प्लगइन ड्राइवरों को माउंट कर सकते हैं। दुर्भाग्य से "स्थानीय" वॉल्यूम प्लगइन ड्राइवर का नाम है जो डॉक करने वाले जहाज आपको किसी भी मान को पास करने का विकल्प देता है जिसे आप चालक विकल्पों के साथ माउंट कमांड करना चाहते हैं, और कोई विकल्प नहीं है, यह डॉक निर्देशिका में संस्करणों को स्टोर करने में चूक करता है / var / lib / डोकर / संस्करणों। विकल्पों के साथ, आप इसे एनएफएस मापदंडों को पारित कर सकते हैं, और यह एनएफएस होस्टनाम पर एक DNS लुकअप भी करेगा (आपके पास सामान्य रूप से एनएफएस के साथ कुछ नहीं है)। स्थानीय वॉल्यूम ड्राइवर का उपयोग करके NFS फाइल सिस्टम को माउंट करने के विभिन्न तरीकों का एक उदाहरण है:

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

यदि आप अंत में कंपोज फाइल उदाहरण का उपयोग करते हैं, तो ध्यान दें कि वॉल्यूम में परिवर्तन (जैसे कि सर्वर पथ या पता अपडेट करना) मौजूदा नाम वाले संस्करणों में तब तक प्रदर्शित नहीं होते हैं जब तक वे मौजूद हैं। आपको नए वॉल्यूम के साथ इसे फिर से बनाने की अनुमति देने के लिए, या तो अपनी मात्रा का नाम बदलने या इसे हटाने की आवश्यकता है।

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


9

AWS EFS के लिए मेरा समाधान, जो काम करता है:

  1. ईएफएस बनाएं (सुरक्षा समूह में एनएफएस पोर्ट 2049 को खोलने के लिए मत भूलना)
  2. Nfs-common पैकेज स्थापित करें:

    sudo apt-get install -y nfs-common

  3. जांचें कि क्या आपके ईएफ़एस काम करते हैं:

    mkdir efs-test-point
    सुडो चामोद गो + रव इफ्स-टेस्ट-पॉइंट
    सुडो माउंट -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, कठिन, समय = 600, रिट्रेंस = 2, noresvport [your_EFS_DNS] / efs-test-point
    स्पर्श-परीक्षण-बिंदु / 1. स्पर्श करें
    सूद umount efs-test-point /
    ls -la efs-test-point /

    निर्देशिका खाली होनी चाहिए

    सुडो माउंट -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, कठिन, समय = 600, रिट्रेंस = 2, noresvport [your_EFS_DNS] / efs-test-point

    ls -la efs-test-point/

    फ़ाइल 1.txt मौजूद होना चाहिए

  4. Docker-compose.yml फ़ाइल कॉन्फ़िगर करें:

    सेवाएं:
      sidekiq:
        मात्रा:
          - uploads_tmp_efs: / होम / एप्लिकेशन / सार्वजनिक / अपलोड / tmp
      ...
    मात्रा:
      uploads_tmp_efs:
        ड्राइवर: स्थानीय
        driver_opts:
          प्रकार: nfs
          o: addr = [Your_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, कठिन, समय = 600, रिट्रीन्स = 2
          डिवाइस: [Your_EFS_DNS]: /


6

हमारे स्थानीय रूप से होस्ट किए गए झुंड के लिए मेरा समाधान: प्रत्येक कार्यकर्ता नोड ने एक एनएफ़एस-शेयर पर मुहिम शुरू की है, जिस पर हमारे फाइलरवर द्वारा प्रदान किया गया है /mnt/docker-data। जब मैं अपनी सेवाओं में फ़ाइलों को परिभाषित करता हूं, तो मैं /mnt/docker-dataउदाहरण के लिए डिवाइस को कुछ पथ पर सेट करता हूं :

volumes:
  traefik-logs:
    driver: local
    driver_opts:
      o: bind
      device: /mnt/docker-data/services/traefik/logs
      type: none

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

यदि आप नोड्स फाइलसिस्टम पर करीब से नज़र डालते हैं, तो आप देखते हैं कि मेरे फाइलरवर माउंट के लिए माउंट नीचे बनाए गए हैं /var/lib/docker/volumes, यहाँ देखें:

root@node-3:~# df -h
Dateisystem                                                                                                   Größe Benutzt Verf. Verw% Eingehängt auf
[...]
fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs                                 194G    141G   53G   73% /var/lib/docker/volumes/traefik_traefik-logs/_data
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.