使用kubectl get pods, 发现很多pod的状态为evicted。
k8s本来是正常的,突然发现上面的服务停了,然后查看发现pod状态有变化,通过如下方式查找问题:
1.查看内存情况,命令:free -g ,发现没问题
2.查看内存情况,命令:top ,发现没问题
3.查看硬盘情况,命令:df -lh,发现硬盘没问题,但启动的docker镜像有问题
继续查找发现是由于启动的docker占用的空间大于85%导致挂掉的
eviction,即驱赶的意思,意思是当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod。
多见于资源不足时导致的驱赶。
解决方案
排查资源和异常原因,防止新的驱赶产生。
然后查看docker ps -a,发现有很多已经停止的容器
删除掉这些不用的,命令:docker container prune
此时资源问题已经解决。
还需要把evicted的pod给删掉,由于每个命名空间下都有,所有需要使用脚本循环操作,如下:
kubectl get pods | grep Evicted | awk ‘{print $1}’ | xargs kubectl delete pod
脚本如下:
#!/bin/bash
for ns in kubectl get ns | awk ‘NR>1{print $1}’
do
kubectl get pods -n ${ns} | grep Evicted | awk ‘{print $1}’ | xargs kubectl delete pod -n ${ns}
done