Docker Swarm ใช้การแชร์ระดับเสียงอย่างไร


93

Docker Swarm สามารถจัดการพื้นที่เก็บข้อมูลได้สองประเภท:

volume และ bind

แม้ว่าbindDocker Documentation จะไม่ได้รับการแนะนำเนื่องจากสร้างการเชื่อมโยงระหว่างไดเร็กทอรีโลคัล (บนโหนดกลุ่มแต่ละโหนด) กับงาน แต่การvolumeใช้งานไม่ได้กล่าวถึงดังนั้นฉันจึงไม่เข้าใจว่าไดรฟ์ข้อมูลถูกแบ่งปันระหว่างงานอย่างไร

  • Docker Swarm แชร์ไดรฟ์ข้อมูลระหว่างโหนดอย่างไร
  • ไดรฟ์ข้อมูลถูกบันทึกไว้ที่ไหน (ในผู้จัดการและหากมีผู้จัดการมากกว่าหนึ่งคน)
  • จะไม่มีปัญหาระหว่างโหนดหรือไม่ถ้ามันทำงานบนเครื่องอื่นบนเครือข่ายที่แตกต่างกัน
  • มันสร้าง VPN หรือไม่?

1
Swarm แบ่งปันปริมาณหรือไม่ ประมาณหนึ่งปีที่แล้วที่ฉันจัดการกับฝูงนักเทียบท่า แต่ฉันคิดว่าฝูงไม่รับผิดชอบต่อการแบ่งปันปริมาณระหว่างโหนด หากคุณต้องการให้โหนดของคุณแชร์ไดรฟ์ข้อมูลเดียวกันคุณต้องใช้ปลั๊กอินไดรฟ์ข้อมูลเช่น azure volumedriver
Munchkin

คำตอบ:


66

สิ่งที่คุณถามเป็นคำถามทั่วไป ข้อมูลโวลุ่มและคุณสมบัติของสิ่งที่โวลุ่มทำได้ถูกจัดการโดยไดรเวอร์โวลุ่ม เช่นเดียวกับที่คุณสามารถใช้ไดรเวอร์เครือข่ายที่แตกต่างกันเช่นoverlay, bridgeหรือhostคุณสามารถใช้โปรแกรมควบคุมปริมาณที่แตกต่างกัน

Docker และ Swarm มาพร้อมกับlocalไดรเวอร์มาตรฐานเท่านั้น ไม่มีการรับรู้ Swarm ใด ๆ และจะสร้างไดรฟ์ข้อมูลใหม่สำหรับข้อมูลของคุณบนโหนดใดก็ตามที่งานบริการของคุณกำหนดไว้ โดยปกติจะไม่ใช่สิ่งที่คุณต้องการ

คุณต้องการปลั๊กอินไดรเวอร์ของ บริษัท อื่นที่ Swarm ทราบและจะตรวจสอบให้แน่ใจว่าไดรฟ์ข้อมูลที่คุณสร้างขึ้นสำหรับงานบริการพร้อมใช้งานบนโหนดที่ถูกต้องในเวลาที่เหมาะสม ตัวเลือกต่างๆ ได้แก่ การใช้ "Docker for AWS / Azure" และไดรเวอร์CloudStor ที่ให้มาหรือโซลูชันREX-Rayแบบโอเพนซอร์สยอดนิยม

มีจำนวนมากของไดรเวอร์ปริมาณของบุคคลที่ 3 ซึ่งคุณสามารถค้นหาบนมีหางร้าน


hadoop สามารถทำหน้าที่เป็นไดรฟ์ข้อมูลที่แชร์ได้หรือไม่?
stackit

55

โหมด Swarm เองไม่ได้ทำอะไรที่แตกต่างกับไดรฟ์ข้อมูลโดยจะรันคำสั่งการเมานต์ไดรฟ์ข้อมูลใด ๆ ที่คุณระบุบนโหนดที่คอนเทนเนอร์กำลังทำงานอยู่ หากการเมานต์โวลุ่มของคุณอยู่ภายในโหนดนั้นข้อมูลของคุณจะถูกบันทึกไว้ในโหนดนั้น ไม่มีฟังก์ชันในตัวที่จะย้ายข้อมูลระหว่างโหนดโดยอัตโนมัติ

มีซอฟต์แวร์ที่ใช้โซลูชันการจัดเก็บข้อมูลแบบกระจายเช่น GlusterFS และ Docker มีหนึ่งที่เรียกว่า Infinit ซึ่งยังไม่ใช่ GA และการพัฒนาที่นำเบาะหลังไปสู่การรวม Kubernetes ใน EE

ผลลัพธ์โดยทั่วไปคือคุณต้องจัดการการจำลองแบบของพื้นที่จัดเก็บภายในแอปพลิเคชันของคุณ (เช่น etcd และอัลกอริทึมที่ใช้แพอื่น ๆ ) หรือคุณทำการเมาท์บนระบบจัดเก็บข้อมูลภายนอก (หวังว่าจะมี HA ของตัวเอง) การติดตั้งระบบจัดเก็บข้อมูลภายนอกมีสองตัวเลือกบล็อกหรือไฟล์ตาม ที่เก็บข้อมูลแบบบล็อก (เช่น EBS) มักจะมาพร้อมกับประสิทธิภาพที่สูงขึ้น แต่ถูก จำกัด ให้ติดตั้งบนโหนดเดียวเท่านั้น สำหรับสิ่งนี้โดยทั่วไปคุณจะต้องมีไดรเวอร์ปลั๊กอินโวลุ่มของบุคคลที่สามเพื่อให้โหนดนักเทียบท่าของคุณเข้าถึงที่เก็บข้อมูลบล็อกนั้น ที่เก็บข้อมูลตามไฟล์ (เช่น EFS) มีประสิทธิภาพต่ำกว่า แต่พกพาสะดวกกว่าและสามารถติดตั้งพร้อมกันบนหลายโหนดซึ่งเป็นประโยชน์สำหรับบริการที่จำลองแบบ

ที่เก็บข้อมูลบนเครือข่ายที่ใช้ไฟล์ทั่วไปคือ NFS (เป็นโปรโตคอลเดียวกับที่ใช้โดย EFS) และคุณสามารถเมานต์ได้โดยไม่ต้องมีไดรเวอร์ปลั๊กอินของบุคคลที่สาม น่าเสียดายที่ไดรเวอร์ปลั๊กอินไดรฟ์ข้อมูลที่มีชื่อว่า "local" ที่นักเทียบท่ามาพร้อมกับคุณมีตัวเลือกในการส่งผ่านค่าใด ๆ ที่คุณต้องการไปยังคำสั่งเมานต์พร้อมตัวเลือกไดรเวอร์และไม่มีตัวเลือกใด ๆ จะเริ่มต้นที่การจัดเก็บไดรฟ์ข้อมูลในไดเร็กทอรี docker / var / lib / นักเทียบท่า / ไดรฟ์ข้อมูล ด้วยตัวเลือกคุณสามารถส่งผ่านพารามิเตอร์ NFS และจะทำการค้นหา DNS บนชื่อโฮสต์ NFS (สิ่งที่คุณไม่มีใน NFS ตามปกติ) นี่คือตัวอย่างของวิธีต่างๆในการเมานต์ระบบไฟล์ 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"
  ...

หากคุณใช้ตัวอย่างไฟล์เขียนในตอนท้ายโปรดทราบว่าการเปลี่ยนแปลงไดรฟ์ข้อมูล (เช่นการอัปเดตเส้นทางเซิร์ฟเวอร์หรือที่อยู่) จะไม่แสดงในไดรฟ์ข้อมูลที่มีชื่อที่มีอยู่ตราบเท่าที่มีอยู่ คุณต้องเปลี่ยนชื่อวอลลุ่มของคุณหรือลบออกเพื่อให้ swarm สร้างมันขึ้นมาใหม่ด้วยค่าใหม่

ปัญหาทั่วไปอื่น ๆ ที่ฉันเห็นในการใช้งาน NFS ส่วนใหญ่คือ "รูทสควอช" ถูกเปิดใช้งานบนเซิร์ฟเวอร์ ส่งผลให้เกิดปัญหาการอนุญาตเมื่อคอนเทนเนอร์ที่รันในฐานะรูทพยายามเขียนไฟล์ไปยังไดรฟ์ข้อมูล นอกจากนี้คุณยังมีปัญหาเกี่ยวกับสิทธิ์ UID / GID ที่คล้ายกันโดยที่คอนเทนเนอร์ UID / GID เป็นสิ่งที่ต้องการสิทธิ์ในการเขียนไปยังไดรฟ์ข้อมูลซึ่งอาจต้องใช้การเป็นเจ้าของไดเร็กทอรีและสิทธิ์ในการปรับบนเซิร์ฟเวอร์ NFS


9

โซลูชันของฉันสำหรับ AWS EFS ที่ใช้งานได้:

  1. สร้าง EFS (อย่าลืมเปิดพอร์ต NFS 2049 ที่กลุ่มความปลอดภัย)
  2. ติดตั้งแพ็คเกจ nfs-common:

    sudo apt-get install -y nfs-common

  3. ตรวจสอบว่า efs ของคุณใช้งานได้หรือไม่:

    mkdir efs-test-point
    sudo chmod go + rw efs-test-point
    sudo mount -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2, noresvport [YOUR_EFS_DNS]: / efs-test-point
    แตะ efs-test-point / 1.txt
    sudo umount efs-test-point /
    ls -la efs-test-point /

    ไดเรกทอรีต้องว่างเปล่า

    sudo mount -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2, noresvport [YOUR_EFS_DNS]: / efs-test-point

    ls -la efs-test-point/

    ไฟล์ 1.txt ต้องมีอยู่

  4. กำหนดค่าไฟล์ docker-compose.yml:

    บริการ:
      ไซด์คิค:
        ปริมาณ:
          - uploads_tmp_efs: / home / application / public / uploads / tmp
      ...
    ปริมาณ:
      uploads_tmp_efs:
        คนขับรถ: ท้องถิ่น
        driver_opts:
          ชนิด: nfs
          o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, ยาก, timeo = 600, retrans = 2
          อุปกรณ์: [YOUR_EFS_DNS]: /


6

วิธีแก้ปัญหาของฉันสำหรับฝูงที่โฮสต์ในเครื่องของเรา: โหนดของผู้ปฏิบัติงานทุกคนได้ติดตั้ง nfs-share ที่เซิร์ฟเวอร์ไฟล์ของเราเปิด/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.