Хранилище: как сохранить и восстановить данные
Узнай, где живут файлы контейнера, почему запрос диска может ждать и как отличить сохранение после перезапуска от настоящего восстановления.
Ещё не начатГде выполнять задания
Через терминал создаются два маленьких учебных тома в kaas-storage. Это ручная практика без серверного зачёта; общая лаборатория interview-lab не используется.
Открыть практикум и терминал ↗Читай урок в этой вкладке, команды выполняй в соседней. Подстановки в угловых скобках сначала замени своими значениями. Ctrl+C останавливает наблюдение или учебный сервер.
Сокращения этого модуля: расшифровки и смысл
- CSI
- Container Storage Interface — интерфейс подключения хранилищ контейнеров
- KaaS
- Kubernetes as a Service — Kubernetes как услуга
- PV
- PersistentVolume — постоянный том
- PVC
- PersistentVolumeClaim — запрос постоянного тома
- RPO
- Recovery Point Objective — допустимый промежуток потери данных
- RTO
- Recovery Time Objective — целевое время восстановления
В командах сохраняется точное написание параметров и имён. В тексте сокращения раскрываются в скобках.
Результат модуля
- Объяснить связь StorageClass, PVC (PersistentVolumeClaim — запрос постоянного тома), PV (PersistentVolume — постоянный том) и ноды.
- Сохранить файл после замены Pod и восстановить его на другой том.
- Определить границы local-path, измерить восстановление и описать удаление.
Перед началом: Приложения: запуск, ресурсы и обновление.
1. Где находятся данные
Файл в записываемом слое контейнера может исчезнуть при его замене. emptyDir переживает перезапуск контейнера в том же Pod, но удаляется вместе с Pod. Для данных с отдельным жизненным циклом приложение подключает том.
PVC (PersistentVolumeClaim — запрос постоянного тома) говорит, какое хранилище нужно приложению. PV (PersistentVolume — постоянный том) представляет предоставленное хранилище. StorageClass описывает способ выделения. CSI (Container Storage Interface — интерфейс подключения хранилищ контейнеров) позволяет драйверу связать эти объекты с конкретной системой хранения.
На нашей лабе есть local-path: данные остаются на диске одной ноды. Режим WaitForFirstConsumer откладывает выделение до появления подходящего Pod. Поэтому Pending у нового запроса до запуска потребителя бывает нормальным. Но локальный том не превращается в общий диск и не переживает потерю ноды автоматически.
- StorageClass
- Правила и способ выделения хранилища.
- Bound
- Запрос хранилища связан с предоставленным томом.
- StatefulSet
- Контроллер экземпляров со стабильными именами и связью с томами.
- Retain
- Политика сохранения выделенного хранилища для отдельной обработки.
По шагам
- Записали lesson-storage-v1 на первый том.
- Заменили Pod: проверили повторное подключение того же тома.
- Вынесли копию в отдельный файл и восстановили второй том: проверили другой механизм.
2. Что гарантирует StatefulSet
StatefulSet создаёт устойчивые имена экземпляров и отдельные запросы томов из шаблона. Это удобно для программы, которой важно отличать первый экземпляр от второго. Репликация данных, выбор лидера и восстановление базы остаются задачами приложения или его специализированного оператора.
Проверка сохранности начинается с известного значения: запиши строку, замени Pod, прочитай строку снова. Это доказывает повторное подключение того же тома. Для проверки резервной копии нужен другой опыт: новый том, восстановление из отдельного файла и сравнение содержимого.
В практике ниже используется простой файл, а не работающая база данных. Поэтому согласованность легко проверить. Копирование каталога активной базы без её штатного механизма резервирования может дать непригодный результат. Для реального продукта выбирай способ копирования по типу данных.
3. Резервная копия полезна после проверки
RPO (Recovery Point Objective — допустимый промежуток потерянных данных) отвечает: сколько последних изменений можно потерять. RTO (Recovery Time Objective — целевое время восстановления) отвечает: сколько можно восстанавливаться. Если копия делается раз в сутки, обещание нулевой потери данных само по себе не возникает.
Snapshot — снимок состояния хранилища. Он не обязательно согласован с приложением и может зависеть от той же системы, которая сломалась. Отдельная копия должна иметь понятное местоположение, доступ и срок хранения. В лаборатории файл на домашнем каталоге — учебный перенос, а не доказанная защита от отказа физического сервера.
Измеряй восстановление от начала обнаружения проблемы до успешной проверки данных. Запиши, сколько заняли подготовка, перенос и проверка. Секреты и ключи шифрования нужны для восстановления отдельно: один архив без ключа может быть бесполезен.
4. Кто отвечает за удаление
Политика reclaimPolicy указывает, что делать с выделенным томом после удаления запроса. Delete обычно удаляет и хранилище; Retain оставляет его для отдельной обработки. Это не универсальное поведение StatefulSet при удалении: проверь также политику сохранения его запросов томов.
Для KaaS (Kubernetes as a Service — Kubernetes как услуга) договорись, кто делает прикладные копии и что происходит при удалении кластера. Сохранённый диск без владельца продолжает занимать место и может содержать чужие данные. Нужны учёт, срок хранения и порядок выдачи доступа.
Cinder в OpenStack предоставляет блочные тома, но его наличие и работоспособность в нашей лабе ещё нужно подтвердить. Локальное упражнение не доказывает подключение Cinder, расширение томов или перенос между зонами. Записывай эти пункты отдельными непроверенными требованиями.
Практика через терминал портала
Открой терминал и проверь класс
Работаем в отдельном учебном namespace kaas-storage. В interview-lab диски запрещены квотой; там это упражнение не запускается. Команды не меняют StorageClass.
kubectl get storageclass kubectl get namespace kaas-storageЧто должно получиться. Есть local-path с WaitForFirstConsumer. Отсутствие нового namespace до подготовки ожидаемо.
Если результат отличается
Если local-path отсутствует, остановись: манифест рассчитан на него, не назначай другой класс наугад.
Создай ограниченную учебную область
Скачанный манифест содержит только namespace kaas-storage, его ограничения и два маленьких запроса томов. Сначала прочитай его.
curl -fSLo /tmp/kaas-storage.yaml https://test.igorhome.ru/static/learning/storage-lab.yaml cat /tmp/kaas-storage.yaml kubectl apply -f /tmp/kaas-storage.yaml kubectl -n kaas-storage get pvcЧто должно получиться. Два запроса по 64Mi ждут потребителей. Суммарный лимит запросов — 128Mi. Это ограничение заявленного размера, не обязательно жёсткая квота файловой системы local-path.
Если результат отличается
Если namespace уже содержит чужие данные, не продолжай. Удали только своё старое упражнение после проверки владельца.
Запусти два потребителя
Файл создаёт source и restored с одинаковыми ограничениями и разными томами. Это обычные учебные Pod, чтобы было видно каждое подключение.
kubectl apply -f https://test.igorhome.ru/static/learning/storage-pods.yaml kubectl -n kaas-storage wait --for=condition=Ready pod/source pod/restored --timeout=120s kubectl -n kaas-storage get pods -o wide kubectl -n kaas-storage get pvcЧто должно получиться. Оба Pod Ready, оба запроса Bound. В describe тома видна связь с нодой.
Если результат отличается
При Pending прочитай describe Pod и PVC (PersistentVolumeClaim — запрос постоянного тома). Не стирай том и не меняй bindingMode общего класса.
Запиши данные и замени Pod
Создай только учебный файл, удали source и заново примени тот же манифест. Его запрос тома остаётся.
kubectl -n kaas-storage exec source -- sh -c 'echo lesson-storage-v1 > /data/message.txt' kubectl -n kaas-storage delete pod source kubectl apply -f https://test.igorhome.ru/static/learning/storage-pods.yaml kubectl -n kaas-storage wait --for=condition=Ready pod/source --timeout=120s kubectl -n kaas-storage exec source -- cat /data/message.txtЧто должно получиться. Строка lesson-storage-v1 сохранилась после замены Pod.
Если результат отличается
Если файл исчез, сравни claimName и имя тома. Этот опыт не требует выключения ноды.
Сделай отдельную копию
Приложение не меняет файл, поэтому простая копия согласована. Храни её в закрытом каталоге текущего пользователя.
umask 077 mkdir -p ~/kaas-learning/storage kubectl -n kaas-storage exec source -- cat /data/message.txt > ~/kaas-learning/storage/message.backup sha256sum ~/kaas-learning/storage/message.backupЧто должно получиться. Есть непустая копия и её контрольная сумма. Она находится вне учебного тома.
Если результат отличается
Проверь код завершения exec и размер файла; пустой файл после ошибки не является копией.
Восстанови на другой том
Запиши время начала в журнале. Передай файл в restored через стандартный ввод и прочитай его обратно.
date -Is kubectl -n kaas-storage exec -i restored -- sh -c 'cat > /data/message.txt' < ~/kaas-learning/storage/message.backup kubectl -n kaas-storage exec restored -- cat /data/message.txt kubectl -n kaas-storage exec restored -- sha256sum /data/message.txt date -IsЧто должно получиться. Содержимое и контрольная сумма совпали. Время переноса записано отдельно от полной цели восстановления.
Если результат отличается
Не используй исходный том в restored: это проверяло бы повторное подключение, а не восстановление.
Найди границу отказа
Прочитай описание двух запросов и созданных PV (PersistentVolume — постоянный том). Не выключай общие ноды. Отметь, что произойдёт с local-path при потере диска ноды.
kubectl -n kaas-storage describe pvc source restored kubectl get pv -o wideЧто должно получиться. Есть запись о размещении и политике Delete. Критерий топологии подтверждён конфигурацией, физический отказ не проверялся.
Если результат отличается
Не меняй reclaimPolicy у чужих PV (PersistentVolume — постоянный том) и не выдавай учебный перенос за межсерверное резервирование.
Очисти только учебные данные
После сохранения доказательств удаление namespace удалит учебные PVC (PersistentVolumeClaim — запрос постоянного тома). Копия в домашнем каталоге останется. Решение об удалении копии принимай отдельно.
kubectl delete namespace kaas-storage --wait=true --timeout=120sЧто должно получиться. Учебная область удалена; проверь, что связанные PV (PersistentVolume — постоянный том) тоже исчезли согласно Delete. Запиши наблюдение и ответственных за будущие копии.
Если результат отличается
Если удаление зависло, исследуй finalizers и состояние драйвера. Не снимай защиту принудительно.
Открыть терминал ↗ · Скачать файлы лаборатории →
Файлы и подготовка к этой работе
Критерии готовности
Отмечай только то, что проверил на указанном стенде. Эти галочки сохраняются в браузере. Для готовых упражнений зачёт выдаёт отдельная серверная проверка практикума; остальные задания подтверждай журналом и доказательствами. Учебная модель не заменяет реальный облачный опыт.
Что сохранить в портфолио
- Журнал: исходное состояние → команда или действие → ожидаемый результат → фактическое наблюдение.
- Доказательства по критериям ниже: очищенный от секретов вывод, схема или ссылка на проверенный коммит.
- Отдельный список: что пока не запускалось, почему и какой стенд нужен для продолжения.
Проверь понимание
8 вопросов по этому модулю. Проходной результат — 7 из 8. После ответа — объяснения и ссылки на разделы, к которым стоит вернуться.
Пройти тест модуляОфициальные источники
Чек-листы уроков, заметки к ним и результаты тестов хранятся в этом браузере; для переноса используй экспорт. Автоматические проверки и журнал практикума сохраняются отдельно на сервере.