今天客户让检查Kubernetes环境,说是环境起不来了,我通过远程ssh,结果发现ssh无法连接,客户方检查结果为内存oom溢出(环境已运行半年),因为是测试环境故而将服务器重启,内存被释放。然后我检查Kubernetes环境,发现大多数pod无法启动,状态为ImagePullBackOffEvicted,还有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,查看分区使用情况,会发现/homeUsed明显增加

适用于硬盘分区为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根目录的更改

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0