最近发现有些spring boot项目在k8设置的探针存在问题,在实际运行过程中,存在突发的重启现象。借这个机会总结一下相关用法,作为后续项目参考。
上面的链接是官网的资料,可以看到三个主要的探针作用分别是:
我们这里主要关注就绪探针和存活探针。可看到存活探针对应用的影响非常大。
之前有不少应用是基于Spring Boot Actuator来设置探针的。例如用健康检查health这个路径来处理。
经历了生产故障之后,维护反馈要不要随意重启,会有很多问题,希望区别对待。后来在讨论中也经常提到,由人来控制什么时候重启比较好。结论就是希望提供两个路径,一个作为探针,不要检查数据库之类,一个作为监控平台的健康检查。
后来想想,health作为存活探针也的确不合适,因为:
所以,应用的存活探针主要关注应用自身的情况,典型的情况,例如业务线程是否正常(程序有没有hung住)。
就绪探针影响就小多了,由于它会在检测失败的时候从Service中摘除,一定程度上这是一个保护机制,让应用可能恢复正常。所以就绪探针可以敏感一些,快速隔离,快速恢复。
这样看的话,就需要至少两套检测路径,一套用于就绪探针,比较敏感,关注必要的核心组件,检测到不可用后可能触发隔离,看看是否可以自动恢复。一套用于存活探针,没那么敏感,只关注应用自身,非极端情况不触发。可能还有第三套,用于全面监控,例如部分不可用(但不影响业务)的情况也可以感知到,最敏感,内容最详细,用于监控告警,便于提前介入。
原本是打算定制一套,还好发现spring boot2.3已经内置了一套标准做法。无论是就绪探针,还是存活探针,都可以选择包括哪些模块的检测,非常方便。
顺手找了几个参考材料。