问题背景
最近与L公司合作项目需要在其公网服务器上部署测试环境。在部署环境的时候发现一个有意思的现象:
我使用docker load加载一组之前下载好的镜像,加载结束后使用docker images检查加载结果,发现镜像列表中少了几个镜像。我尝试若干次以及改变load次序,结果依旧是有几个镜像神秘地“消失”了。于是,我怀疑应该是后台运行了某个monitor进程把我的镜像删除了。比较合理的猜想是当数据分区占用量达到一定阈值的时候就会触发monitor(后来发现是Kubelet组件)的image/container GC。基于这个猜想,我检查一下文件系统中各数据分区的使用量:
df -h
部分运行结果:
/dev/vda1 50G 39G 8.4G 83% /
/dev/mapper/vg01-data 613G 46G 536G 8% /data
该服务器/目录的数据分区只有50G,docker数据默认存放的位置在/var/lib/docker,跟/目录在同一数据分区。结合在L公司其他服务器上部署的经验,猜测image GC触发的阈值应该是85%。不过,好在另有一个挂载点在/data的数据分区有600多G。
解决方案
最理想的方案是把docker的数据迁移到/data上。下面是一种比较稳妥的迁移方式:
Debian/Ubuntu
# 停止docker服务
sudo service docker stop
# 在目标数据分区上创建用于存放docker数据的目录
sudo mkdir -p /data/${tar_path}
# 将数据迁移到目标数据分区
sudo mv /var/lib/docker /data/${tar_path}
# 创建一个符号连接,让/var/lib/docker指向迁移后的目录
sudo ln -s /data/${tar_path}/docker /var/lib/docker
# 启动docker服务
sudo service docker start
CentOS/Fedora
# 停止docker服务
sudo systemctl stop docker
# 在目标数据分区上创建用于存放docker数据的目录
sudo mkdir -p /data/${tar_path}
# 将数据迁移到目标数据分区
sudo mv /var/lib/docker /data/${tar_path}
# 创建一个符号连接,让/var/lib/docker指向迁移后的目录
sudo ln -s /data/${tar_path}/docker /var/lib/docker
# 启动docker服务
sudo systemctl start docker
检查一下迁移后各数据分区的使用情况:
df -h
部分运行结果:
/dev/vda1 50G 29G 18G 62% /
/dev/mapper/vg01-data 613G 54G 528G 10% /data
执行结果
docker服务可以正常运行,之前没能加载完全的镜像也能够正常加载运行。