K8S 搜集java应用pod重启前现场 —— 筑梦之路

JAVA技术广泛用于各行各业,而云原生的流行,越来越多的企业将java应用搬进K8S中进行部署管理,OOM是java应用比较常出现的故障问题,对于容器环境的java应用搜集OOM等现场比较有难度,为了持续对应用的优化,搜集故障现场也是比较重要的。这里介绍一种搜集现场的方式,仅供参考。

这里主要使用容器生命周期钩子函数PreStop,在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此回调会被调用。如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。Pod 的终止宽限周期在 PreStop 回调被执行之前即开始计数, 所以无论回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。没有参数会被传递给处理程序。

配置示例:

lifecycle:
  preStop:
    exec:
      command:
      - /bin/sh
      - -c
      - pid=`ps -ef |grep java | grep -v grep |awk '{print $1}'`; jmap -dump:format=b,file=/data/dump/${JAR_NAME}.dump
                ${pid}

在容器销毁前通过jmap命令收集dump到指定目录。

注意事项:

1. 这个目录需要做持久化,而且要及时清理减少磁盘占用,因为日常的发布也会触发preStop;

2. 终止宽限期-terminationGracePeriodSeconds需要调整,给jmap预留充分的时间保留现场,也不能太长,调长的副作用是滚动发布会变慢。

参考资料:容器生命周期回调 | Kubernetes 

你可能感兴趣的:(云计算,虚拟化,Java技术,kubernetes,java,容器)