Docker使用Devicemapper存储驱动异常处理

问题

集群的一个节点NotReady,kubelet报错PLEG,查看docker日志,可以看到如下的报错,停止docker服务,响应的容器进程还在进行,无法umount相关的设备。
error

原因

这个问题发生在使用 devicemapper 存储驱动时Docker试图重用之前使用 LVM thin pool。例如,尝试更改节点上的 Docker 的数据目录时会发生此问题。由于安全措施旨在防止 Docker 因配置问题而意外使用和覆盖 LVM thin pool 中的数据,因此会发生此错误。

解决

  1. 停止docker服务
    1
    systemctl stop docker
  2. 备份Docker目录
    1
    mv /var/lib/docker{,.bak}
  3. 删除已经创建的thinpool逻辑卷
    1
    lvremove docker/thinpool
  4. 创建新的逻辑卷
    1
    lvcreater -L 100g --thin docker/thinpool
    根据实际磁盘大小设置
  5. 编辑/etc/docker/daemon.json配置文件,添加dm.directlvm_device_force=true参数
    1
    2
    3
    4
    5
    6
    {
    "storage-driver": "devicemapper",
    "storage-opts": [
    "dm.directlvm_device_force=true" ## 添加此参数
    ]
    }
  6. 最后启动docker服务即可
    1
    systemctl start docker