Kubernetes 各组件日志清理

发布于:2022-12-25 ⋅ 阅读:(1039) ⋅ 点赞:(0)

今天看到k8s的nodeexport pod failed,看到是磁盘空间压力过高。

k8s各组件的日志

kubernetes 二进制安装,各组件的log目录在/var/log/kubernetes中,其中各组件的日志均是一个软链接,指向当前的日志目录。当日志超过3.6GB,k8s会自动重新指向最新的log。

 如何优雅的清理呢这些日志呢?

find /var/log/kubernetes/ -type f -mtime +6 |xargs -I GG "echo rm -rf GG" |bash

看似解决了问题,其实并没有。把软链接的指向文件删除了。

这些日志确实是6天之前的(不算今天)。但是被软链接指向了,如果删除了组件写日志就会报错。

如何解决呢?

#!/bin/bash
#==============================================================#
# File      :   stop-etl
# Ctime     :   2022年8月10日13:12:22
# Mtime     :   2022年8月10日13:12:27
# Usage     :   clean k8s log 
# author    :   ninesun
#==============================================================#
rm -rf >/tmp/no_clean_log.log
for log in `ll /var/log/kubernetes | grep lrw |awk '{print $9}'`;do
	no_clean_log=`stat ${log} | awk 'NR==1'|awk '{print $4}' | tr -d "‘"`
	echo ${no_clean_log} >> /tmp/no_clean_log.log
done
no_clean_log_foramt=`sed -r ':a;N;s/\n/|/;ba;' /tmp/no_clean_log.log`
find /var/log/kubernetes/ -type f -mtime +6|grep -Ev ${no_clean_log_foramt}| xargs -I GG echo "rm -rf GG" |bash

 这个脚本在调试的过程中发现find 中使用grep 一个变量好像不生效,但是打印出整个find命令执行起来是没有问题的,各位大佬如果知晓什么原因麻烦告知我一下。

原因:

事实上这种方法是没有问题的,find搭配grep也是没有问题的。是自己对管道的理解不深刻,find出来的结果集应该使用变量记录后者echo 出来,再经过格式化进行grep是完全没有问题的。例如

-- update 2022年9月7日17:52:08

换了一种思路去删除其实和第一种没啥本质的区别

#!/bin/bash
#==============================================================#
# File      :   stop-etl
# Ctime     :   2022年8月10日13:12:22
# Mtime     :   2022年9月7日17:52:27
# Usage     :   clean k8s log 
# author    :   ninesun
#==============================================================#
rm -rf >/tmp/no_clean_log.log
for log in `ls -l /var/log/kubernetes | grep lrw |awk '{print $9}'`;do
	#no_clean_log=`stat /var/log/kubernetes/${log} | awk 'NR==1'|awk '{print $4}' | tr -d "‘"`
	no_clean_log=`readlink /var/log/kubernetes/${log}`
	echo ${no_clean_log} >> /tmp/no_clean_log.log
done
no_clean_log_foramt=`sed -r ':a;N;s/\n/|/;ba;' /tmp/no_clean_log.log`
find_list=`find /var/log/kubernetes/ -type f -mtime +1 -print`
echo ${find_list} |tr ' ' '\n'| egrep -v ${no_clean_log_foramt} | xargs -I GG echo "rm -rf GG"

--update 2022年9月7日17:55:21

事实上第一种方法是没有问题的,find搭配grep也是没有问题的。是自己对管道的理解不深刻,find出来的结果集应该使用变量记录后者echo 出来,再经过格式化进行grep是完全没有问题的。例如

echo `find /var/log/kubernetes/ -type f -mtime +1` |tr ' ' '\n'  |grep -Ev ${no_clean_log_foramt}
#!/bin/bash
#==============================================================#
# File      :   stop-etl
# Ctime     :   2022年8月10日13:12:22
# Mtime     :   2022年9月7日17:57:32
# Usage     :   clean k8s log 
# author    :   ninesun
#==============================================================#
rm -rf >/tmp/no_clean_log.log
for log in `ls -l /var/log/kubernetes | grep lrw |awk '{print $9}'`;do
	no_clean_log=`stat /var/log/kubernetes/${log} | awk 'NR==1'|awk '{print $4}' | tr -d "‘"`
	echo ${no_clean_log} >> /tmp/no_clean_log.log
done
no_clean_log_foramt=`sed -r ':a;N;s/\n/|/;ba;' /tmp/no_clean_log.log`
echo `find /var/log/kubernetes/ -type f -mtime +1` | tr ' ' '\n'|grep -Ev ${no_clean_log_foramt}| xargs -I GG echo "rm -rf GG"
#echo `find /var/log/kubernetes/ -type f -mtime +1` | sed 's/ /\n/g '|grep -Ev ${no_clean_log_foramt}| xargs -I GG echo "rm -rf GG"

find找出来的文件默认是换行分割,经过命令替换之后变成了空格,可以使用tr 替换。 

也可使用sed全局替换 sed 's/ /\n/g'

docker container的日志

在每个可调度的节点上执行查看占用比较大的容器日志。

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 |sort -nr

NF 列的个数(默认以空格分隔) 

crontab定时删除

[root@master1 /tmp]#ansible k8s-all -m shell -a 'df -h /'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
[WARNING]: Found both group and host with same name: master1
master1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   23G   18G  56% /
node2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   14G   27G  35% /
master3 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   16G   25G  39% /
node1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   14G   27G  35% /
master2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   13G   28G  32% /
node3 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   13G   28G  32% /

 

监控

prometheus 监控node节点的每个指标


网站公告

今日签到

点亮在社区的每一天
去签到