目录
一、需求描述:
在日常的工作中,研发人员经常需要导出应用日志,以观察代码在实际生产环境中运行是否符合预期效果或者存在无法模拟场景而产生异常。这就导致日志的导出是一个非常频繁的操作,出于安全考虑,不可能让研发人员自己弄。所以为了方便自己,也为了方便不在的时候同部门的人员帮忙,有必要将操作傻瓜化,有助于自己保持好心情和休假,尽量不在重复而枯燥的操作中变得烦躁。
二、问题分析:
由于集群中应用繁多且可能应用名称冗长,所以每次输入命令导出日志而且每次只能导出一个Pod,就显得极为繁琐。所以有必要设计一个日志导出脚本程序来简化操作.
主要设计如下:
应用名称分类排列,设置编号,脚本接收输入编号,导出对应应用所有Pod的日志打包并清理log文件。
三、应用场景:
Kubernetes集群生产、测试平台
四、功能描述:
1、观感简洁
简洁干净的可视化环境看起来心情更愉悦,合理的布局结构看起来清晰明了。
2、应用编号
集群内应用繁多且有的名字冗长,功能各异,所以在实际使用过程中,有必要将同类或者功能较相近放置在一个区域,再根据名字长短看着怎么美观再调整。
如下图示例,是简化和佚名后我们生产中用的脚本执行界面效果图:
3、过程可观测
日志下载开始和结束会在屏幕有打印输出,过程中一个Pod下载完也会屏幕打印,不喜欢可以关掉
4、日志下载时间戳
下载时间戳即给压缩包名字加上打包时间设置,具体精确到时还是分、秒,看自己需求。
5、自动清理无用.log文件
在应用的所有Pod日志下载完成后,要把所有Pod打包成一个应用名称的压缩包,便于传输,同时删除下载的.log文件以节省磁盘空间。
6、操作简单快捷
整体操作简单快捷,无论应用有10个还是20个Pod,亦或更多,输入应用名称编号回车即可全部下载。避免枯燥无味的繁琐操作,提高工作效率。
具体shell脚本如下(以下脚本已简化,使用可根据自己自己需求适当增加循环和应用名字):
#!/bin/bash
#AUTHOR : Created by YaoButing
#PLATFORM : CentOS Linux release 7.8.2003(2003)
#VERSION : 3.0
#DATE : 2021-09-08
#DESCRIPTION : This script is used to muanual download k8s logs.
###############################################################################
NUMBER=100
cd /data/logs
while (($NUMBER>0))
do
echo " 请选择需要导出日志的应用序号 "
echo "*********************************************************************"
echo "* *"
echo "* [ 101 ].AAAAA [ 111 ].BBBBB *"
echo "* *"
echo "* [ 102 ].CCCCC [ 112 ].DDDDD *"
echo "* *"
echo "*********************************************************************"
echo " 按 0 推出脚本 "
echo " "
read -p "请输入将要执行的动作序号:" NUMBER
echo " "
echo " "
if (($NUMBER==101))
then
echo "####-- 101 --### 导出 AAAAA 日志 #######################"
for pod in `kubectl get pod -n CSDN | grep AAAAA | awk '{print $1}'`
do
timeout 15 kubectl logs -f $pod -n CSDN > /data/logs/AAAAA-`date "+%Y-%m-%d-%H-%M-%S"`.log
echo " $pod 日志已导出......"
done
tar -zcPvf /data/logs/AAAAA-`date "+%Y-%m-%d-%H"`.tar.gz /data/logs/AAAAA-`date "+%Y-%m-%d-%H"`*.log
rm -rf /data/logs/*.log
echo "####-- 101 --### 导出 AAAAA 日志 #######################"
elif (($NUMBER==102))
then
echo "####-- 102 --### 导出 BBBBB 日志 #######################"
for pod in `kubectl get pod -n CSDN | grep BBBBB | awk '{print $1}'`
do
timeout 15 kubectl logs -f $pod -n CSDN > /data/logs/BBBBB-`date "+%Y-%m-%d-%H-%M-%S"`.log
echo " $pod 日志已导出......"
done
tar -zcPvf /data/logs/BBBBB-`date "+%Y-%m-%d-%H"`.tar.gz /data/logs/BBBBB-`date "+%Y-%m-%d-%H"`*.log
rm -rf /data/logs/*.log
echo "####-- 102 --### 导出 BBBBB 日志 #######################"
elif (($NUMBER==111))
then
echo "####-- 111 --### 导出 CCCCC 日志 #######################"
for pod in `kubectl get pod -n CSDN | grep CCCCC | awk '{print $1}'`
do
timeout 15 kubectl logs -f $pod -n CSDN > /data/logs/CCCCC-`date "+%Y-%m-%d-%H-%M-%S"`.log
echo " $pod 日志已导出......"
done
tar -zcPvf /data/logs/CCCCC-`date "+%Y-%m-%d-%H"`.tar.gz /data/logs/CCCCC-`date "+%Y-%m-%d-%H"`*.log
rm -rf /data/logs/*.log
echo "####-- 111 --### 导出 CCCCC 日志 #######################"
elif (($NUMBER==112))
then
echo "####-- 112 --### 导出 DDDDD 日志 #######################"
for pod in `kubectl get pod -n CSDN | grep DDDDD | awk '{print $1}'`
do
timeout 15 kubectl logs -f $pod -n CSDN > /data/logs/DDDDD-`date "+%Y-%m-%d-%H-%M-%S"`.log
echo " $pod 日志已导出......"
done
tar -zcPvf /data/logs/AAAAA-`date "+%Y-%m-%d-%H"`.tar.gz /data/logs/DDDDD-`date "+%Y-%m-%d-%H"`*.log
rm -rf /data/logs/*.log
echo "####-- 112 --### 导出 DDDDD 日志 #######################"
elif (($NUMBER==0))
then
echo "###################--- 程序即将退出 ---##################"
else
echo "##############---输入错误,请按照指定应用序号输入---################"
fi
echo " "
echo "--- 导出日志存放路径 /data/logs/ 等待返回选择页面或者按 0 退出 -------"
echo " "
sleep 10
done
五、总结:
运维工作是苦逼枯燥繁琐烦累的,如何简化运维操作,让工作更智能化自动化让自己多活几年而又不至于自己作死到被裁员,这又是一门哲学。