В чем заключалась оптимизация контейнерной среды?
Что проверяют
Делали ли вы это руками и можете ли назвать конкретные меры, а не общие слова про «оптимизацию». Интервьюер ждёт связку: проблема, замер, действие, результат. Следом спрашивают, как вы измеряли эффект и что делали с лимитами CPU и памяти.
Как отвечать
Начните с проблемы: долгая сборка в CI, тяжёлые образы, OOMKilled, медленный старт подов. Затем меры, которые реально применяют к Python-сервисам:
- базовый образ:
python:3.12-slimили новее. Alpine ради размера часто проигрывает: на musl часть пакетов с C-расширениями ставится сложнее или собирается из исходников; - multi-stage build: в первой стадии компиляторы и сборка колёс или готового venv, во второй только интерпретатор и результат. Плюс
pip install --no-cache-dirи.dockerignore, чтобы в контекст не попадали.gitи тесты; - кэш слоёв: сначала копируют
requirements.txtилиuv.lockи ставят зависимости, потом код. Тогда правка кода не переустанавливает пакеты. BuildKit даётRUN --mount=type=cache,target=/root/.cache/pip, аuvзаметно ускоряет установку; - рантайм:
PYTHONUNBUFFERED=1, запуск не от root, exec-формаCMD, чтобы приложение получалоSIGTERMи завершалось корректно; - ресурсы:
requestsиlimitsв Kubernetes по реальному профилю нагрузки, число воркеров gunicorn или uvicorn задают явно.os.cpu_count()видит ядра узла, а не лимит контейнера, и формула из примеров gunicorn на большом узле даёт десятки процессов.
Цифры называйте свои: размер из docker images до и после, время сборки в CI, память по метрикам. Если такой задачи не было, скажите об этом и разберите по этому списку один свой Dockerfile.
Где спотыкаются
Сводят всё к размеру образа. Сервис при этом упирается в троттлинг CPU из-за жёсткого limits.cpu, а про это ни слова.
Называют круглые проценты вроде «минус 30% размера и минус 50% времени деплоя» и не могут объяснить, откуда они взялись.
Пишут CMD в shell-форме. Тогда PID 1 это /bin/sh, SIGTERM может не дойти до приложения, и контейнер убивают по таймауту без корректного завершения.