Docker Swarm triển khai chia sẻ khối lượng như thế nào?


93

Docker Swarm có thể quản lý hai loại lưu trữ:

volumebind

Mặc dù bindkhông được Docker Documentation đề xuất vì nó tạo ràng buộc giữa một thư mục cục bộ (trên mỗi Node bầy đàn) với một tác vụ, việc volumetriển khai không được đề cập, vì vậy tôi không hiểu cách chia sẻ khối lượng giữa các tác vụ?

  • Docker Swarm chia sẻ khối lượng giữa các nút như thế nào?
  • Ổ đĩa được lưu ở đâu (trên một trình quản lý? Và nếu có nhiều hơn một trình quản lý?)
  • Không có vấn đề gì giữa các nút nếu nó chạy trên các máy khác nhau trên các mạng khác nhau?
  • Nó có tạo VPN không?

1
Swarm có chia sẻ khối lượng không? Khoảng một năm trước, tôi đã xử lý với docker swarm, nhưng tôi nghĩ swarm KHÔNG chịu trách nhiệm chia sẻ khối lượng giữa các nút. Nếu bạn muốn các nút của mình chia sẻ cùng một khối lượng, bạn phải sử dụng các plugin khối lượng như azure volumedriver.
Munchkin

Câu trả lời:


66

Những gì bạn đang hỏi là một câu hỏi phổ biến. Dữ liệu âm lượng và các tính năng của âm lượng đó có thể làm được do trình điều khiển âm lượng quản lý. Cũng giống như bạn có thể sử dụng trình điều khiển mạng khác nhau như overlay, bridgehoặc host, bạn có thể sử dụng trình điều khiển âm lượng khác nhau.

Docker và Swarm chỉ đi kèm với localtrình điều khiển tiêu chuẩn ra khỏi hộp. Nó không có bất kỳ nhận thức nào về Swarm và nó sẽ chỉ tạo khối lượng mới cho dữ liệu của bạn trên bất kỳ nút nào mà các nhiệm vụ dịch vụ của bạn được lên lịch. Đây thường không phải là những gì bạn muốn.

Bạn muốn có một plugin trình điều khiển của bên thứ 3 nhận biết được Swarm và sẽ đảm bảo khối lượng bạn đã tạo cho tác vụ dịch vụ có sẵn trên nút bên phải vào đúng thời điểm. Các tùy chọn bao gồm sử dụng "Docker cho AWS / Azure" và trình điều khiển CloudStor đi kèm của nó hoặc giải pháp REX-Ray nguồn mở phổ biến .

Có rất nhiều trình điều khiển âm lượng của bên thứ 3 mà bạn có thể tìm thấy trên Docker Store .


hadoop có thể hoạt động như một khối lượng chia sẻ như vậy không?
stackit

55

Bản thân Swarm Mode không làm bất kỳ điều gì khác biệt với volume, nó chạy bất kỳ lệnh mount volume nào bạn cung cấp trên nút nơi vùng chứa đang chạy. Nếu khối lượng gắn kết của bạn là cục bộ cho nút đó, thì dữ liệu của bạn sẽ được lưu cục bộ trên nút đó. Không có chức năng tích hợp để di chuyển dữ liệu giữa các nút tự động.

Có một số giải pháp lưu trữ phân tán dựa trên phần mềm như GlusterFS và Docker có một giải pháp được gọi là Infinit chưa phải là GA và việc phát triển dựa trên đó đã đặt chỗ dựa cho tích hợp Kubernetes trong EE.

Kết quả điển hình là bạn cần quản lý sao chép bộ nhớ trong ứng dụng của mình (ví dụ: etcd và các thuật toán dựa trên bè khác) hoặc bạn thực hiện gắn kết của mình trên hệ thống lưu trữ bên ngoài (hy vọng với HA của riêng nó). Gắn hệ thống lưu trữ bên ngoài có hai tùy chọn, khối hoặc dựa trên tệp. Lưu trữ dựa trên khối (ví dụ EBS) thường đi kèm với hiệu suất cao hơn, nhưng bị giới hạn là chỉ được gắn trên một nút duy nhất. Đối với điều này, bạn thường sẽ cần trình điều khiển plugin khối lượng của bên thứ ba để cấp cho nút docker của bạn quyền truy cập vào bộ nhớ khối đó. Lưu trữ dựa trên tệp (ví dụ: EFS) có hiệu suất thấp hơn, nhưng di động hơn và có thể được gắn đồng thời trên nhiều nút, điều này rất hữu ích cho một dịch vụ sao chép.

Lưu trữ mạng dựa trên tệp phổ biến nhất là NFS (đây là cùng một giao thức được EFS sử dụng). Và bạn có thể gắn kết mà không cần bất kỳ trình điều khiển plugin nào của bên thứ ba. Thật không may, trình điều khiển plugin khối lượng "cục bộ" có tên là docker cung cấp cho bạn tùy chọn để chuyển bất kỳ giá trị nào bạn muốn vào lệnh mount với tùy chọn trình điều khiển và không có tùy chọn, nó mặc định lưu trữ khối lượng trong thư mục docker / var / lib / docker / khối lượng. Với các tùy chọn, bạn có thể chuyển cho nó các tham số NFS và thậm chí nó sẽ thực hiện tra cứu DNS trên tên máy chủ NFS (thông thường bạn không có với NFS). Dưới đây là ví dụ về các cách khác nhau để gắn kết hệ thống tệp NFS bằng trình điều khiển âm lượng cục bộ:

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

Nếu bạn sử dụng ví dụ về tệp soạn ở cuối, hãy lưu ý rằng các thay đổi đối với một ổ (ví dụ: cập nhật đường dẫn hoặc địa chỉ máy chủ) không được phản ánh trong các ổ có tên hiện có miễn là chúng tồn tại. Bạn cần đổi tên hoặc xóa ổ đĩa của mình để cho phép bầy đàn tạo lại nó với các giá trị mới.

Vấn đề phổ biến khác mà tôi thấy trong hầu hết việc sử dụng NFS là "bí rễ" đang được bật trên máy chủ. Điều này dẫn đến các vấn đề về quyền khi các vùng chứa đang chạy dưới dạng root cố gắng ghi tệp vào ổ đĩa. Bạn cũng gặp các vấn đề tương tự về quyền UID / GID trong đó vùng chứa UID / GID là vùng cần có quyền để ghi vào ổ đĩa, điều này có thể yêu cầu quyền sở hữu thư mục và quyền được điều chỉnh trên máy chủ NFS.


9

Giải pháp của tôi cho AWS EFS, hoạt động:

  1. Tạo EFS (đừng quên mở cổng NFS 2049 tại nhóm bảo mật)
  2. Cài đặt gói nfs-common:

    sudo apt-get install -y nfs-common

  3. Kiểm tra xem efs của bạn có hoạt động không:

    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
    chạm vào efs-test-point / 1.txt
    sudo umount efs-test-point /
    ls -la efs-test-point /

    thư mục phải trống

    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/

    tệp 1.txt phải tồn tại

  4. Định cấu hình tệp docker-compost.yml:

    dịch vụ:
      sidekiq:
        khối lượng:
          - uploads_tmp_efs: / home / application / public / uploads / tmp
      ...
    khối lượng:
      uploads_tmp_efs:
        tài xế: địa phương
        driver_opts:
          loại: nfs
          o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2
          thiết bị: [YOUR_EFS_DNS]: /


6

Giải pháp của tôi cho nhóm được lưu trữ cục bộ của chúng tôi: mỗi nút công nhân đã gắn kết chia sẻ nfs, được cung cấp bởi máy chủ tệp của chúng tôi trên /mnt/docker-data. Khi tôi xác định khối lượng trong các dịch vụ của mình để soạn tệp, tôi đặt thiết bị thành một số đường dẫn bên dưới /mnt/docker-data, ví dụ:

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

Với giải pháp này, docker tạo ra khối lượng trên mọi nút, dịch vụ được triển khai và - thật bất ngờ - đã có dữ liệu, bởi vì nó là cùng một đường dẫn, được sử dụng bởi khối lượng trên nút kia.

Nếu bạn xem xét kỹ hơn hệ thống tệp của các nút, bạn sẽ thấy rằng các liên kết đến gắn kết máy chủ tệp của tôi được tạo bên dưới /var/lib/docker/volumes, xem tại đây:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.