ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [docker] device mapper 옵션과 direct-lvm 모드 설정
    Container 2017. 3. 23. 17:55

    devicemapper는 block device를 사용하기 때문에 컨테이너별로 디스크를 제한할 수 있다. device mapper 드라이버는 두 가지의  block device(data, metadata)를 사용하여 하나의 thin pool을 생성한다. thin pool의 기본 크기는 100GB이며, 각각의 컨테이너와 이미지를 위해 할당되는 device 크기는 10GB이다. 이 크기들은 물리적으로 데이터를 쓰기 전까지는 할당되지 않으며 최대 크기를 채우기 전까지 사용할 수 있다.



    Device Mapper Options




    dm.thinpooldev

    : loopback device 대신 thin pool에서 사용할 block device를 지정한다. 'lvm' block device를 사용하는 것이 가장 좋다. 


    dm.basesize

    : 컨테이너와 이미지가 기본으로 사용할 디바이스 크기를 지정한다. 기본 크기는 10GB이다. 


    dm.loopdatasize

    : 최대로 사용할 수 있는 thin pool 크기를 지정한다. 기본 크기는 100GB이다.


    dm.loopmetadatasize

    : 메타 데이터를 위한 block 크기 지정한다. 기본 크기는 2GB이며, 주로 전체 pool의 1%를 할당한다.


    dm.fs

    : backing filesystem을 지정한다. ext4와 xfs 파일 시스템을 지원하며 기본 설정은 ext4이다.


    dm.mkfsarg

    : 기본 device 생성시에 사용되는 추가적인 mkfs 인자를 지정한다. 


    dm.mountopt

    : thin device를 마운팅시에 사용되는 추가적인 mount 옵션을 지정한다.


    dm.blocksize

    : thin pool을 위해 사용되는 block 크기를 지정한다. 기본 크기는 64K이다.


    dm.blkdiscard

    : devicemapper device를 제거할시에 blkdiscrd 사용을 enable 하거나 disable하는 옵션이다. 

    만약 loopback device를 사용하고, 이미지/컨테이너 제거하는데 loopback file을 resparsify 할 때만 기본으로 enabled된다.

    loopback에서 이 옵션을 disabled 하면, 컨테이너 제거 시간이 빨라지지만, 컨테니어가 제거될 때 '/var/lib/docker' 디렉토리에 공간을 다른 용도로 사용하기 위해 시스템에 반환하지 못한다.


    dm.override_udev_sync_check

    : devicemapper와 udev 사이에 udev 동기화 확인을 오버라이드한다. 

    udev는 리눅스 커널의 장치 매니저이다. 

    udev 동기화 지원 여부는 'docker info'의 Udev Sync Supported 항목을 통해 확인 할 수 있다.


    dm.use_deferred_removal

    : libdm 및 커널 드라이버가 메커니즘을 지원할 경우 지연된 장치 제거를 사용 가능하게 한다.

    지연된 장치 제거는 장치가 제거/비활성화 될 때 장치가 사용중인 경우 장치에서 지연된 제거가 예약됨을 의미한다. 

    또한 장치의 마지막 사용자가 종료되면 장치가 자동으로 사라진다.

    예를 들어, 컨테이너가 종료되면 연관된 thin 장치가 제거된다. 



    dm.use_deferred_deletion

    : Thin pool 장치에 대한 지연된 장치 삭제 사용을 활성화한다. 

    기본적으로 thin pool 삭제는 동기식이다. 

    컨테이너가 삭제되기 전에 Docker 데몬은 연관된 장치를 제거한다. 

    스토리지 드라이버가 장치를 제거 할 수 없으면 컨테이너 삭제가 실패하고 데몬이 반환된다.

    이 실패를 피하기 위해서, dm.use_deferred_removal과 dm.use_deferred_deletion를 활성화한다.

    이 두 옵션을 enable 하고나서, 컨테이너 삭제시에 'device is busy' 상태가 되면, 드라이버는 장치에 삭제를 예약한다.

    장치가 사용되지 않을 때 드라이버는 장치를 삭제한다. 일반적으로 enable 하는 것이 안전하다. 



    dm.min_free_space

    : Thin pool에서 새 장치를 생성하는 데 필요한 최소 여유 공간 백분율을 지정한다. 

    이 검사는 사용 가능한 데이터 공간과 사용 가능한 메타 데이터 공간 모두에 적용된다. 

    유효한 값은 0%-99%이다. 값 0%는 여유 공간 검사 논리를 비활성화한다.(여유 공간을 남겨두지 않고, 모두 사용)

    사용자가 이 옵션의 값을 지정하지 않으면 엔진은 기본값인 10%를 사용한다.


    새로운 thin pool 장치가 생성 될 때마다(도커 이미지 pull 혹은 컨테이너 생성) 

    엔진은 최소 여유 공간을 사용할 수 있는지 확인한다. 

    충분한 공간을 사용할 수 없는 경우 장치 생성이 실패하고 관련 docker 작업이 실패한다.

    이 오류를 복구하려면 오류에서 복구하기 위해 thin pool에 사용 가능한 공간을 추가로 만들어야 한다.

    thin pool에서 일부 이미지와 컨테이너를 삭제하여 여유 공간을 생성 할 수 있다.

    thin pool에 더 많은 스토리지를 추가 할 수도 있다.

    LVM (논리 볼륨 관리) thin pool에 공간을 추가하려면 볼륨 그룹 컨테이너 thin pool에 스토리지를 추가한다.

    이렇게 하면 오류가 자동으로 해결된다.

    만약 구성에서 loopback 장치를 사용하는 경우 엔진 데몬을 중지하고 루프 파일 크기를 늘린 다음 

    데몬을 다시 시작하여 문제를 해결한다.




    Direct-lvm 모드





    direct-lvm 모드 설정


    docker 데몬을 종료한다.

    $ service docker stop


    LVM2과 thin-provisioning-tools 패키지를 설치한다.

    $ sudo yum install -y lvm2


    block device를 /dev/xvdf로 교체하기 위해 물리적 볼륨을 생성한다

    $ pvcreate /dev/xvdf


    docker 볼륨 그룹을 생성한다.

    $ vgcreate docker /dev/xvdf


    thinpool과 thinpoolmeta라는 논리적 볼륨을 생성한다.

    이 예시는, docker 볼륨 그룹의 95%를 data 공간으로 사용하며, free 공간은 data나 metadata를 자동 확장하는데 사용하도록 남겨둔다.

    $ lvcreate --wipesignatures y -n thinpool docker -l 95%VG

    $ lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG


    pool을 thin pool로 변환한다.

    $ lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta


    lvm profile을 통해 thin pool의 자동확장을 설정한다.

    $ vi /etc/lvm/profile/docker-thinpool.profile


     thin_pool_autoextend_threshold 값을 지정한다.

    이 값은 lvm이 사용가능한 공간을 자동확장하려고 시도하기 전에 사용된 공간의 백분율이어야 한다. (100 = disabled)

    즉, 자동확장 할수 없는 공간의 백분율이다.

    thin_pool_autoextend_threshold = 80 


    thin pool의 자동확장이 발생했을 때를 위해서 thin_pool_autoextend_percent  를 수정한다.

    이 값의 설정은 thin pool을 증가시키는(자동 확장) 공간의 백분율이다. (100 = disabled)

    thin_pool_autoextend_percent = 20  


     docker-thinpool.profile 파일을 확인한다.

    An example /etc/lvm/profile/docker-thinpool.profile file:

    activation {

    thin_pool_autoextend_threshold=80

    thin_pool_autoextend_percent=20

    }


    lvm profile을 적용한다.

    $ lvchange --metadataprofile docker-thinpool docker/thinpool


     lv 가 보여지는지 확인한다.

    $ lvs -o+seg_monitor


    docker 데몬이 이전에 시작되었다면, 존재하는 그래프 디바이스 드라이버 디렉토리를 옮긴다.

    이 디렉토리를 제거하는 것은 이미지, 컨테이너, 볼륨이 제거된다는 뜻이다. 이 디렉토리를 다른 이름으로 옮겨놓으면 백업본이 되어서 나중에 다시 회복시킬 수 있다.

    $ mkdir /var/lib/docker.bk

    $ mv /var/lib/docker/* /var/lib/docker.bk 


    devicemapper 옵션 지정으로 docker 데몬을 설정한다. 

    Note: The deferred deletion option, dm.use_deferred_deletion=true는 아직 CentOS, RHEL, Ubuntu 14.04의 기본 커널을 사용할 때 지원하지 않는다. 이 옵션은 upstream kernel version 3.18에서만 지원한다.


    첫번째 방법 - docker 데몬 실행시 command line으로 설정한다.

    $ vi /usr/lib/systemd/system/docker.service

    dockerd -storage-driver=devicemapper \

    --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \

    --storage-opt=dm.use_deferred_removal=true \

    --storage-opt=dm.use_deferred_deletion=true


    두번째 방법 - 데몬 설정 파일을 생성한다.


    $ vi /etc/docker/daemon.json


    {

      "storage-driver": "devicemapper",

       "storage-opts": [

         "dm.thinpooldev=/dev/mapper/docker-thinpool",

         "dm.use_deferred_removal=true",

         "dm.use_deferred_deletion=true"

       ]

    }


    변경사항을 적용한다.

    $ systemctl daemon-reload


    데몬을 실행한다.

    $ systemctl start docker


    - docker 데몬을 시작한 후에, 논리 볼륨을 모니터하기 위해서는 'lvs' 혹은 'lvs -a' 명령을 사용한다.

    볼륨 그룹의 여유 공간을 모니터하려면, 'vgs' 명령을 사용한다.


    - thin pool의 자동 확장 로그를 보여준다. 

    $ journalctl -fu dm-event.service



    'Container' 카테고리의 다른 글

    [가상화] QEMU vs KVM  (0) 2017.07.07
    [docker] Containerd ?  (0) 2017.07.04
    [docker] storage driver  (0) 2017.03.23
    [docker] Unknown option dm.basesize  (0) 2017.03.16
    [Kubernetes] CrashLoopBackOff  (0) 2017.03.10
Designed by Tistory.