You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pod执行完成后获取堆转储文件及OOMKilled后延长Pod可用性咨询

解决OOMKilled后无法访问Pod堆转储文件的方法

方法一:让JVM在OOM后延迟退出

当触发OutOfMemoryError时,通过JVM参数指定延迟退出命令,给你足够时间进入Pod获取堆转储文件:

  • 在原有XX:+HeapDumpOnOutOfMemoryError基础上,添加JVM启动参数:
    XX:OnOutOfMemoryError="sleep 300"
    
    这条命令会让JVM生成堆转储后,执行sleep 300(延迟5分钟退出)。这段时间内Pod不会被立刻销毁,你可以通过以下命令将堆转储文件复制到本地:
    kubectl exec <pod-name> -- cp /path/to/heapdump.hprof /tmp/
    kubectl cp <pod-name>:/tmp/heapdump.hprof ./local-heapdump.hprof
    

方法二:将堆转储写入持久化存储

把堆转储文件直接写入PVC(PersistentVolumeClaim),即使Pod被销毁,文件依然保留:

  1. 创建PVC(根据你的存储类调整配置):
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: heapdump-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    
  2. 修改Pod配置,挂载PVC并指定堆转储路径:
    apiVersion: v1
    kind: Pod
    metadata:
      name: kotlin-app-pod
    spec:
      volumes:
        - name: heapdump-storage
          persistentVolumeClaim:
            claimName: heapdump-pvc
      containers:
        - name: kotlin-app
          image: your-kotlin-image
          args: ["-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/heapdump/heapdump.hprof"]
          volumeMounts:
            - name: heapdump-storage
              mountPath: /heapdump
    
  3. Pod OOM销毁后,创建临时Pod挂载PVC访问文件:
    apiVersion: v1
    kind: Pod
    metadata:
      name: temp-heapdump-access
    spec:
      volumes:
        - name: heapdump-storage
          persistentVolumeClaim:
            claimName: heapdump-pvc
      containers:
        - name: busybox
          image: busybox:latest
          command: ["sleep", "3600"]
          volumeMounts:
            - name: heapdump-storage
              mountPath: /heapdump
    
    之后通过kubectl exec进入临时Pod,将文件复制到本地。

方法三:使用Sidecar容器保持Pod存活

添加Sidecar容器(如busybox)与主容器共享存储卷,主容器OOM被杀死后,Sidecar继续运行,Pod不会销毁,你可通过Sidecar访问堆转储文件:

  1. 修改Pod配置,添加Sidecar并共享存储卷:
    apiVersion: v1
    kind: Pod
    metadata:
      name: kotlin-app-with-sidecar
    spec:
      volumes:
        - name: shared-heapdump
          emptyDir: {}
      containers:
        - name: kotlin-app
          image: your-kotlin-image
          args: ["-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/shared/heapdump.hprof"]
          volumeMounts:
            - name: shared-heapdump
              mountPath: /shared
        - name: sidecar
          image: busybox:latest
          command: ["sleep", "infinity"]
          volumeMounts:
            - name: shared-heapdump
              mountPath: /shared
    
  2. 主容器OOM终止后,Sidecar仍在运行,Pod处于Running状态,你可以通过以下命令获取文件:
    kubectl exec <pod-name> -c sidecar -- cp /shared/heapdump.hprof /tmp/
    kubectl cp <pod-name>:/tmp/heapdump.hprof ./local-heapdump.hprof
    

内容的提问来源于stack exchange,提问作者DutchBro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:18:47