Google перевёл GKE Pod snapshots в общий доступ: функция сохраняет рабочее состояние пода вместе с памятью CPU и GPU и восстанавливает его по требованию. По данным InfoQ, общий доступ (general availability) открыт в мае на кластерах версии 1.35.3-gke.1234000 или более поздней. Снимок снимается вручную, а восстановление запускается удалением и повторным развёртыванием пода — GKE сам подбирает подходящий снимок.
Ниже — что именно фиксируется в снимке, как устроен откат, какие цифры ускорения заявляет Google и где механизм перестаёт работать.
Что именно изменилось
Снимок пода сохраняет состояние запущенной рабочей нагрузки, включая память CPU и GPU, и восстанавливает его по требованию. При создании снимка появляется пользовательский ресурс PodSnapshotпользовательский ресурс Kubernetes, хранящий состояние пода на момент снимка. Посмотреть все снимки в пространстве имён можно командой kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE. В выводе есть колонка POLICY — например, example-policy, — то есть снимок связан с политикой.
Настройка идёт через два ресурса. PodSnapshotStorageConfigресурс, указывающий бакет, куда складываются снимки задаёт место хранения. PodSnapshotPolicyресурс, который выбирает поды по метке, задаёт триггер и настраивает хранение снимков выбирает поды по метке, задаёт триггерПараметр PodSnapshotPolicy, задающий способ запуска снимка — по сигналу рабочей нагрузки (workload) или вручную (manual). и настраивает хранение: как долго хранится снимок после последнего обращения и сколько снимков допускается в группе.
Восстановление запускается удалением существующего пода после снятия снимка и повторным развёртыванием — либо развёртыванием нового пода с идентичной спецификацией. GKE автоматически восстанавливает под из подходящего снимка.
Как устроено восстановление
Обычный старт контейнера включает полный процесс загрузки данных, и на это уходит время. Снимок позволяет обойти эту фазу: инициализация выполняется один раз, GKE фиксирует полностью загруженное состояние вместе с памятью CPU и GPU и сохраняет его в Cloud Storage с высокой пропускной способностью, а новые реплики восстанавливаются прямо из него.
Восстановление не мгновенное. Сначала возвращается ядро gVisorпесочница-рантайм, изолирующая контейнер от ядра хоста, обычно за несколько секунд, и приложение начинает работу, пока его память ещё догружается в фоне. То есть готовность приложения наступает раньше, чем память загружена целиком.
Доступ к снимку опирается на Workload Identity Federationмеханизм выдачи рабочих нагрузок учётных данных без долгоживущих ключей и IAM-привязки для service account каждого пода — по замечанию Google, они могут требовать времени на распространение. Это ещё одна причина, по которой восстановление не мгновенно.
Как подбирается снимок
GKE строит хеш из существенных runtime-полей пода — так называемой distilled Pod spec — и встраивает его в снимок. Восстанавливаемый под должен дать идентичный хеш. Целевой узел обязан совпадать по machine series и архитектуре CPU (N2 к N2, G2 к G2), а версии ядра gVisor и GPU-драйвера — совпадать с зафиксированными. Если совместимого снимка нет, под запускается обычным образом.
Совместимость определяется и другими правилами: порядком выбора и критериями соответствия. Чтобы GKE использовал конкретный снимок, ресурс PodSnapshot должен иметь статус-условие Ready и находиться в том же пространстве имён, что и под; иначе рабочая нагрузка выполняет холодный старт.
Предыстория: чем заменяли холодный старт
Каждая новая реплика независимо скачивает веса модели и загружает их в память ускорителя, а для моделей с десятками миллиардов параметров этот шаг часто составляет большую часть времени запуска. Инженеры прибегали к избыточному резервированию дорогой инфраструктуры или строили кастомные системы восстановления состояния на уровне приложения.
Пример — Codeway с платформой Retake. У них был собственный слой кэширования скомпилированных артефактов, сокращавший запуск до одной минуты, но он добавлял значительные накладные расходы на сопровождение и всё ещё ограничивал агрессивное автомасштабирование. Замена этой сложности на GKE Pod snapshots снизила задержку запуска до 8 секунд на GPU A3 H100. Теперь H100 поднимаются под конкретную задачу дообучения или инференса и сразу выключаются после завершения, что снижает расходы на простаивающие GPU и упрощает кодовую базу.
Почему это сделали
Проблема в линейном штрафе при масштабировании: каждая новая реплика независимо тянет веса и грузит их в память ускорителя. Задержка запуска ухудшает пользовательский опыт и мешает быстрому автомасштабированию при всплесках трафика.
Для агентных воркфлоу картина другая: изоляция недоверенного кода и команд от LLM означает одну песочницу на пользователя или отдельный воркфлоу, и здесь и задержка запуска, и простаивающие песочницы ведут к значительному избыточному выделению и недоиспользованию ресурсов.
Google обосновывает решение уровнем lifecycle-менеджментауправление жизненным циклом объектов через декларативные ресурсы кластера: политика через Pod snapshot CRDs определяет, какие поды снимать и где хранить данные, и обрабатывает жизненный цикл хранения и управления. Снимки можно снимать на любом этапе — при старте рабочей нагрузки по сигналу или во время жизненного цикла пода по on-demand триггеру.
Цифры
Google сообщает о снижении задержки запуска вплоть до 89% для больших моделей вроде llama3-70b. Модель на 70B параметров загружается за 37 секунд, модель на 8B — за 15 секунд. InfoQ приводит те же цифры. Отдельно упоминается ускорение в 45 раз для GKE Agent Sandbox в контексте agentic RL и evaluation research.
Для генеративного ИИ это означает, что инициализацию — загрузку весов модели в память ускорителя — выполняют один раз для создания начального снимка, а новые реплики восстанавливаются прямо из этого состояния, минуя фазу инициализации.
Ограничения
Восстановление не мгновенное: ядро gVisor возвращается первым, обычно в течение нескольких секунд, приложение начинает работу, а память ещё грузится в фоне.
Аппаратная поддержка уже, чем кажется: снапшоты целых подов не работают на типах машин E2, поды с несколькими GPU поддерживаются только на GPU L4, а совместное использование GPU через Multi-Instance GPUрежим разделения одного физического GPU между несколькими рабочими нагрузками не поддерживается.
Что остаётся за приложением и требует ручного вмешательства
Управление жизненным циклом снимков частично автоматизировано: агент на каждой ноде обрабатывает жизненный цикл снимка, а контроллер на плоскости управления удаляет устаревшие. Но часть работы остаётся на разработчике.
Рехидратацияповторное приведение восстановленного процесса в рабочее состояние: всё, что было создано до снимка и не переживает заморозку, нужно создать заново — за приложением. Ключи шифрования и сертификаты, созданные до снимка, должны быть пересозданы после, поскольку восстановленный процесс возобновляется с тем, что держал в момент заморозки. Переменные окружения живут в памяти приложения, где gVisor не может надёжно их найти и заменить, поэтому рабочей нагрузке, зависящей от новых значений, приходится считывать их заново после восстановления. Внешние соединения разрываются при восстановлении, постоянные тома не чекпоинтятся, а пользовательские правила iptables или nftables и маршруты не восстанавливаются.
Инвалидация при обновлении окружения остаётся нерешённой. При обновлении пула нод версия ядра gVisor или драйвера GPU может измениться, существующие снимки перестают совпадать, под запускается обычным путём — и выгода просто исчезает, без ошибок.
Удаление политики требует ручного шага:
kubectl delete podsnapshotpolicies.podsnapshot.gke.io SNAPSHOT_POLICY --namespace=NAMESPACEРаботающие поды при удалении политики не затрагиваются, но если удалить её, пока под сохраняется или восстанавливается, он может перейти в состояние отказа.