kubernetes中pod无法删除的问题排查
现象
1 | $ cat /etc/redhat-release |
在CentOS7.2的系统上,发现有一部分pod在delete后一直处于Terminating状态
1 | $ kubectl get pods -o wide |
查看docker的日志发现有如下报错信息如下,含义为在删除pod时由于/var/lib/docker/overlay/*/merged目录被其他应用占用,从而导致容器无法清除。
1 | Jan 30 14:57:47 c3-a05-136-45-4.com dockerd[1510]: time="2019-01-30T14:57:47.704641914+08:00" level=error msg="Error removing mounted layer e6b7378c58a34cb42c6fa7924f7a52b7a19a64b2166d7a56f363e73ecba6e5a9: remove /var/lib/docker/overlay/98a56d695c9e3d0b6a9f3b5e0e60abf7cdb3ce73e976b00e36ca59028e585a36/merged: device or resource busy" |
通过docker ps -a
看到容器的状态为”Removal In Progress”。通过docker inspect
可以看到容器的进程已经退出了。
1 | # docker ps -a |
使用docker rm
命令删除容器会报错
1 | # docker rm e6b7378c58a3 |
通过kubectl delete pods
命令虽然可以强制删除pod,但在宿主机上仍然能看到容器的状态为”Removal In Progress”。
1 | # kubectl delete pods httpserver-prod-1-6cb97dfbcc-f9flb --grace-period=0 --force |
通过搜索挂载目录的信息,可以找到是哪个进程挂载了该目录。可以看到是ntpd服务挂载了该目录。
1 | # grep -nr 98a56 /proc/*/mountinfo |
查看ntpd.service文件内容如下,其中PrivateTmp=true
,该选项用于控制服务是否使用单独的tmp目录:
1 | [Unit] |
问题复现
1 | # 在系统上启动一个容器,此时ntpd必须处于running状态 |
经在如下版本的CentOS7系统实验,该问题不存在。
1 | $ uname -a |
问题产生原因
此问题为Systemd启用PrivateTmp选项后,导致mount namespace的一处内核bug。
处理方式
在/usr/lib/systemd/system/docker.service的[Service]中增加MountFlags=slave
,并重新启动docker服务,注意重启docker后,容器会重启。
当然也可以通过重启ntpd服务的方式来临时解决问题,但当下次删除容器时还需要重启ntpd。
还有一种办法是修改ntpd.service中的PrivateTmp=true
,然后重启ntpd服务。