Kubernetes
Теория: Резервное копирование и восстановление
Данные в Kubernetes живут в PersistentVolume. Pod приходят и уходят, но данные остаются — пока не случится сбой диска, ошибка оператора или атака. Без резервных копий вы узнаете о проблеме, когда данные уже потеряны.
В этом уроке разберём три подхода к резервному копированию: VolumeSnapshot для моментальных снимков на уровне хранилища, CronJob для регулярных бэкапов на уровне приложения, и Velero для резервного копирования всего кластера.
Зачем нужны бэкапы в Kubernetes
Kubernetes обеспечивает высокую доступность приложений — если Pod упал, создаётся новый. Но это не защищает данные:
- Ошибка в коде — приложение удалило или повредило данные
- Человеческая ошибка — кто-то выполнил
kubectl delete pvcне в том namespace - Сбой хранилища — диск вышел из строя, облачный провайдер потерял данные
- Ransomware — злоумышленник зашифровал данные
StatefulSet и PVC не спасут от этих проблем. Нужны резервные копии, которые хранятся отдельно от основных данных.
VolumeSnapshot: снимки на уровне хранилища
VolumeSnapshot — это моментальный снимок PVC. Он создаётся на уровне хранилища, быстро и без остановки приложения.
Как это работает:
- Вы создаёте объект VolumeSnapshot
- CSI-драйвер хранилища создаёт снимок диска
- Снимок можно использовать для восстановления или создания нового PVC
Проверьте, поддерживает ли ваш кластер VolumeSnapshot:
Если команда вернула список — снапшоты поддерживаются. Если ошибка «the server doesn't have a resource type» — нужно установить CSI-драйвер с поддержкой снапшотов.
В облаках (GKE, EKS, AKS) VolumeSnapshot обычно работает из коробки. В minikube нужно включить CSI-драйвер:
Создание VolumeSnapshotClass:
Создание снимка PVC:
Снимок создаётся за секунды, независимо от размера данных — это copy-on-write на уровне хранилища.
Восстановление из снимка:
Создайте новый PVC из снимка:
Теперь можно запустить Pod с восстановленным PVC и проверить данные.
Ограничения VolumeSnapshot:
- Работает только с CSI-драйверами, которые поддерживают снапшоты
- Снимок хранится в том же хранилище — если хранилище умрёт, снимки тоже
- Не все типы хранилищ поддерживают (например, NFS обычно не поддерживает)
- Снимок может быть неконсистентным, если приложение активно пишет данные
Для консистентного снимка базы данных лучше сначала выполнить CHECKPOINT или остановить запись.
CronJob: бэкапы на уровне приложения
VolumeSnapshot делает снимок диска «как есть». Но для базы данных лучше использовать её родные инструменты — pg_dump, mysqldump, mongodump. Они создают логический бэкап, который гарантированно консистентен.
CronJob запускает Pod по расписанию. Идеально для регулярных бэкапов.
Бэкап PostgreSQL:
Разберём ключевые моменты:
schedule: "0 2 * * *"— cron-формат: минута, час, день месяца, месяц, день недели. Это «каждый день в 02».concurrencyPolicy: Forbid— если предыдущий бэкап ещё выполняется, новый не запустится. Защита от накопления параллельных задач.set -e— скрипт остановится при первой ошибке. Без этого ошибка pg_dump останется незамеченной.gzip— сжатие экономит место. SQL-дампы сжимаются в 5-10 раз.find ... -mtime +7 -delete— ротация: удаляем файлы старше 7 дней, чтобы не переполнить диск.
Проверка работы CronJob:
Отправка бэкапов во внешнее хранилище:
Хранить бэкапы в том же кластере — плохая идея. Если кластер умрёт, бэкапы умрут вместе с ним. Отправляйте бэкапы в S3, GCS или другое внешнее хранилище:
В production лучше использовать готовый образ с awscli, а не устанавливать его каждый раз.
Velero: бэкап всего кластера
VolumeSnapshot и CronJob работают с отдельными PVC. Но что если нужно забэкапить весь namespace или весь кластер? Deployment, Service, ConfigMap, Secret — всё это тоже нужно восстанавливать.
Velero — инструмент для резервного копирования ресурсов Kubernetes и данных PVC. Он может:
- Бэкапить все ресурсы в namespace или кластере
- Бэкапить данные PVC через Restic или CSI-снапшоты
- Восстанавливать в тот же или другой кластер
- Мигрировать приложения между кластерами
Установка Velero:
Установим Velero по инструкции. После установки проверим доступность:
Опции --use-node-agent и --default-volumes-to-fs-backup включают бэкап данных PVC через файловую систему (Restic/Kopia).
Создание бэкапа:
Восстановление:
Расписание бэкапов:
Velero в production
Velero — это стандарт для бэкапов Kubernetes в production. Он интегрируется с облачными провайдерами (AWS, GCP, Azure), поддерживает разные хранилища (S3, GCS, Azure Blob, MinIO), и может использовать CSI-снапшоты для быстрых бэкапов.
Основные сценарии использования:
- Disaster recovery — восстановление после потери кластера
- Миграция — перенос приложений между кластерами
- Клонирование окружений — создание staging из production
Какой подход выбрать
В production обычно комбинируют:
- VolumeSnapshot для быстрого отката (минуты)
- CronJob для ежедневных бэкапов БД в S3 (консистентность)
- Velero для полного бэкапа кластера (disaster recovery)
Частые ошибки
- Бэкапы в том же кластере — если кластер умрёт, бэкапы умрут вместе с ним. Отправляйте бэкапы во внешнее хранилище (S3, GCS).
- Не тестируют восстановление — бэкап бесполезен, если из него нельзя восстановиться. Регулярно проверяйте, что восстановление работает.
- Нет ротации — диск переполняется старыми бэкапами. Настройте удаление старых файлов или TTL в Velero.
- Бэкап работающей БД без CHECKPOINT — VolumeSnapshot может поймать неконсистентное состояние. Для критичных данных используйте pg_dump или останавливайте запись.
- Секреты в логах CronJob — не выводите пароли в echo. Используйте переменные окружения, а не аргументы командной строки.
Что запомнить
- VolumeSnapshot — быстрые снимки на уровне хранилища. Требует CSI-драйвер с поддержкой снапшотов.
- CronJob — регулярные задачи по расписанию. Идеально для pg_dump/mysqldump.
- Velero — бэкап всего кластера. Стандарт для disaster recovery в production.
- Бэкапы во внешнее хранилище — обязательно. Бэкап в том же кластере — не бэкап.
- Тестируйте восстановление — бэкап без проверки восстановления — это иллюзия безопасности.


