1.背景:

运行一年多k8s集群出现大量evicted pod,但有running pod,系统是正常运行的。

其实这是kubernetes集群一种驱逐机制,用来提醒节点资源告警。

可以通过

kubectl describe pod -n mec  security-ccc447dbf-vqvdp
#可以看到具体提醒

2、解决方法:

查看告警pod节点存储情况

df -lh
ls /data
du -sh *

发现是kubernetes每天日志占用巨大存储,需要定时任务每天清理

删除7天前日志
#复制delete_data_logs.sh脚本
ansible k8s-all -m file -a "dest=/opt/addons/custome-tools/ state=directory"

ansible k8s-all -m copy -a "src=/opt/addons/custome-tools/delete_data_logs.sh dest=/opt/addons/custome-tools/"

ansible k8s-all -m cron -a "name='delete data log cron' job='/usr/bin/sh /opt/addons/custome-tools/delete_data_logs.sh > /dev/null 2>&1 ;' minute=30 hour=6"

详细脚本
#/bin/bash

# 添加定时任务
# ansible k8s-all -m file -a "dest=/opt/addons/custome-tools/ state=directory"
# ansible k8s-all -m copy -a "src=/tmp/delete_data_logs.sh dest=/opt/addons/custome-tools/"
# ansible k8s-all -m cron -a "name='delete data log cron' job='/usr/bin/sh /opt/addons/custome-tools/delete_data_logs.sh > /dev/null 2>&1 ;' minute=30 hour=6"

# 若要删除该cron 只需要加一个字段 state=absent 
# ansible k8s-all -m cron -a "name='delete data log cron' state=absent" 

# [过期] 处理nginx access日志
# logpath='/data/log/nginx/'
# cp $logpath/access.log $logpath/access-$(date +%Y%m%d).log
# cat /dev/null >$logpath/access.log

# 清理7天前k8s日志
/usr/bin/find /data/log/kubernetes/ -name "kube*" -type f -mtime +7|xargs rm -f

# 压缩1天前日志
#/usr/bin/find /data/web_logs/*/ -name "*.log" -type f -mtime +1 | xargs timeout 10s  gzip -f -9
/usr/bin/find /data/log/nginx/ -name "*.log" -type f -mtime +1 | xargs timeout 10s gzip -f -9

# 删除7天前业务日志
#/usr/bin/find /data/web_logs/*/ -name "*.log" -type f -mtime +7 | xargs rm -f
#/usr/bin/find /data/web_logs/*/ -name "*.log.*" -type f -mtime +7 | xargs rm -f

# 删除7天前nginx日志
/usr/bin/find /data/log/nginx/ -name "*.log.*" -type f -mtime +7 | xargs rm -f
/usr/bin/find /data/log/nginx/ -name "*.log" -type f -mtime +7 | xargs rm -f

然后需要手工删除evicted 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

删除后观察十分钟,看看是否还会出现驱逐情况。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐