如何在Azure中的Kubernetes中进行scala堆转储

如何在Azure中的Kubernetes中进行scala堆转储,scala,azure,docker,kubernetes,azure-aks,Scala,Azure,Docker,Kubernetes,Azure Aks,我在Microsoft Azure AKS(Kubernetes)中对装载的持久卷进行自动堆转储时遇到问题 所以情况是这样的: import java.io._ object Main { def main(args: Array[String]): Unit = { println("Before printing test info to file") val pw = new PrintWriter(new File("/borsuk_data/hello.txt

我在Microsoft Azure AKS(Kubernetes)中对装载的持久卷进行自动堆转储时遇到问题

所以情况是这样的:

import java.io._

object Main {

  def main(args: Array[String]): Unit = {

    println("Before printing test info to file")
    val pw = new PrintWriter(new File("/borsuk_data/hello.txt"))
    pw.write("Hello, world")
    pw.close
    println("Before allocating to big Array for current memory settings")
    val vectorOfDouble = Range(0, 50 * 1000 * 1000).map(x => 666.0).toArray
    println("After creating to big Array")
  }

}
  • 运行参数为-Xmx200m的程序会导致内存不足 例外情况
  • 在AKS中构建、推送和部署docker映像后 秒吊舱关闭并重新启动
  • 我在装入的卷中的hello.txt中收到消息,但没有转储文件 创造
这种行为的原因可能是什么

我的测试程序如下所示:

import java.io._

object Main {

  def main(args: Array[String]): Unit = {

    println("Before printing test info to file")
    val pw = new PrintWriter(new File("/borsuk_data/hello.txt"))
    pw.write("Hello, world")
    pw.close
    println("Before allocating to big Array for current memory settings")
    val vectorOfDouble = Range(0, 50 * 1000 * 1000).map(x => 666.0).toArray
    println("After creating to big Array")
  }

}
My entrypoint.sh:

#!/bin/sh
java -jar /root/scala-heap-dump.jar -Xmx200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/scala-heap-dump.bin
我的Dockerfile:

FROM openjdk:jdk-alpine

WORKDIR /root
ADD target/scala-2.12/scala-heap-dump.jar  /root/scala-heap-dump.jar
ADD etc/entrypoint.sh /root/entrypoint.sh
ENTRYPOINT ["/bin/sh","/root/entrypoint.sh"]
我的部署yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: scala-heap-dump
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: scala-heap-dump
    spec:
      containers:
        - name: scala-heap-dump-container
          image: PRIVATE_REPO_ADDRESS/scala-heap-dump:latest
          imagePullPolicy: Always
          resources:
            requests:
              cpu: 500m
              memory: "1Gi"
            limits:
              cpu: 500m
              memory: "1Gi"
          volumeMounts:
            - name: data
              mountPath: /data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: dynamic-persistence-volume-claim
      dnsPolicy: ClusterFirst
      hostNetwork: false
      imagePullSecrets:
        - name: regsecret
更新: 正如lawrencegripper指出的,第一个问题是pod由于yaml中的内存限制而被杀死。在将内存更改为2560Mi或更高(我在yaml中甚至尝试过CPU:1000m和内存5Gi这样荒谬的值)之后,我没有理由死掉。但是,不会创建转储文件,并且在lastState terminated下会出现不同类型的消息。原因是:错误。不幸的是,这不是很有帮助。如果有人知道如何缩小范围,请帮忙

更新2: 我在代码中添加了一些println,以便更好地理解正在发生的事情。死吊舱的日志如下:

Before printing test info to file
Before allocating to big Array for current memory settings
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at scala.reflect.ManifestFactory$DoubleManifest.newArray(Manifest.scala:153)
        at scala.reflect.ManifestFactory$DoubleManifest.newArray(Manifest.scala:151)
        at scala.collection.TraversableOnce.toArray(TraversableOnce.scala:285)
        at scala.collection.TraversableOnce.toArray$(TraversableOnce.scala:283)
        at scala.collection.AbstractTraversable.toArray(Traversable.scala:104)
        at Main$.main(Main.scala:12)
        at Main.main(Main.scala)

正如您所看到的,程序从未达到:println(“创建到大阵列后”)。

这是一个很长的目标,但有一种可能是Kubernetes正在杀死pod,因为它在构建转储时,但在写入磁盘之前,违反了
YAML
中设置的内存限制

使用
kubectl get pod--output=yaml
获取pod信息,并在
lastState
下查看原因:OOMKilled


我认为问题在于entrypoint.sh命令

> java --help
Usage: java [options] <mainclass> [args...]
       (to execute a class)
   or  java [options] -jar <jarfile> [args...]
       (to execute a jar file)

pod
日志上写了什么?非常感谢您的回复。是的,在lastState中的原因是OOMKilled。因此,我将yaml中的内存限制提高到2560Mi。然而,并没有创建转储文件,现在我在lastState中得到了一个不同的错误,它相当神秘,exitCode:1和原因:error。你知道为什么会这样吗?我有一种感觉,这是因为我的kubenernetes资源太少了,但我不确定。谢谢你对这件事的评论。对不起,这一点不确定:(没问题;-)。我想我得更深入地研究库伯内特斯博士。干杯,是的!这就是问题所在。非常感谢你!