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