在 Kubernetes 中,我们有一个活体探测器,它会定期检查容器是否可访问,并以其他方式杀死并生成一个新容器。
我们有一个Java webapp,在大多数情况下,我看到应用程序由于内存压力而变得不可用。我们有一个活跃度探测,但是由于健康检查服务调用并不占用太多内存,所以即使许多其他需要更多内存的请求仍然存在,它也会成功。
GC继续连续运行以回收内存,但无济于事。实例永远不会恢复。在这种状态下,我希望库伯内特斯杀死pod,但考虑到活动探测仍然成功,它没有。处理这种情况的一种方法可能是使活动探测成为更资源密集型的操作,但是,它会消耗更多的周期并给系统带来额外的负载。
因此,我希望进行某种活动性检查,以监视Java进程的垃圾收集计数图的斜率。另一种声明方式是,我希望我的活动探测器依赖于遥测数据。有什么办法可以做到这一点吗?
运行状况探测通常以 HTTP 请求的形式使用,用于检查 HTTP 终结点返回的状态代码。但是,您也可以执行脚本作为运行状况检查,kubernetes 文档提供了一个对文件执行 cat 的示例。与其对文件执行 cat,不如运行自定义脚本命令来检查所需的统计信息(例如.java堆大小)。如果脚本很复杂,您可能希望将该脚本包含在映像中或将其从配置映射挂载到容器中。除了运行 bash 命令之外,还有其他方法可以获取指标,因为您可以转到 k8s 指标 API。或者,您可以让您的 java 应用程序直接使用您可以调用的 rest endpoint进行报告(例如,像 Spring 引导执行器这样的东西)。