Pull to refresh

Comments 13

а еще можно попробовать распаковать jar. Он все равно его распакует при запуске. Это, кстати, есть в рекомендациях по ускорению спринга.
bellsoft/liberica-openjdk-alpine — полноценный docker образ OpenJDK 11 всего 131 MB.

А в вашем получившемся образе, смотрю, отсутствуют даже самые базовые диагностические утилиты вроде jstack и jmap. Или вы не мониторите и не профилируете приложения в продакшне?
У образа около 5к загрузок, подскажите, как у него с поддержкой и обновлениями? Потенциально может быть хорошей альтернативой скажем adoptopenjdk/openjdk11:alpine-jre.

Касательно мониторинга (предполагая что все это запущено в kubernetes): для метрик приложения (память, CPU) я бы вытаскивал их из подов при помощи heapster/grafana/influxdb, для бизнес метрик я бы строил дашборды на кибане используя elastic-stack. Оба подхода можно подключить используя daemonsets что позволит избежать изменений в самих сервисах и приложениях. Как вы верно заметили, ограничение этих подходов в том что JVM метрики мы не собираем.

Во многих случаях аномольно большое использование CPU либо памяти привлечет внимание, но вы правы, может понадобится больше диагностической информации, в часности о JVM.
подскажите, как у него с поддержкой и обновлениями
Лучше, чем у кого-либо, насколько мне известно. Впрочем, не хочу заниматься рекламой, пусть лучше alexbel сам обо всём расскажет :)

Я инжектил в jvm jmx exporter, дальше вытащить инфу на уровень кластера и в прометеус не проблема.

musl проблемы не вызывал?
Я как минимум хапнул несовместимость ffmpeg с ним /это вне контекста Java, если что/

Нет, не вызывал. Долго всматривался, как приложение работает, никаких проблем не увидел. Но, конечно же, тестировать и проверять надо внимательно.
И я не понял отличие от просто -alpine сборки, там же тоже должен быть по идее musl.

Просто тут я наблюдаю ту же историю, что и с Python — чем больше модулей использует приложение — тем меньше выигрыш от кастомного образа. Насколько действительно образ 422МБ хуже, чем 144МБ? Может проблема в голове разработчика? Потому что снижая размер образа он усложняет процесс сборки и поддержки (нужно внимательно следить за тем, какие зависимости нужно в образ докинуть, чтобы приложение запустилось). Т.е. все-таки каков экономический эффект от уменьшения размера? Кто сможет объяснить?

Я бы предложил оценивать с точки зрения, какие проблемы образ решает лучше или хуже?
  • запустить приложение: решают одинаково, при условии что мы протестировали и приложение запускается
  • простота сборки: меньший образ хуже так как его сложнее приготовить
  • колличество денег что компания заработает: вероятно тоже не влияет
  • security: возможно лучше иметь только то что необходимо и изолировать себя опасности от того что не нужно, но есть в образе
  • скорость запуска на новой ноде k8s которая была только что создана на aws spot instance: меньший образ, вероятно, загрузится быстрее

Я только с последним пунктом согласен. Но и то не факт, т.к. общие слои уже почти наверняка лежат в кэше на ноде кубера. Если, конечно, базовый образ не поменялся. И это не зависит от политики скачивания (Always Pull Policy — оно ес-но кэш не отключает).


По безопасности — тоже как бы не сильно видно профита. Ну, будет не 20 компонентов в образе, а 10. Все равно строить пайплайн проверки образов на уязвимости. Да, конечно, в случае, если в 20-м модуле, который не используется найдена уязвимость, то мелкий образ (который на 10 нужных) без него пересобирать не придется. Но это спорное преимущество.

Безотносительно размера докер образа, советую посмотреть на Jib github.com/GoogleContainerTools/jib Это инструмент упаковки Java приложений в Docker, поддерживает Spring Boot и выбор базовых образов.

Не уверен насчет JDK custom runtime, но у него много других преимуществ. Например он складывает внешние библиотеки, код приложения и ресурсы приложения в разные слои. Поэтому размер обновления, т.е. слоя который по факту нужно скачать на сервере, обычно равен размеру вашего кода.
Sign up to leave a comment.

Articles