Как сделать сброс кучи скалы в Кубернетесе на Лазурном - PullRequest
0 голосов
/ 08 февраля 2019

У меня проблема с выполнением автоматического дампа кучи на подключенный постоянный том в Microsoft Azure AKS (Kubernetes).

Таким образом, ситуация выглядит следующим образом:

  • Запуск программыс параметрами -Xmx200m вызывает исключение из-за нехватки памяти
  • После сборки, нажатия и развертывания образа Docker через AKS после нескольких секунд модуль удаляется и перезапускается
  • Я получил сообщение в 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, первой проблемой было то, что модуль был убит OOMиз-за ограничений памяти в ямле.После изменения памяти на 2560Mi или выше (я пробовал даже такие нелепые значения в yaml, как CPU: 1000m и память 5Gi), я не вижу причин, по которым OOM убил.Однако файл дампа не создается, и при последнем состоянии прекращается сообщение другого типа.Причина: ошибка.К сожалению, это не очень полезно.Если кто-нибудь знает, как его сузить, помогите.

ОБНОВЛЕНИЕ 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 ("После создания в большой массив").

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я думаю, что проблема в команде entrypoint.sh.

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

Обратите внимание, что все, что после -jar - это аргументы, передаваемые в ваше приложение, а не в JVM.

Попробуйте:

java -Xmx200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/scala-heap-dump.bin -jar /root/scala-heap-dump.jar 
0 голосов
/ 08 февраля 2019

Это длинный путь, но одна возможность состоит в том, что Kubernetes убивает модуль из-за того, что он нарушает ограничение памяти, установленное в YAML, во время создания дампа, но до того, как записывает его на диск.

Используйте kubectl get pod <yourPodNameHere> --output=yaml, чтобы получить информацию о пакете и посмотрите под lastState для Reason: OOMKilled

https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...