今天客户让检查Kubernetes环境,说是环境起不来了,我通过远程ssh,结果发现ssh无法连接,客户方检查结果为内存oom溢出(环境已运行半年),因为是测试环境故而将服务器重启,内存被释放。然后我检查Kubernetes环境,发现大多数pod无法启动,状态为ImagePullBackOff
和Evicted
,还有NodeAffinity
。
ImagePullBackOff:镜像下载失败,意味着本地没有镜像
Evicted:一般可以查看到
describe
信息,我见过的此状态都是磁盘容量问题NodeAffinity:调度节点亲和性失败
这个环境是我自己部署的离线化,不可能没有镜像,但还是docker images
检查了以下,果不其然,少了一大部分的镜像,当初我是使用脚本导入的docker image
,所有又一次执行脚本导入镜像,神奇的事情发生了,pod还是起不来,镜像还是消失了。这样的操作我又重复了几次,并用watch
实时查看docker image
的变化,它确实在我眼皮底下消失了。
本来我已经放弃了,准备让客户重新装系统,将离线化部署脚本再跑一遍。下班之后,百思不得其解,继续查阅资料。终于让我发现了类似现象,到家一看,果然,是docker目录/var/lib/docker
默认使用的root目录的分区,而该环境中,分区是安装默认的分区方式以及容量(50G)。我的离线化,光镜像就有47个,从资料中发现,kubelet
会在docker使用目录剩余15%时,会发生镜像驱逐。
查看docker目录容量
先查看docker的目录在哪个位置:docker info | grep "Dir"
/var/lib/docker
是docker默认使用的目录,也是使用的/root
目录的容量
df -h | grep "/var/lib/docker"
overlay 50G 42G 8.4G 84% /var/lib/docker/overlay2/9ffc2882821fc9
...
解决办法
1、为了防止这种情况的发生,建议在装系统时,root或者根分区的容量给大点,按照我的习惯,根分区的容量我会给硬盘的一半。
2、如果是lvm的分区,可以增加容量
3、部署完docker之后,将docker目录更改到更大的分区位置
介于客户的这种情况,我也只能切换docker目录的分区位置了。
切换目录也有两种方式
1、直接切换目录
2、将docker目录重新挂载到其他的目录下(创建软链接目录),继而达到增加容量的目的。
操作之前先停止docker服务
systemctl stop docker
以下三种方法任选其一
建议直接使用此方式,或者在docker安装好后,就更改主目录
生产中请注意一定要先备份一份
# 创建一个root目录以外分区的目录
mkdir /home/lib/docker -p
# 迁移数据,路径末尾要加"/"
rsync -avz /var/lib/docker/ /home/lib/docker/
修改docker服务文件
vim /usr/lib/systemd/system/docker.service
# 在ExectStart=/usr/bin/dockerd的后面增加--graph /home/lib/docker
或者修改daemon.json
,和修改docker服务文件选一即可
vim /etc/docker/daemon.json
{
"graph": "/home/lib/docker"
}
生产中请注意一定要先备份一份
# 创建一个root目录以外分区的目录
mkdir /home/lib/docker -p
# 将数据放到新的存放路径,路径末尾要加"/"
rsync -avz /var/lib/docker/ /home/lib/docker/
# 备份数据,mv还有一个目的是,创建软链接的目录必须不存在
mv /var/lib/docker /tmp/docker_bak
# 创建软链接
ln -s /home/lib/docker /var/lib/docker
当你使用docker pull
拉取镜像后,可以通过df -h
,查看分区使用情况,会发现/home
的Used
明显增加
适用于硬盘分区为LVM方式,不建议使用此方式。如果是xfs文件系统,还需要将分区格式化,数据即使有备份,也是有误操作的风险的。慎用!!!
# 找一个容量大,且可以被减少容量的分区,这里就以/home为例
xfs文件系统支持扩大容量
ext2/ext3/ext4文件系统支持增大或者减小
# centos默认使用xfs文件系统
df -hT | grep "/dev/sda" | awk '{print $2}'
xfs_growfs /dev/mapper/centos-home
# 酌情调整大小
lvreduce -L -5G /dev/mapper/centos-home
lvextend -L +5G /dev/mapper/centos-root
# 应用调整,这里确实也是减少了。我不太能搞懂,所以此方法不建议
xfs_growfs /dev/mapper/centos-home
xfs_growfs /dev/mapper/centos-root
重新加载配置文件
systemctl daemon-reload
systemctl restart docker
检查docker信息
docker info | grep "Dir"
只有切换目录的方法才会看到docker根目录的更改