一个小需求,自动重启k8s集群中日志不刷新的POD

云计算
日常工作中,所有项目都不是完美的,笔者就经常遇到这种情况,pod状态是running,但是程序却没有响应。发生这种情况的原因有很多种,有可能是因为k8s健康检查的原因,比如使用ps检查进程;或者是程序内部死循环,但是不退出;再或者网络闪断,程序无法重连等等。

一个小需求,自动重启k8s集群中日志不刷新的POD
k8s

需求

日常工作中,所有项目都不是完美的,笔者就经常遇到这种情况,pod状态是running,但是程序却没有响应。发生这种情况的原因有很多种,有可能是因为k8s健康检查的原因,比如使用ps检查进程;或者是程序内部死循环,但是不退出;再或者网络闪断,程序无法重连等等。

无论什么原因,都会有解决办法,但是优化需要时间,在未完全解决之前,问题不能不解决,于是想到了一个临时方案,因为笔者公司项目日志是直接打印在stdout的,发生了程序无响应的情况,比较简单的一个办法是判断日志输出的时间。基于此,可以简单写一个小脚本,发现日志长时间不输出的时候,重启pod。

思路

使用kubectl logs命令查看最后一条日志输出的时间戳,与服务器时间对比,差值大于阈值,则重启相应POD。当然,这只是一个简单的思路,并不适用于大部分场景,但是适合笔者公司,因为核心项目请求量很大,但凡是超过1分钟日志不刷新,基本可以断定100%出现问题了。

此思路其实也是抛砖引玉,希望能给大家一些灵感,如果有什么更好的办法,也可以与笔者沟通交流。

简单实现

shell比较简单,直接与服务器交互也比较友好,就是用shell来写吧。

  1. #!/bin/sh 
  2. # 获取当前UTC时间utc_now=`date -u` 
  3. # 将时间转换为timestamptimestamp_now=`date -d "$utc_now" +%s` 
  4. function restart_pod() { 
  5.     for i in `kubectl get pod -n iot|grep PODNAME|awk '{print $1}'`;do 
  6.         for time in `kubectl logs  --tail=1 --timestamps $i -n iot | awk '{print $1}'`;do 
  7.             timestamp_pod=`date -d "$time" +%s` 
  8.             delay=$(($timestamp_now-$timestamp_pod))            echo $i:$delay            if [ "$delay" -ge "30" ];then 
  9.                 echo "Pod $i 30S内没有最新日志产生,重启pod!" 
  10.                 echo $i                kubectl delete pod $i -n iot --force --grace-period=0 
  11.                 curlwxFunc "Pod $i 30S内没有最新日志产生,重启pod!(生产环境)" 
  12.             fi        done    done}function curlwxFunc() { 
  13.     JSON='{ 
  14.             "msgtype""text"
  15.             "text": { 
  16.                 "content""'$1'" 
  17.             } 
  18.         }' 
  19.     curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx' \ 
  20.     -H 'Content-Type:application/json' \ 
  21.     -d "${JSON}" 
  22. }restart_pod 

脚本很简单,先查询pod,然后看pod最后一条日志时间,与服务器时间对比,延迟超过30s就重启pod,并且调用企业微信接口发一条通知。

后记

此方法也是治标不治本,治标还需要从源头解决,不过需要时间,再没有解决之前,先用这个小脚本抗一抗吧。也欢迎大家拍砖。

责任编辑:未丽燕 来源: 今日头条
相关推荐

2021-04-22 09:46:35

K8SCluster Aut集群

2023-07-04 07:30:03

容器Pod组件

2020-02-29 15:20:18

K8SKubernetes集群

2020-02-29 15:23:15

Kubernetes集群程序

2023-03-05 21:50:46

K8s集群容量

2023-09-03 23:58:23

k8s集群容量

2022-06-01 09:38:36

KubernetesPod容器

2022-11-02 10:21:41

K8s pod运维

2021-11-04 07:49:58

K8SStatefulSetMySQL

2022-05-09 09:52:28

K8sLens开源

2021-06-07 08:32:06

K8S集群Poddebug

2023-11-06 01:17:25

主机容器选项

2024-02-01 09:48:17

2024-03-18 15:44:48

K8S故障运维

2022-04-22 13:32:01

K8s容器引擎架构

2023-11-06 07:16:22

WasmK8s模块

2021-07-28 10:10:57

K8SMount PVCPod

2024-05-27 00:00:10

KubernetesK8s云原生

2022-12-28 10:52:34

Etcd备份

2020-07-30 09:10:21

DockerK8s容器
点赞
收藏

51CTO技术栈公众号