Квоты и другие для Java Микросервис, JVM Params, k8s и Docker - PullRequest
0 голосов
/ 07 апреля 2020

При условии развертывания Java микросервиса (Dropwizard) через Docker и Kubernetes.

Пример микросервиса запускается и работает без ошибок с 192Mi HeapSize. Это определяется как базовое c требование к памяти.

Пример Dockerfile с использованием openjdk-runtime:11-hotspot

FROM some-container-reg/openjdk-runtime:11-hotspot
# prepare build
COPY --chown=1001:1001 build/install/svc-example .
COPY --chown=1001:1001 config.yml .
# exposing port(s)
EXPOSE 8080
# setting entry point...
ENTRYPOINT ["bin/svc-example", "server", "config.yml"]

Примечание: С используя openjdk > 10, JVM обнаруживает, работает ли он в контейнере. Поэтому нет необходимости включать экспериментальные функции виртуальной машины для достижения этой цели, например, в Java 8. Подробнее см. По ссылке ниже.

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8146115

Соответствующее развертывание k8s

resources:
  limits:
    cpu: 250m
    memory: 288Mi 
  requests:
    cpu: 100m
    memory: 192Mi
env:
  - name: JAVA_OPTS
    value: "-XX:MaxRAMPercentage=75.0"

Запрос контейнера равен рабочему количеству от самого приложения java. Пределы были определены как запрос плюс смещение 96Mi. Делая это, я хочу убедиться, что требования помимо JVM-Heap имеют достаточно ресурсов для правильной работы - MetaspaceSize, CodeCache, ....

Также определяя JAVA_OPTS в пределах развертывания контейнера, применяя -XX:MaxRAMPercentage=75.0, который определяет предел 75% общего объема памяти для JVM. Почему бы не определить явные ограничения кучи в -XX:Xmx=192Mi? Подробнее см. По ссылке ниже.

https://bugs.openjdk.java.net/browse/JDK-8186315

Итак, теперь мои вопросы:

  • Правильно ли я согласен с приведенными выше предложениями?
  • Как определить пределы для достижения недорогого развертывания?
  • Требуется ли применять дополнительные параметры к JVM, например GC или MaxMetaspaceSize для предотвращения использования памяти сверх пределов?
  • Нужно ли также определять JVM-Args для Dockerfile? Точнее говоря, JVM Docker и JVM Java -Microservice одинаковы?

1 Ответ

1 голос
/ 07 апреля 2020

Вам необходимо профилировать ваше приложение с помощью профилировщиков и отслеживать его с помощью инструментов APM, чтобы точно настроить требования к памяти по мере необходимости и непрерывной активности. Что касается последнего вопроса, каким бы ни был JRE / JDK образ docker, это JDK / JRE, использованный для создания контейнера для модуля в кубернетах. Также я заметил, что вы используете JDK, который не рекомендуется для производственного развертывания ... лучше использовать JRE.

С точки зрения квот Kubernetes следует помнить, что в любой момент, если потребление памяти java app выходит за пределы значения, определенного в пределах, когда pod будет прерван.

И pod вообще не будет планироваться, если в запросах нет узла, в котором было бы столько свободной памяти.

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