在 kubernetes pod 中出现 OOM 时保留堆转储吗?

Bai*_*nik 6 amazon-web-services heap-dump kubernetes persistent-volumes amazon-eks

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

我在 jvm 参数中添加了以下内容

-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dumps
Run Code Online (Sandbox Code Playgroud)

...并且emptydir安装在同一路径上。

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

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

有人可以帮忙解决这个问题吗?

moz*_*llo 1

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

EBS 卷的内容会被持久化,并且当 Pod 被删除时,该卷也会被卸载。这意味着 EBS 卷可以预先填充数据,并且数据可以在 Pod 之间共享。

注意:您必须先使用 aws ec2 create-volume 或 AWS API 创建 EBS 卷,然后才能使用它。

使用 awsElasticBlockStore 卷时存在一些限制:

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

请查看有关此主题的官方 k8s 文档页面。以及如何在 EKS 中使用持久存储