1. 程式人生 > 實用技巧 >Docker修改Devicemapper儲存驅動為Direct-lvm模式

Docker修改Devicemapper儲存驅動為Direct-lvm模式

一.說明

Device mapper是基於核心的框架,支援Linux上許多高階卷管理技術。Docker中devicemapper儲存驅動程式利用此框架的精簡配置和快照功能進行映象和容器管理。
devicemapper驅動程式使用專用於Docker的塊裝置,並在塊級而非檔案級進行操作。這些裝置通過將物理儲存新增到Docker主機來擴充套件。並且比在操作I系統級別使用檔案系統性能更好。

二.配置場景

系統版本:Centos7.1
核心版本:基於3.10.0-229升級至4.20版本
Docker版本:docker-ce 18.09.2版本
問題:這裡由於Centos7.1系統預設安裝時根檔案系統是xfs型別,而且不支援d_type。由於在Docker中,無論是overlay還是overlay2,它們底層檔案系統都是overlayfs檔案系統。而overlayfs檔案系統就會用到d_type。這裡如果我們要用到docker的overlay2(xfs檔案系統)需要開啟d_type。

[root@k8s001 ~]# xfs_info /
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

由上面可知,ftype=0,也就是說xfs檔案系統不支援d-type。(如果是ftype=1,表示支援d_type)
這裡我們介紹下xfs檔案系統的d_type:
d_type是Linux核心的一個術語,表示"目錄條目型別",而目錄條目,其實是檔案系統上目錄資訊的一個數據結構。d_type就是這個資料結構的一個欄位,這個欄位用來表示檔案的型別,是檔案還是管道,還是目錄或套接字等。
d_type從Linux2.6核心開始已經支援,只不過雖然Linux核心支援,但有些檔案系統實現了d_type,有些卻沒有實現,有些是選擇性的實現。也就是需要使用者自己用額外的引數來決定是否開啟d_type的支援。

問題解決:這裡由於系統已經安裝好,且安裝好的檔案系統不支援d_type,這裡要麼重新安裝Centos7.5以上的版本來支援d_type,要麼選擇devicemapper儲存驅動。

三.devicemapper

這裡我們選用devicemapper時,可以配置:

  • loop-lvm模式
  • direct-lvm模式

3.1 loop-lvm模式

預設Centos7下Docker使用的loop-lvm模式。後端為自動生成的稀疏檔案:

[root@k8s001 ~]# ls -lsh /var/lib/docker/devicemapper/devicemapper/
total 3.5G
3.5G -rw------- 1 root root 100G Nov 13 11:00 data
4.6M -rw------- 1 root root 2.0G Nov 13 11:00 metadata

其中data(存放資料)和metadata(存放元資料),我們可以從輸出來看,初始化預設配置為100G和2G大小,都是稀疏檔案,使用多少佔用多少。
Docker在初始化的過程中,會建立data和metadata這兩個稀疏檔案,並分別附加到迴環裝置/dev/loop0和/dev/loop1上,然後給予迴環裝置建立thin pool,預設一個container最大存放資料不超過10G。

[root@k8s001 ~]# docker info 
Client:
 Debug Mode: false

Server:
 Containers: 16
  Running: 6
  Paused: 0
  Stopped: 10
 Images: 22
 Server Version: 18.09.2
 Storage Driver: devicemapper
  Pool Name: docker-253:0-67339311-pool
  Pool Blocksize: 65.54kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data loop file: /var/lib/docker/devicemapper/devicemapper/data
  Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
  Data Space Used: 3.777GB
  Data Space Total: 107.4GB
  Data Space Available: 42.06GB
  Metadata Space Used: 21.28MB
  Metadata Space Total: 2.147GB
  Metadata Space Available: 2.126GB
  Thin Pool Minimum Free Space: 10.74GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.149-RHEL7 (2018-07-20)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc nvidia
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.20.13-1.el7.elrepo.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.79GiB
 Name: k8s001.wf
 ID: DWXA:MYGC:6VKO:TIFS:UGTT:EG3E:UVVU:YUZ5:ZL36:HYX6:XTDE:SRZV
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

檢視系統的塊裝置:

[root@k8s001 ~]# lsblk 
NAME                                                                                       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop1                                                                                        7:1    0     2G  0 loop 
└─docker-253:0-67339311-pool                                                               253:3    0   100G  0 dm   
  ├─docker-253:0-67339311-03563554f7c7b1ca35c0023fbe6c4f67c62dcf6b5a45ef9a39dc693baff1b24e 253:8    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/03563554f7c7b1ca35c002
  ├─docker-253:0-67339311-c3321ce74e90d9df08793b808c79e1c637cfbfd7e70a74f55933b3f41a56e49a 253:6    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/c3321ce74e90d9df08793b
  ├─docker-253:0-67339311-216e260231a30f484a10a28288509819cf0c7492b27c3bf03394b1932cb637b3 253:4    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/216e260231a30f484a10a2
  ├─docker-253:0-67339311-379abc2c8d2e1f163592595b102fafef869e48c440f7da7b6591d55742640531 253:9    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/379abc2c8d2e1f16359259
  ├─docker-253:0-67339311-24229ad0cba2615ed61273d19673659483018bf7c674c0002f04c7492bf5b720 253:7    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/24229ad0cba2615ed61273
  └─docker-253:0-67339311-fa5c09702c932d386cc618d54a90c261b4aac5d3e593dac7d60545957cee85e2 253:5    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/fa5c09702c932d386cc618
sr0                                                                                         11:0    1  1024M  0 rom  
loop0                                                                                        7:0    0   100G  0 loop 
└─docker-253:0-67339311-pool                                                               253:3    0   100G  0 dm   
  ├─docker-253:0-67339311-03563554f7c7b1ca35c0023fbe6c4f67c62dcf6b5a45ef9a39dc693baff1b24e 253:8    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/03563554f7c7b1ca35c002
  ├─docker-253:0-67339311-c3321ce74e90d9df08793b808c79e1c637cfbfd7e70a74f55933b3f41a56e49a 253:6    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/c3321ce74e90d9df08793b
  ├─docker-253:0-67339311-216e260231a30f484a10a28288509819cf0c7492b27c3bf03394b1932cb637b3 253:4    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/216e260231a30f484a10a2
  ├─docker-253:0-67339311-379abc2c8d2e1f163592595b102fafef869e48c440f7da7b6591d55742640531 253:9    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/379abc2c8d2e1f16359259
  ├─docker-253:0-67339311-24229ad0cba2615ed61273d19673659483018bf7c674c0002f04c7492bf5b720 253:7    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/24229ad0cba2615ed61273
  └─docker-253:0-67339311-fa5c09702c932d386cc618d54a90c261b4aac5d3e593dac7d60545957cee85e2 253:5    0    10G  0 dm   /var/lib/docker/devicemapper/mnt/fa5c09702c932d386cc618
sda                                                                                          8:0    0   300G  0 disk 
├─sda2                                                                                       8:2    0 299.5G  0 part 
│ ├─centos-swap                                                                            253:1    0   7.9G  0 lvm  
│ ├─centos-home                                                                            253:2    0 241.6G  0 lvm  /home
│ └─centos-root                                                                            253:0    0    50G  0 lvm  /
└─sda1                                                                                       8:1    0   500M  0 part /boot

由於loop-lvm模式從效能和文件上來看都不可靠,這種模式僅適用於測試環境,不建議在生產環境使用。

3.2 direct-lvm模式

生產模式下,使用devicemapper儲存驅動程式的主機必須使用direct-lvm模式,此模式使用塊裝置來建立精簡池,這裡使用loop-lvm裝置更快,更有效的使用系統資源,並且塊裝置可以根據需要進行擴增。

3.2.1 配置direct-lvm模式

這裡我們需要給系統新增一塊磁碟,比如新增一塊500G的資料盤。

  • 停止Docker服務
[root@k8s001 ~]# systemctl stop docker
  • 將整塊硬碟建立物理卷
[root@k8s001 ~]# pvcreate /dev/sdb
  • 建立dockervg的卷組(VG)
[root@k8s001 ~]# vgcreate dockervg /dev/sdb
  • 建立thinpool邏輯卷
[root@k8s001 ~]# lvcreate --wipesignatures y -n thinpool -l 70%VG dockervg
[root@k8s001 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 5%VG dockervg
[root@k8s001 ~]# lvscan 
  ACTIVE            '/dev/dockervg/thinpool' [<300.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [<7.88 GiB] inherit
  ACTIVE            '/dev/centos/home' [241.57 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
  • 轉換成thinpool
[root@k8s001 ~]# lvconvert -y --zero n -c 512K --thinpool dockervg/thinpool --poolmetadata dockervg/thinpoolmeta
  • 檢視thinpool狀態
[root@k8s001 ~]# lvs -o lv_name,data_percent,metadata_percent,lv_size,lv_metadata_size,data_lv,metadata_lv
  LV       Data%  Meta%  LSize    MSize  Data             Meta            
  home                    241.57g                                         
  root                     50.00g                                         
  swap                     <7.88g                                         
  thinpool 1.63   0.29   <300.00g <6.00g [thinpool_tdata] [thinpool_tmeta]

說明:這裡LSize為data的空間大小,MSize為Metadata的空間大小,Data為Data對應的邏輯卷,Meta為MetaData對應邏輯卷。

擴充套件thinpool(根據實際情況進行):
上面的sdb盤我們並沒有將空間全部使用完,這裡如果Metadata或Data空間不足時,我們可以進行擴容。例如:

# 擴容metadata的大小
[root@k8s001 ~]# lvresize -L +1G /dev/mapper/dockervg-thinpool_tmeta
# 擴容data的大小
[root@k8s001 ~]# lvresize -L +5G /dev/mapper/dockervg-thinpool
  • 備份刪除原Docker目錄
[root@k8s001 ~]# mkdir /var/lib/docker_bak
[root@k8s001 ~]# mv /var/lib/docker/* /var/lib/docker_bak
  • 修改Dokcer啟動引數
[root@k8s001 ~]# cat /etc/docker/daemon.json 
{
    "storage-driver": "devicemapper",
    "storage-opts": [
      "dm.thinpooldev=/dev/mapper/dockervg-thinpool",
      "dm.use_deferred_removal=true",
      "dm.use_deferred_deletion=true"
    ],
    "log-driver": "json-file",
    "log-opts": {
      "max-size": "1m",
      "max-file": "10"
    }
}
  • 重啟docker服務
[root@k8s001 ~]# systemctl daemon-reload
[root@k8s001 ~]# systemctl start docker
  • 驗證
[root@k8s001 ~]# docker info 
Client:
 Debug Mode: false

Server:
 Containers: 33
  Running: 32
  Paused: 0
  Stopped: 1
 Images: 22
 Server Version: 18.09.2
 Storage Driver: devicemapper
  Pool Name: dockervg-thinpool
  Pool Blocksize: 524.3kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data Space Used: 5.244GB
  Data Space Total: 322.1GB
  Data Space Available: 316.9GB
  Metadata Space Used: 18.67MB
  Metadata Space Total: 6.438GB
  Metadata Space Available: 6.42GB
  Thin Pool Minimum Free Space: 32.21GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.149-RHEL7 (2018-07-20)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc nvidia
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.20.13-1.el7.elrepo.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 15.66GiB
 Name: k8s001.wf
 ID: 62JF:3A6E:R7BO:R3DM:OKT3:S5JQ:ITT4:64XG:USB4:SJDT:ZNM2:NNKB
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine