programing

도커 스웜은 볼륨 공유를 어떻게 구현합니까?

lastcode 2023. 9. 14. 23:17
반응형

도커 스웜은 볼륨 공유를 어떻게 구현합니까?

도커 스웜(Docker Swarm)은 다음과 같은 두 가지 유형의 스토리지를 관리할 수 있습니다.

volume그리고.bind

하는 동안에bind노드에 .volume구현이 언급되지 않았는데, 작업 간에 볼륨이 공유되는 방식을 이해할 수 없습니까?

  • 도커 스웜은 노드 간에 볼륨을 어떻게 공유합니까?
  • 볼륨이 저장되는 위치(Manager)관리자가 둘 이상인 경우?)
  • 서로 다른 네트워크의 서로 다른 기계에서 실행된다면 노드 간에 문제가 없습니까?
  • VPN을 만들 수 있습니까?

스웜 모드 자체는 볼륨과 다른 작업을 수행하지 않으며, 컨테이너가 실행 중인 노드에서 제공하는 모든 볼륨 마운트 명령을 실행합니다.볼륨 마운트가 해당 노드에 로컬인 경우 데이터가 해당 노드에 로컬로 저장됩니다.노드 간에 데이터를 자동으로 이동할 수 있는 기능이 내장되어 있지 않습니다.

GlusterFS, Rook, Ceph 및 Longhorn과 같은 일부 소프트웨어 기반 분산 스토리지 솔루션이 있습니다.이 중 많은 부분이 쿠베르네테스와의 통합에 초점을 맞추고 있어 스웜에서는 도움이 되지 않습니다.

일반적인 결과는 애플리케이션 내의 스토리지 복제(예: etcd 및 기타 raft 기반 알고리즘)를 관리하거나 외부 스토리지 시스템에서 마운트를 수행해야 한다는 것입니다(원하는 바로는 고가용성).외부 스토리지 시스템을 마운트하는 방법에는 블록 또는 파일 기반의 두 가지 옵션이 있습니다.블록 기반 스토리지(예: EBS)는 일반적으로 더 높은 성능을 제공하지만, 단일 노드에만 탑재되도록 제한됩니다.이를 위해서는 일반적으로 도커 노드가 해당 블록 스토리지에 액세스할 수 있도록 타사 볼륨 플러그인 드라이버가 필요합니다.파일 기반 스토리지(예: EFS)는 성능이 낮지만 휴대성이 뛰어나며 여러 노드에 동시에 장착할 수 있어 복제 서비스에 유용합니다.

가장 일반적인 파일 기반 네트워크 스토리지는 NFS(EFS에서 사용되는 프로토콜과 동일함)입니다.타사 플러그인 드라이버 없이 마운트할 수 있습니다.도커와 함께 제공되는 유감스럽게도 이름이 붙은 "로컬" 볼륨 플러그인 드라이버는 드라이버 옵션과 함께 원하는 값을 마운트 명령에 전달할 수 있는 옵션을 제공하며, 옵션이 없으면 기본적으로 도커 디렉토리 /var/lib/docker/volums에 볼륨을 저장합니다.옵션을 사용하면 NFS 매개 변수를 전달하고 NFS 호스트 이름에 대한 DNS 조회도 수행할 수 있습니다(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"
  ...

마지막에 작성 파일 예제를 사용하는 경우 볼륨의 변경 사항(예: 서버 경로 또는 주소 업데이트)이 존재하는 한 기존 명명된 볼륨에는 반영되지 않습니다.볼륨 이름을 바꾸거나 삭제해야 스웜이 새 값으로 볼륨을 재생성할 수 있습니다.

대부분의 NFS 사용에서 볼 수 있는 또 다른 일반적인 문제는 서버에서 "루트 스쿼시"를 사용하도록 설정하는 것입니다.따라서 루트로 실행 중인 컨테이너가 볼륨에 파일을 쓰려 할 때 사용 권한 문제가 발생합니다.또한 컨테이너 UID/GID가 볼륨에 쓰기 위한 권한이 필요한 컨테이너 UID/GID인 경우 NFS 서버에서 디렉토리 소유권 및 권한을 조정해야 하는 유사한 UID/GID 권한 문제가 있습니다.

당신이 묻고 있는 것은 흔한 질문입니다.볼륨 데이터와 해당 볼륨이 수행할 수 있는 기능은 볼륨 드라이버에서 관리합니다.다른 네트워크 드라이버를 사용할 수 있는 것처럼overlay,bridge, 아니면host 드라이버를 할 수 , 를 할 할 를 .

와 은 과 만 됩니다 됩니다 만 와 과 은 만local운전자가 상자에서 나왔습니다.스웜(Swarm)에 대한 인식이 없으며 서비스 작업이 예약된 노드에서 데이터에 대한 새 볼륨만 생성됩니다.이것은 보통 당신이 원하는 것이 아닙니다.

스웜(Swarm)을 인식하고 서비스 작업을 위해 생성한 볼륨을 적절한 시간에 올바른 노드에서 사용할 수 있도록 하는 타사 드라이버 플러그인을 원합니다.옵션으로는 "Docker for AWS/Azure"와 포함된 CloudStor 드라이버 또는 인기 있는 오픈 소스 REX-Ray 솔루션을 사용할 수 있습니다.

서드파티 볼륨 드라이버는 도커 스토어에서 찾을 수 있습니다.

로컬에서 호스팅되는 스웜(swarm)을 위한 솔루션으로, 모든 워커 노드는 의 파일 서버에서 제공하는 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

이 솔루션을 사용하면 도커는 모든 노드에서 볼륨을 생성하고 서비스를 배포하며, 다른 노드의 볼륨에서 사용했던 동일한 경로이기 때문에 이미 데이터가 있습니다.

system을 , system 에 가 에 을 되는 을 되는 /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

AWS EFS를 위한 제 솔루션은 다음과 같습니다.

  1. EFS 생성(보안 그룹에서 NFS 포트 2049를 여는 것도 잊지 마십시오)
  2. nfs-common 패키지 설치:

    sudo apt-get install -y nfs-common

  3. efs가 작동하는지 확인합니다.

    mkdirfs-검정점suchmod go+schefs-test-point
    sudo mount -tnfs -ofnfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,timeo=2,noresvport [YOUR_EFS_DNS]:/efs-test-point
    터치 efs-test-point/1.txtsudumount efs-test-point/ls -lafes-test-point/

    디렉터리가 비어 있어야 합니다.

    sudo mount -tnfs -ofnfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,timeo=2,noresvport [YOUR_EFS_DNS]:/efs-test-point

    ls -la efs-test-point/

    파일 1.txt가 있어야 합니다.

  4. docker-compose.yml 파일 구성:

    서비스:sidekiq:볼륨:- upload_tmp_graphics:/home/응용프로그램/공개/공개/tmp...
    볼륨:upload_tmp_load:드라이버: 로컬driver_opts:유형: nfso: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2장치: [YOUR_EFS_DNS]:/

기본적으로 스웜은 항상 로컬 볼륨 드라이버를 찾을 것입니다. 그래서 가장 좋은 방법은

  1. nfs 공유를 만듭니다.yum -y install nfs-utils
  2. 아래와 같이 /etc/metc/metc로 내보냅니다./root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
  3. 필요한 포트를 열어봅니다. 제 경우에는 아래와 같이 했습니다.firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
  4. 새로 생성된 공유를 도커 워커 노드에 마운트한 다음
  5. docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
  6. 위의 예에서 나는 192.168.1.8 호스트에 nfshare를 생성하고 /etc/message 파일을 사용하여 내보냈습니다.
  7. 시작된 데몬systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
  8. exportfs -r 변경사항이 적용됩니다.
  9. /root/marketshare have my index.hot 10.볼륨 드라이브 항목을 주의 깊게 확인합니다. 외부에서도 사용할 수 있습니다.
  10. 많은 참고를 위해 https://docs.docker.com/storage/volumes/

언급URL : https://stackoverflow.com/questions/47756029/how-does-docker-swarm-implement-volume-sharing

반응형