K8S 收集微服务日志
log
·
背景
背景:服务上K8S集群后,使用rancher等工具可以查看实时日志,但不便于查看过去的日志。尤其是服务升版后,因为容器是重新启动的,过去的日志就查看不了了。如果想要查询历史日志,可以选用传统的elk,或者使用skywalking skywalking 接入 springboot 。然而elk需要日志过滤才能友好显示,kibana的查询也略显复杂,对普通开发者来说学习成本并不小。
需求:其实查看历史日志的情况不多,出问题的时候,有日志文件即可
目标:每天备份一波日志,并保存
场景:由 node1、node2、node3 三台服务器组成的K8S集群,集群里运行着数10个springboot微服务
方案
方案
- node1 编写脚本,输出本机微服务日志
- node2 和 node3 复制 node1 脚本到本地,并执行
- node2 和 node3 拷贝生成好的日志到 node1
- node1 把日志按日期统一存放
- 三个节点均设置定时任务
实现
node1 脚本 record.sh
存放于 /root/record,举例 微服务 permission 、 auth 、 user
- 获取日期参数$d
- 新建文件夹,用于保存微服务 docker 容器的 id
- 模糊查询获取微服务 docker 容器的 id
- if 判断,如果 id 为空,则不输出 log 文件
#!/bin/bash
date +%Y-%m-%d > ./date.log;
d=$(cat ./date.log);
logvar="/root/record/id_log";
mkdir -p $logvar
docker ps | grep 'dev-permission' | awk '{printf $1}' > $logvar/dev-permission-id.log;
id=$(cat $logvar/dev-permission-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-permission-$d.log;
fi
docker ps | grep 'dev-auth' | awk '{printf $1}' > $logvar/dev-auth-id.log;
id=$(cat $logvar/dev-auth-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-auth-$d.log;
fi
docker ps | grep 'dev-user' | awk '{printf $1}' > $logvar/dev-user-id.log;
id=$(cat $logvar/dev-user-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-user-$d.log;
fi
备注:获取 docker 的 id 后,需要先输出到文件,再从文件拿出来,docker log 的时候才能识别变量id
node2、node3 脚本 scp.sh
先安装 sshpass
yum install sshpass -y
sshpass 执行如下报错,因为初次执行需要先手敲 scp 登录
Host key verification failed
脚本步骤
- 删除旧的 log 文件
- 从 node1 复制执行文件 record.sh 到本地
- 执行 record.sh
- 复制生成的 log 到 node1
#!/bin/bash
rm -f /home/record/*;
sshpass -p "rootpassword" scp -r root@[node1_ip]:/root/record/record.sh /root/record > record.sh;
sh /root/record/record.sh;
sshpass -p "rootpassword" scp -r /home/record/* root@[node1_ip]:/home/record/;
复制时加 * ,可以只复制文件里面的内容,否则会连带文件夹一起复制过去
node1 脚本 cp.sh
文件统一保存在 /home/servicelog 下,用时间做文件夹名分类
- 创建日期文件夹
- 复制 /home/record/* 的日志
- 删除旧日志
#!/bin/bash
date +%Y-%m-%d > ./date.log;
d=$(cat ./date.log);
mkdir -p /home/servicelog/$d;
cp -rf /home/record/* /home/servicelog/$d/;
rm -f /home/record/*;
定时任务
编辑定时任务
vim /etc/crontab
node1
0 5 * * * root sh /root/record/record.sh
10 5 * * * root sh /root/record/cp.sh
node2 和 node3
5 * * * root sh /root/record/scp.sh
重启定时任务
systemctl restart crond
成果展示图
更多推荐
已为社区贡献36条内容
所有评论(0)