▍ ZFS¶
Как предоставить общий доступ к файловым системам ZFS с NFS¶
В некоторых ситуациях бывает удобно нарезать средствами ZFS шары NFS, натравить на них периодические снапшоты и раздать нужным контейнерам с централизованного хранилища.
Установим сервер NFS:
В качестве примера создадим шару для 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 производит туда же запись.