lvm相关知识以及与docker配合使用记录

LVM基础知识

LVM现在用的还是挺多的,每次看每次每次忘,还是记录下吧

LVM3个概念,PV,VG,LV 递进式的,一层层往上

LVM

如图所示:

  1. PV可以创建在一块硬盘 pvcreate /dev/sdb 或者一个分区上 pvcreate /dev/sdb1
  2. VG创建在PV之上,VG可以跨多个PV创建 vgcreate docker /dev/sdb /dev/sdc
  3. LV创建在VG之中,LV不可以跨VG, lvcreate -L ${SIZE} -n ${VOLUMEID} ${VG} ,可以-L指定大小创建,也可以lvcreate –wipesignatures y -n thinpool docker -l 95%VG 按百分比的方式创建

日常命令:
pvs,vgs,lvs 一类命令,我一般用来看空间大小以及还剩空间
vgs可以看到剩余的空间,表示lv分不出去了就占了那么大,不能超卖
vgdisplay docker –units g | grep ‘VG Size’ | awk ‘{print $3}’ | cut -d. -f1 看docker这个vg的大小

和docker的结合使用

参照docker官方文档设置dircet模式的lvm

  1. 创建2个lv分别用95%,1%的vg的空间

    1
    2
    3
    4
    5
    6
    #lvcreate --wipesignatures y -n thinpool docker -l 95%VG
    WARNING: ext4 signature detected on /dev/docker/thinpool at offset 1080. Wipe it? [y/n]: y
    Wiping ext4 signature on /dev/docker/thinpool.
    Logical volume "thinpool" created.
    #lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
    Logical volume "thinpoolmeta" created
  2. 查看一下lv

    1
    2
    3
    4
    5
    6
    7
    8
    # lvs
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    thinpool docker -wi-a----- 6.45t
    thinpoolmeta docker -wi-a----- 69.54g
    查看一下vg,可以看到还有空余订单4%空间
    # vgs
    VG #PV #LV #SN Attr VSize VFree
    docker 1 2 0 wz--n- 6.79t 278.19g
  3. 将这2个lv转变成thinpool

    1
    2
    3
    4
    #lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
    #lvs
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    thinpool docker twi-a-t--- 6.45t 0.00 0.03
  4. 设置让这2个thinpool可以自动extend,以下的意思是当空间用到80%时,自动扩容20%

    1
    2
    3
    4
    5
    6
    #cat > /etc/lvm/profile/docker-thinpool.profile << EOF
    activation {
    thin_pool_autoextend_threshold=80
    thin_pool_autoextend_percent=20
    }
    EOF
  5. 生效配置

    1
    2
    #lvchange --metadataprofile docker-thinpool docker/thinpool
    Logical volume "thinpool" changed
  6. 启用监控模式才能真正有用,否则也不会autoextend 可以看到多了最后一列

    1
    2
    3
    #lvs -o+seg_monitor
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
    thinpool docker twi-a-t--- 6.45t 0.00 0.03 monitored
  7. 把以下内容丢到/etc/docker/deamon.json中和你原来的配置结合起来,没有这个文件就新建(注意此处我用的docker版本是17.04.有几个参数和官方推荐不一样) 官方配置见这里

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "storage-driver": "devicemapper",
    "storage-opts": [
    "dm.thinpooldev=/dev/mapper/docker-thinpool",
    "dm.use_deferred_removal=false",
    "dm.override_udev_sync_check=true",
    "dm.use_deferred_deletion=false"
    ]
    }
  8. 重启docker docker info查看确认结果

     #docker info
    Containers: 0
    Running: 0
    Paused: 0
    Stopped: 0
    Images: 1
    Server Version: 17.04.0-ce
    Storage Driver: devicemapper
    Pool Name: docker-thinpool
    Pool Blocksize: 524.3kB
    Base Device Size: 10.74GB
    Backing Filesystem: xfs
    Data file:
    Metadata file:
    Data Space Used: 210.2MB
    Data Space Total: 7.094TB
    Data Space Available: 7.094TB
    Metadata Space Used: 4.542MB
    Metadata Space Total: 16.98GB
    Metadata Space Available: 16.97GB
    Thin Pool Minimum Free Space: 709.4GB
    Udev Sync Supported: false
    Deferred Removal Enabled: false
    Deferred Deletion Enabled: false
    Deferred Deleted Device Count: 0
    #可以看到多了很多东西,原来是
    # docker info
    Containers: 20
    Running: 0
    Paused: 0
    Stopped: 20
    Images: 23
    Server Version: 17.04.0-ce
    Storage Driver: overlay
    Backing Filesystem: xfs
    Supports d_type: false
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Plugins:
    Volume: local
    Network: bridge host macvlan null overlay
    Swarm: inactive
    

这样弄完后docker相关的东西就全部放在了thinpool里面,你并不能再直接看到images net啊,原来docker目录下那些文件。
只有当docker的container run起来之后,可以看到 /var/lib/docker/devicemapper/mnt/ 下的目录被mount在主机上

创建一个单独的VG出来让docker还是用loopdata的方式

上面的方式确实有些好处,但是不方便在和k8s配合使用的时候用lvm的flexvolume插件,所以还有个方案是lvm创建的时候,多分个区,多创建个vg,然后创建相应的lv 给docker 用,相当于docker还是用loopdata

总结下

  1. 理论上还是建议用direct lvm thinpool的方式来配合docker使用的
  2. 以上方式会有docker的image 很少会被gc的问题
  3. 以上方式会由于空间都被分配了导致无法使用k8s lvm插件的问题
  4. 以上方式会导致多模块公用thinpool,空间问题时不方便审查,容易甩锅的问题

参考文中链接以及
https://success.docker.com/article/resolving-error-unable-to-take-ownership-of-thin-pool