K8S事件显示容器重启但Pod日志无相关记录问题咨询
kubectl logs无相关记录的问题 这种情况我之前在维护Consul集群的时候碰到过好几次,主要是这几个常见原因,你可以逐一排查:
默认日志仅展示当前容器实例
kubectl logs pods/consul-0默认只会拉取当前正在运行的容器实例日志,要是容器已经重启过,之前崩溃的那个实例的日志不会被默认输出。你需要加上--previous参数来调取历史实例的日志:kubectl logs pods/consul-0 --previous kubectl logs pods/consul-1 --previous kubectl logs pods/consul-2 --previous这是最容易被忽略的点,很多时候重启相关的日志都藏在历史实例里。
容器启动初期崩溃,日志未被kubelet捕获
如果容器在初始化阶段(比如Entrypoint脚本执行失败、依赖服务未就绪、资源不足触发OOM被kill)就快速崩溃,可能日志还没来得及被kubelet收集。这时候你需要直接到Pod所在的节点上,通过容器运行时工具查看原始日志:- 用containerd的话,先找容器ID:
crictl ps -a | grep consul,再查日志:crictl logs <container-id> - 也可以直接查看节点上的Pod日志文件,路径一般是
/var/log/pods/<namespace>_<pod-name>_<pod-uid>/<container-name>/,这里的日志会保留更原始的启动记录。
- 用containerd的话,先找容器ID:
事件中的“重启”来自Init Container而非主容器
K8S事件里提到的容器重启,有可能是Pod的Init Container导致的,而你只查看了主Consul容器的日志。先通过kubectl describe pod consul-0查看Pod的Init Containers状态,如果有重启记录,再指定容器名查看日志:kubectl logs pods/consul-0 -c <init-container-name>日志被轮转或收集工具清理
如果集群配置了日志轮转(比如logrotate),或者用了Fluentd、Loki这类日志收集工具,本地的日志可能被定期清理或同步到远端存储了。这时候可以检查节点上的日志轮转配置,或者到集群的日志收集系统中搜索对应Pod的历史日志。K8S事件存在状态同步延迟
偶尔会出现kubelet和APIServer之间的状态同步延迟,导致事件显示容器重启,但实际容器已经恢复或者并未真的重启。你可以通过查看Pod的详细状态来确认:kubectl get pod consul-0 -o yaml | grep -A 10 restartCount如果
restartCount确实大于0,再结合前面的方法排查日志;如果是0,那大概率是事件同步的问题,不用太担心。
内容的提问来源于stack exchange,提问作者Henrik

