在 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.
当 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.