问题描述
K8s集群中有个别节点上以Docker容器化部署的kubelet以1h ~ 4h不等的时间间隔反复重启。
排查过程
阶段一
-
docker logs kubelet
未发现服务运行的异常日志 -
docker inspect kubelet | grep -A 15 'State'
容器上次退出进程的"ExitCode": 0
,无有效信息 -
sudo journalctl -u docker
和sudo 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
过程模拟
- 设置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
- 向kubelet发送SIGKILL信号
pgrep kubelet # 记录进程号
sudo kill -9 $(pgrep kubelet)
- 记录kubelet容器事件
docker system events --filter type=container --filter container=kubelet
exitCode=137表示进程被SIGKILL
- 将时间时间转换为Unix 时间戳
date -u -d "2024-01-12 19:14:26" +%s
# 1705086866
- 根据时间戳或进程号过滤audit日志
cat /var/log/audit/audit.log | grep 1705058066 | grep syscall
根据日志信息可以确定kubelet是被终端tty=pts3
执行的kill
指令杀死的。