Как спасать дампы когда контейнеры выходят из строя
На собеседовании я ответил, что спасаю дампы уменьшением времени записи JFR и отключением проб контейнера. Собеседующий кивнул и спросил: "А что насчёт preStop и startupProbe?" Я выкрутился, но внутри понял: мой подход был костылём, который работает только до первого OOM. И знаете, это был один из лучших моментов того разговора, потому что я пришёл туда не только отвечать, но и учиться.
Разница между штатным завершением и падением по памяти в Kubernetes оказалась принципиальной. Когда контейнер уходит штатно, preStop отрабатывает честно: сливаешь дампы, прощаешься с логами, умираешь достойно. Но OOM-киллер шлёт SIGKILL мгновенно и без предупреждения. Никакой preStop не сработает, контейнер просто исчезает вместе со всем, что не успел записать. Мои ускоренные JFR-дампы и отключённые пробы помогали писать быстрее, но файл всё равно оставался внутри умирающего контейнера и терялся навсегда.
Правильное решение собралось из трёх частей. Первое: emptyDir для хранения дампов между рестартами. Файл пишется в том, который жив дольше контейнера. Второе: startupProbe или initContainer, которые после перезапуска проверяют том, находят дамп и автоматически эвакуируют его в S3. Контейнер умер, поднялся заново, а артефакт уже в облаке, и ты спокойно разбираешь его утром вместо того, чтобы гадать, что убило под в три часа ночи. Третье: опция JVM -XX:+CrashOnOutOfMemoryError. Она гарантирует, что JVM допишет дамп до конца и упадёт сама, не оставляя битый файл на полуслове.
Это собеседование напомнило мне, почему важно не застаиваться. Можно годами работать с одними и теми же инструментами и считать, что всё знаешь. А потом один вопрос от коллеги по цеху вскрывает слепую зону, и ты понимаешь: развиваться и углубляться нужно постоянно. Не для галочки в резюме, а чтобы в следующем OOM-инциденте не гадать, где дамп, а точно знать, что он уже в S3. Теперь я твёрдо усвоил: в Kubernetes нужно различать штатное завершение, где рулит preStop, и аварийное падение по памяти, где спасает только пост-рестартовая проверка томов. И за это спасибо тому собеседованию.
Бывало у вас такое: приходите на собеседование, а уходите с новым знанием, которое тут же хочется внедрить?
#sre #kubernetes #oom #heapdump #jfr #jvm #devops #observability #incidentmanagement #prestop #startupprobe #initcontainer #emptydir #s3 #continuouslearning