今天看到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节点的每个指标
