тренажёр собеседований
← Маршрут обучения
модуль 4 / 12 · Инженер Kubernetes · 12 часов

Хранилище: как сохранить и восстановить данные

Узнай, где живут файлы контейнера, почему запрос диска может ждать и как отличить сохранение после перезапуска от настоящего восстановления.

Ещё не начат
практика · через терминал портала

Где выполнять задания

Через терминал создаются два маленьких учебных тома в 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
Политика сохранения выделенного хранилища для отдельной обработки.

По шагам

  1. Записали lesson-storage-v1 на первый том.
  2. Заменили Pod: проверили повторное подключение того же тома.
  3. Вынесли копию в отдельный файл и восстановили второй том: проверили другой механизм.

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, расширение томов или перенос между зонами. Записывай эти пункты отдельными непроверенными требованиями.

практика · 12 часов вместе с теорией и тестом

Практика через терминал портала

  1. Открой терминал и проверь класс

    Работаем в отдельном учебном namespace kaas-storage. В interview-lab диски запрещены квотой; там это упражнение не запускается. Команды не меняют StorageClass.

    kubectl get storageclass
    kubectl get namespace kaas-storage

    Что должно получиться. Есть local-path с WaitForFirstConsumer. Отсутствие нового namespace до подготовки ожидаемо.

    Если результат отличается

    Если local-path отсутствует, остановись: манифест рассчитан на него, не назначай другой класс наугад.

  2. Создай ограниченную учебную область

    Скачанный манифест содержит только 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 уже содержит чужие данные, не продолжай. Удали только своё старое упражнение после проверки владельца.

  3. Запусти два потребителя

    Файл создаёт 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 общего класса.

  4. Запиши данные и замени 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 и имя тома. Этот опыт не требует выключения ноды.

  5. Сделай отдельную копию

    Приложение не меняет файл, поэтому простая копия согласована. Храни её в закрытом каталоге текущего пользователя.

    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 и размер файла; пустой файл после ошибки не является копией.

  6. Восстанови на другой том

    Запиши время начала в журнале. Передай файл в 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: это проверяло бы повторное подключение, а не восстановление.

  7. Найди границу отказа

    Прочитай описание двух запросов и созданных PV (PersistentVolume — постоянный том). Не выключай общие ноды. Отметь, что произойдёт с local-path при потере диска ноды.

    kubectl -n kaas-storage describe pvc source restored
    kubectl get pv -o wide

    Что должно получиться. Есть запись о размещении и политике Delete. Критерий топологии подтверждён конфигурацией, физический отказ не проверялся.

    Если результат отличается

    Не меняй reclaimPolicy у чужих PV (PersistentVolume — постоянный том) и не выдавай учебный перенос за межсерверное резервирование.

  8. Очисти только учебные данные

    После сохранения доказательств удаление namespace удалит учебные PVC (PersistentVolumeClaim — запрос постоянного тома). Копия в домашнем каталоге останется. Решение об удалении копии принимай отдельно.

    kubectl delete namespace kaas-storage --wait=true --timeout=120s

    Что должно получиться. Учебная область удалена; проверь, что связанные PV (PersistentVolume — постоянный том) тоже исчезли согласно Delete. Запиши наблюдение и ответственных за будущие копии.

    Если результат отличается

    Если удаление зависло, исследуй finalizers и состояние драйвера. Не снимай защиту принудительно.

Открыть терминал ↗ · Скачать файлы лаборатории →

Файлы и подготовка к этой работе

Критерии готовности

Отмечай только то, что проверил на указанном стенде. Эти галочки сохраняются в браузере. Для готовых упражнений зачёт выдаёт отдельная серверная проверка практикума; остальные задания подтверждай журналом и доказательствами. Учебная модель не заменяет реальный облачный опыт.

Что сохранить в портфолио

  • Журнал: исходное состояние → команда или действие → ожидаемый результат → фактическое наблюдение.
  • Доказательства по критериям ниже: очищенный от секретов вывод, схема или ссылка на проверенный коммит.
  • Отдельный список: что пока не запускалось, почему и какой стенд нужен для продолжения.
закрепление

Проверь понимание

8 вопросов по этому модулю. Проходной результат — 7 из 8. После ответа — объяснения и ссылки на разделы, к которым стоит вернуться.

Пройти тест модуля

Официальные источники

Чек-листы уроков, заметки к ним и результаты тестов хранятся в этом браузере; для переноса используй экспорт. Автоматические проверки и журнал практикума сохраняются отдельно на сервере.