Docker Swarm birim paylaşımını nasıl uygular?


93

Docker Swarm iki tür depolamayı yönetebilir:

volume ve bind

İken bindbir bir göreve (her sürüsü Düğüm üzerinde) yerel bir dizine arasındaki bağlayıcı oluşturur beri Docker Dokümantasyon önerdiği edilmez, volumeben hacimleri görevler arasında paylaşılır anlamak kalmamak uygulanması, söz edilmez?

  • Docker Swarm, düğümler arasında birimleri nasıl paylaşır?
  • Birimler nereye kaydedilir (bir yönetici üzerinde mi? Birden fazla yönetici varsa?)
  • Farklı ağlardaki farklı makinelerde çalışıyorsa, düğümler arasında sorun yok mu?
  • VPN oluşturur mu?

1
Swarm hacimleri paylaşıyor mu? Yaklaşık bir yıl önce, docker swarm ile uğraştım, ancak bence düğümler arasındaki hacimleri paylaşmaktan sürü sorumlu DEĞİL. Düğümlerinizin aynı hacmi paylaşmasını istiyorsanız, azure volumedriver gibi hacim eklentileri kullanmanız gerekir.
Munchkin

Yanıtlar:


66

Sorduğunuz şey, ortak bir sorudur. Hacim verileri ve bu birimin yapabileceklerinin özellikleri bir birim sürücüsü tarafından yönetilir. Eğer gibi farklı ağ sürücüleri kullanabilir Tıpkı overlay, bridgeya host, farklı ses sürücüleri kullanabilirsiniz.

Docker ve Swarm yalnızca standart localsürücü ile birlikte gelir . Swarm konusunda herhangi bir farkındalığa sahip değildir ve yalnızca hizmet görevlerinizin planlandığı düğümdeki verileriniz için yeni birimler oluşturacaktır. Bu genellikle istediğiniz şey değildir.

Swarm'ın farkında olan ve bir hizmet görevi için oluşturduğunuz birimin doğru zamanda doğru düğümde mevcut olmasını sağlayacak bir 3. taraf sürücü eklentisi istiyorsunuz. Seçenekler arasında "AWS / Azure için Docker" ve dahil olan CloudStor sürücüsünün veya popüler açık kaynaklı REX-Ray çözümünün kullanılması yer alır.

Docker Store'da bulabileceğiniz çok sayıda 3. parti birim sürücüsü vardır .


hadoop böyle bir paylaşılan cilt gibi davranabilir mi?
stackit

55

Swarm Mode, birimlerle farklı bir şey yapmaz, konteynerin çalıştığı düğümde sağladığınız herhangi bir birim bağlama komutunu çalıştırır. Birim montajınız bu düğüm için yerelse, verileriniz yerel olarak o düğüme kaydedilir. Verileri düğümler arasında otomatik olarak taşımak için yerleşik bir işlev yoktur.

GlusterFS gibi bazı yazılım tabanlı dağıtılmış depolama çözümleri vardır ve Docker, henüz GA olmayan Infinit adında bir tanesine sahiptir ve EE'deki Kubernetes entegrasyonuna arka koltuk almıştır.

Tipik sonuç, ya uygulamanızdaki depolamanın replikasyonunu yönetmeniz (örn. Etcd ve diğer sal tabanlı algoritmalar) ya da bağlantılarınızı harici bir depolama sisteminde (umarız kendi HA'sı ile) gerçekleştirmenizdir. Harici bir depolama sistemini bağlamak blok veya dosya tabanlı olmak üzere iki seçeneğe sahiptir. Blok tabanlı depolama (örn. EBS) tipik olarak daha yüksek performansla gelir, ancak yalnızca tek bir düğüme monte edilmesiyle sınırlıdır. Bunun için, docker düğümünüze bu blok depolamaya erişim sağlamak için genellikle bir 3. parti birim eklenti sürücüsüne ihtiyacınız olacaktır. Dosya tabanlı depolama (örn. EFS) daha düşük performansa sahiptir, ancak daha taşınabilirdir ve aynı anda birden çok düğüme monte edilebilir, bu da çoğaltılmış bir hizmet için yararlıdır.

En yaygın dosya tabanlı ağ depolaması NFS'dir (bu, EFS tarafından kullanılan protokoldür). Ve bunu herhangi bir 3. taraf eklenti sürücüsü olmadan monte edebilirsiniz. Docker ile birlikte gönderilen maalesef adlandırılmış "yerel" birim eklenti sürücüsü, size istediğiniz değerleri sürücü seçenekleriyle bağlama komutuna geçirme seçeneği sunar ve hiçbir seçenek olmadan birimleri docker dizininde / var / lib / docker / volumes. Seçeneklerle, ona NFS parametrelerini iletebilirsiniz ve hatta NFS ana bilgisayar adı üzerinde bir DNS araması bile gerçekleştirir (normalde NFS ile sahip olmadığınız bir şey). Yerel birim sürücüsünü kullanarak bir NFS dosya sistemini bağlamanın farklı yollarının bir örneğini burada bulabilirsiniz:

  # 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"
  ...

Sonunda oluşturma dosyası örneğini kullanırsanız, bir birimdeki değişikliklerin (örneğin, sunucu yolunu veya adresini güncelleme) var oldukları sürece var olan adlandırılmış birimlere yansıtılmadığını unutmayın. Swarm'ın yeni değerlerle yeniden oluşturmasına izin vermek için ya biriminizi yeniden adlandırmanız ya da silmeniz gerekir.

Çoğu NFS kullanımında gördüğüm diğer yaygın sorun, sunucuda etkinleştirilen "kök ezme" dir. Bu, kök olarak çalışan kapsayıcılar birime dosya yazmaya çalıştığında izin sorunlarına yol açar. Ayrıca, kapsayıcı UID / GID'nin birime yazmak için izinlere ihtiyaç duyduğu ve NFS sunucusunda dizin sahipliğini ve izinlerin ayarlanmasını gerektirebilecek benzer UID / GID izin sorunlarınız var.


9

AWS EFS için şu şekilde çalışan çözümüm:

  1. EFS oluştur (güvenlik grubunda 2049 NFS bağlantı noktasını açmayı unutmayın)
  2. Nfs-common paketini kurun:

    sudo apt-get install -y nfs-common

  3. EF'lerinizin çalışıp çalışmadığını kontrol edin:

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

    dizin boş olmalı

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

    ls -la efs-test-point/

    1.txt dosyası bulunmalıdır

  4. Docker-compose.yml dosyasını yapılandırın:

    Hizmetler:
      sidekiq:
        ciltler:
          - uploads_tmp_efs: / home / application / public / uploads / tmp
      ...
    ciltler:
      uploads_tmp_efs:
        sürücü: yerel
        driver_opts:
          tür: nfs
          o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2
          cihaz: [YOUR_EFS_DNS]: /


6

Yerel olarak barındırılan kümemiz için çözümüm: her çalışan düğümü, dosya sunucumuz tarafından sağlanan bir nfs paylaşımına bağladı /mnt/docker-data. Hizmetlerimde birimleri tanımladığımda, dosyaları aşağıdaki gibi bir yola ayarlıyorum, /mnt/docker-dataörneğin:

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

Bu çözümle docker, her düğümde birimi oluşturur, hizmet dağıtılır ve - sürpriz - zaten veriler vardır, çünkü bu, diğer düğümdeki birim tarafından kullanılan yolun aynısıdır.

Düğümler dosya sistemine daha yakından bakarsanız, dosya sunucum için bağlama işlemlerinin altında oluşturulduğunu /var/lib/docker/volumesgörürsünüz, buraya bakın:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.