一个小需求,自动重启k8s集群中日志不刷新的POD
时间:2022-07-25
本文章向大家介绍一个小需求,自动重启k8s集群中日志不刷新的POD,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
需求
日常工作中,所有项目都不是完美的,笔者就经常遇到这种情况,pod状态是running,但是程序却没有响应。发生这种情况的原因有很多种,有可能是因为k8s健康检查的原因,比如使用ps检查进程;或者是程序内部死循环,但是不退出;再或者网络闪断,程序无法重连等等。
无论什么原因,都会有解决办法,但是优化需要时间,在未完全解决之前,问题不能不解决,于是想到了一个临时方案,因为笔者公司项目日志是直接打印在stdout的,发生了程序无响应的情况,比较简单的一个办法是判断日志输出的时间。基于此,可以简单写一个小脚本,发现日志长时间不输出的时候,重启pod。
思路
使用kubectl logs命令查看最后一条日志输出的时间戳,与服务器时间对比,差值大于阈值,则重启相应POD。当然,这只是一个简单的思路,并不适用于大部分场景,但是适合笔者公司,因为核心项目请求量很大,但凡是超过1分钟日志不刷新,基本可以断定100%出现问题了。
此思路其实也是抛砖引玉,希望能给大家一些灵感,如果有什么更好的办法,也可以与笔者沟通交流。
简单实现
shell比较简单,直接与服务器交互也比较友好,就是用shell来写吧。
!/bin/sh
获取当前UTC时间utc_now=date -u
将时间转换为timestamptimestamp_now=date -d "$utc_now" +%s
function restart_pod() {
for i in `kubectl get pod -n iot|grep PODNAME|awk '{print $1}'`;do
for time in `kubectl logs --tail=1 --timestamps $i -n iot | awk '{print $1}'`;do
timestamp_pod=`date -d "$time" +%s`
delay=$(($timestamp_now-$timestamp_pod)) echo $i:$delay if [ "$delay" -ge "30" ];then
echo "Pod $i 30S内没有最新日志产生,重启pod!"
echo $i kubectl delete pod $i -n iot --force --grace-period=0
curlwxFunc "Pod $i 30S内没有最新日志产生,重启pod!(生产环境)"
fi done done}function curlwxFunc() {
JSON='{
"msgtype": "text",
"text": {
"content": "'$1'"
}
}'
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx'
-H 'Content-Type:application/json'
-d "${JSON}"
}restart_pod 脚本很简单,先查询pod,然后看pod最后一条日志时间,与服务器时间对比,延迟超过30s就重启pod,并且调用企业微信接口发一条通知。
后记
此方法也是治标不治本,治标还需要从源头解决,不过需要时间,再没有解决之前,先用这个小脚本抗一抗吧。也欢迎大家拍砖。
- 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
- 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
- Polyspace不认识Interrupt,肿么办?
- 1639: [Usaco2007 Mar]Monthly Expense 月度开支
- 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通
- 1642: [Usaco2007 Nov]Milking Time 挤奶时间
- 1625: [Usaco2007 Dec]宝石手镯
- 1613: [Usaco2007 Jan]Running贝茜的晨练计划
- 1677: [Usaco2005 Jan]Sumsets 求和
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
- 1602: [Usaco2008 Oct]牧场行走
- 【LeetCode 500】关关的刷题日记27 Keyboard Row
- 1601: [Usaco2008 Oct]灌水
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-DataTable篇
- Js中Math对象
- Hive窗口函数
- 同时打乱数据集和标签的几种方式
- Hive中的数据类型以及案例实操
- pytorch和tensorflow的爱恨情仇之定义可训练的参数
- Hive中库和表的常见操作
- 宝石与石头
- 给你的MyBatis-Plus装上批量插入的翅膀
- pytorch和tensorflow的爱恨情仇之参数初始化
- scp命令
- osgEarth使用笔记4——加载矢量数据
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
- Vue路由Hash模式分析
- Flutter基础widgets教程-CupertinoButton篇