在多个Pod上进行Openshift 3.11堆转储OOM

问题描述

在运行OpenShift 3.11的应用程序上,我试图获取HeapDump,因为我怀疑Pod中有OOM。

我的应用程序在14个副本上运行,我想将以下配置附加到Java选项

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=file:///my/path/jdump/

该路径位于外部安装的卷上。

现在我知道文件名为

java_pid1.hprof 

但来自

ps -ef | grep java

我注意到大多数Pod在此过程中都使用相同的 pid ,而且我担心,如果同时在多个Pod上同时发生OOM,我会遇到当代访问的问题并写入文件

是否可以参数化文件名?我想像

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=file:///my/path/jdump/{$podname}_dump.href

非常感谢您的好意

解决方法

您可以将Pod名称公开为env变量,然后在您的命令中使用它,即

      command: [ "/bin/java"]
      args:
      - "-jar"
      - "your.jar"
      - "-XX:+HeapDumpOnOutOfMemoryError"
      - "-XX:HeapDumpPath=file:///my/path/jdump/$(MY_POD_NAME)_dump.href"
      env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

注意$(MY_POD_NAME)语法-引用https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#use-environment-variables-to-define-arguments

将字段显示为环境变量:https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables