在 kubernetes pod 中发生 OOM 时坚持堆转储?

Persist heap dump in case of OOM in kubernetes pod?

当 java 进程出现 OOM 并且 pod 重新启动时,我需要保留堆转储。

我在 jvm args 中添加了以下内容

-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dumps

...和 ​​emptydir 挂载在同一路径上。

但问题是如果 pod 重新启动并且如果它被安排在不同的节点上,那么我们将丢失堆转储。即使 pod 被安排到不同的节点,我如何保留堆转储?

我们正在使用 AWS EKS,并且我们有超过 1 个 pod 副本。

有人可以帮忙吗?

您必须将堆转储保存在 pods 之间的共享网络位置上。为了实现这一点,您需要提供持久卷声明,在 EKS 中,这可以使用安装在不同可用性区域上的弹性文件系统来实现。您可以通过阅读这篇关于 EFS-based PVC 的 guide 开始了解它。

由于在您的情况下写入 EFS 太慢,AWS EKS 有另一个选择 - awsElasticBlockStore

The contents of an EBS volume are persisted and the volume is unmounted when a pod is removed. This means that an EBS volume can be pre-populated with data, and that data can be shared between pods.

注意:必须使用aws ec2create-volume或AWSAPI创建EBS卷才能使用

使用 awsElasticBlockStore 卷时有一些限制:

  • pods所在的节点运行必须是AWS EC2实例
  • 这些实例需要与 EBS 卷位于同一区域和可用区
  • EBS只支持单个EC2实例挂载卷

请查看关于此主题的 official k8s documentation page。 还有 How to use persistent storage in EKS.