一 问题描述
开发环境的一个服务的pod状态非Running,而是Evicted。如下:
1 | [root@dev-k8s-master ~]# kubectl -n xxx-dev get pods | grep Evicted |
二 问题分析
通过k8s的describe命令查看Evicted的原因
1 | [root@dev-k8s-master ~]# kubectl -n xxx-dev describe pod xxx-server-84985cd4fc-f2q7s |
从Message可知,是磁盘满了,导致的Evicted。
然后查看这个服务对应的node的磁盘情况
1 | [root@dev-k8s-worker01 ~]# df -h |
这里看,磁盘是没满的,原因是Evicted之后,服务对应的容器已经释放了磁盘。
该服务在worker01节点多次尝试之后,起不来,就自动换了worker02节点起来,所以去看worker02节点的磁盘情况。
1 | [root@dev-k8s-worker02 ~]# df -h |
磁盘使用的确实比其他节点多的多。
通过以下命令,查看容器日志使用磁盘情况
1 | [root@dev-k8s-worker02 ~]# for name in $(docker ps -a | awk '{print $1}' | grep -v CONTAINER); do docker inspect $name | grep LogPath | awk '{print $NF}' | tr -d '",' |xargs du -sh;done |
可以看出其中一个的日志已有18G,明显大大高出其他容器日志大小非常多,查看该日志对应的容器。
1 | [root@dev-k8s-worker02 ~]# docker ps | grep 7812 |
可见,正是该服务。
三 问题解决
删除掉Evicted状态的pod
1 | kubectl -n xxx-dev get pods | grep Evicted |awk '{print$1}'| xargs kubectl -n xxx-dev delete pod |
治标
直接清空日志
1 | cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log |
治本
每个worker节点修改/etc/docker/daemon.json
配置并重启
1 | [root@dev-k8s-worker01 ~]# vim /etc/docker/daemon.json |
max-size : 500m,单个容器日志大小上限500M
max-file:3,单个容器最多有三个日志,分别是id+.json、id+1.json、id+2.json