记一次kubelet不定期重启问题排查过程

问题描述

K8s集群中有个别节点上以Docker容器化部署的kubelet以1h ~ 4h不等的时间间隔反复重启。

排查过程

阶段一

  • docker logs kubelet 未发现服务运行的异常日志
  • docker inspect kubelet | grep -A 15 'State' 容器上次退出进程的"ExitCode": 0 ,无有效信息
  • sudo journalctl -u dockersudo journalctl -u containerd 未发现有效线索
  • 尝试重启dockerd和containerd进程,无效
  • 执行docker system events --filter type=container --filter container=kubelet记录容器重启事件,出现exitCode=137,猜测有进程再向kubelet发送kill信号

阶段二

  • 设置audit,追踪发送SIGKILL的进程
  • 记录kubelet进程号: docker inspect kubelet | grep Pid
  • 记录kubelet容器退出和启动事件: docker system events --filter type=container --filter container=kubelet
  • 根据kubelet进程号,搜索audit.log

问题结论

系统上安装了个安全软件 sentinelone-agent,基于某种规则,不定期向kubelet发送SIGKILL信号,导致kubelet不断重启。

参考文档

How to track who/what is sending SIGKILL to a process? - Red Hat Customer Portal

https://filippo.io/linux-syscall-table/

62 kill sys_kill kernel/signal.c

https://linux.die.net/man/2/kill

过程模拟

  1. 设置audit
# configure an audit rule for capturing kill signals
auditctl  -a exit,always -F arch=b64 -F a1=9 -S kill
auditctl  -a exit,always -F arch=b64 -F a1=9 -S tkill
auditctl  -a exit,always -F arch=b64 -F a2=9 -S tgkill
# log
less /var/log/audit/audit.log
  1. 向kubelet发送SIGKILL信号
pgrep kubelet # 记录进程号
sudo kill -9 $(pgrep kubelet)
  1. 记录kubelet容器事件
docker system events --filter type=container --filter container=kubelet

exitCode=137表示进程被SIGKILL

  1. 将时间时间转换为Unix 时间戳
date -u -d "2024-01-12 19:14:26" +%s
# 1705086866
  1. 根据时间戳或进程号过滤audit日志
cat /var/log/audit/audit.log | grep 1705058066 | grep syscall

根据日志信息可以确定kubelet是被终端tty=pts3执行的kill指令杀死的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容