Перейти к содержанию

▍ ZFS

Как предоставить общий доступ к файловым системам ZFS с NFS

В некоторых ситуациях бывает удобно нарезать средствами ZFS шары NFS, натравить на них периодические снапшоты и раздать нужным контейнерам с централизованного хранилища.

Установим сервер NFS:

sudo apt install nfs-kernel-server -y

В качестве примера создадим шару для S3 Minio, выполнив команду:

sudo zfs set sharenfs="rw=*,sync,insecure,anonuid=1000,anongid=1000,no_root_squash,no_subtree_check" ZSRV/minio

Посмотреть список созданых шар:

┌─( [email protected] ) - ( 29 files,  ) - ( /srv )
└─> zfs get sharenfs 
NAME                   PROPERTY  VALUE                                                                         SOURCE
...                                                                          -
ZSRV                   sharenfs  off                                                                           default
ZSRV/minio        sharenfs  rw=*,sync,insecure,anonuid=1000,anongid=1000,no_root_squash,no_subtree_check  local
...

Видим что создался раздел в ZFS:

┌─( [email protected] ) - ( 29 files,  ) - ( /srv )
└─> zfs list
NAME                 USED  AVAIL     REFER  MOUNTPOINT
...
ZSRV                 171G   729G     73.0G  /srv
ZSRV/minio       24K   729G       24K  /srv/minio
...

При необходимости можно создать и снапшот:

sudo zfs snapshot ZSRV/[email protected]

На стороне клиента можно посмотреть какие шары доступны:

┌─( [email protected] ) - ( 52 files,  ) - ( ~ )
└─> showmount -e 192.168.0.10
Export list for 192.168.0.10:
...
/srv/minio *
...

Пример как предоставить контейнеру доступ к NFS шаре:

version: "3.9"
services:
  minio:
    image: quay.io/minio/minio
    command: server /data --address ":9000" --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD_FILE: /run/secrets/minio_root
    secrets:
      - minio_root
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - nfs_minio:/data:Z
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: start-first
      placement:
        constraints: [node.role == worker]
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.minio.rule=Host(`minio.example.ru`)"
        - "traefik.http.routers.minio.entrypoints=https"
        - "traefik.http.routers.minio.tls=true"
        - "traefik.http.routers.minio.middlewares=WhitelistHome"
        - "traefik.http.services.minio.loadbalancer.server.port=9001"


secrets:                        # top level secrets block
  minio_root:
    external: true

volumes:
  nfs_minio:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=srv-nas,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,rw"
      device: ":/srv/minio"


networks:
  traefik-public:
    external: true

, где опция Z в "nfs_minio:/var/lib/minio:Z" помечает, что вольюм без общего доступа, чтобы не возникало ситуций, где ещё одна копия контейнера minio производит туда же запись.

К началу