Storage и данные
Что нужно знать перед уроком
- M10.06 — PDB для Application — продолжение серии тем Production Operations
- M1.06 — Volumes/PVC/StorageClass — нужна базовая модель StorageClass перед разбором ReplicatedStorageClass Deckhouse
Что нужно знать перед уроком
M1 урок 6 — базовая модель StorageClass. Этот урок обзорно разбирает типы StorageClass в Deckhouse и специфичный для платформы ReplicatedStorageClass.
Теория
Напоминание: reclaimPolicy и volumeBindingMode
Как разобрано ранее в курсе: reclaimPolicy: Delete (дефолт для большинства динамических StorageClass) уничтожает физические данные вместе с PersistentVolume при удалении PersistentVolumeClaim; reclaimPolicy: Retain, выставленный вручную, сохраняет данные, отсоединяя PersistentVolume от PersistentVolumeClaim, но не удаляя их — ключевой механизм защиты данных, уже встречавшийся в M6 уроке 7. volumeBindingMode: Immediate провижинирует том сразу при создании PVC (может привести к unschedulable Pod при топологических ограничениях диска — например, локальный диск существует только на конкретном узле, а Pod запланирован на другой); WaitForFirstConsumer откладывает провижининг до момента, когда планировщик уже выбрал узел для Pod — обязателен для локальных дисков.
ReplicatedStorageClass — уровни репликации Deckhouse
| |
ReplicatedStorageClass — специфичный для Deckhouse тип StorageClass, обеспечивающий репликацию данных между узлами на уровне самого хранилища (в отличие от репликации на уровне приложения — например, встроенной репликации PostgreSQL). Три уровня replication:
| Уровень | Смысл | Когда выбирать |
|---|---|---|
None | Без репликации, данные на одном узле | Некритичные данные, где потеря узла = потеря данных приемлема (кэш, временные файлы) |
Availability | Репликация для повышения доступности, без строгих гарантий консистентности при сетевых разделениях | Большинство БД-зависимых приложений — баланс доступности и производительности |
ConsistencyAndAvailability | Репликация с более строгими гарантиями консистентности (кворумная запись) | Критичные БД, где рассинхронизация реплик после сетевого разделения недопустима |
Какой уровень репликации выбрать для БД-зависимого Application
Для типового Application, зависящего от managed-postgres/подобного Module (M6), сама реплицируемость данных обычно уже обеспечена на уровне Module (managed-сервис PostgreSQL, как правило, сам управляет своей репликацией через собственный StatefulSet+Patroni/подобный механизм) — конечному Application-разработчику часто не нужно напрямую создавать ReplicatedStorageClass для данных СУБД, это ответственность Module. Однако если Application сам управляет собственным персистентным хранилищем (например, для файлов, загружаемых пользователями, не относящихся к БД), выбор уровня репликации становится прямой ответственностью разработчика — здесь Availability обычно достаточен для большинства сценариев, а ConsistencyAndAvailability оправдан только для данных, где даже кратковременная рассинхронизация после сетевого сбоя неприемлема.
Частые ошибки и подводные камни
- Использовать
replication: Noneдля критичных пользовательских данных «по умолчанию», не задумываясь о последствиях. Потеря единственного узла с диском без репликации означает необратимую потерю данных — уровеньNoneподходит только для действительно некритичных, легко восстановимых данных. - Выбирать
ConsistencyAndAvailabilityвезде «для надёжности» без учёта trade-off по производительности. Более строгие гарантии консистентности обычно означают более высокую задержку записи (кворумное подтверждение) — избыточно строгий уровень для некритичных данных неоправданно снижает производительность. - Дублировать репликацию, создавая собственный
ReplicatedStorageClassдля данных, уже реплицируемых на уровне зависимого Module (managed-БД). Это избыточно и может создавать путаницу в ответственности за консистентность данных — репликация СУБД обычно должна оставаться в зоне ответственности управляющего ей Module.
Практика в кластере
| |
Определите, какой StorageClass/ReplicatedStorageClass используется для PVC пакета Umami в вашем практическом кластере, и оцените, соответствует ли выбранный уровень репликации критичности данных этого PVC.
Практика разработки
Проведите ревизию всех PVC, объявленных в шаблонах пакета Umami — для каждого явно задокументируйте (в комментарии YAML) требуемый уровень репликации и обоснование выбора, опираясь на критичность конкретных данных (файлы аплоадов vs временный кэш).
Шпаргалка команд урока
| |
Полная сводная таблица kubectl/d8 k —
📋 kubectl
.
Вопросы для самопроверки
Более строгие гарантии обычно означают более высокую задержку записи.
Источник: Deckhouse — Replicatedstorageclass
Дублирование репликации на уровне Application избыточно и создаёт путаницу в ответственности.
Источник: Рекомендуемая литература
Репликация некритичных данных — неоправданные накладные расходы.
Источник: Deckhouse — Replicatedstorageclass
Immediate провижинирует том до выбора узла планировщиком, что может привести к конфликту.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
- Deckhouse — ReplicatedStorageClass (CRD модуля sds-replicated-volume)
- kubernetes.io — Persistent Volumes
- kubernetes.io — Storage Classes
Статьи и блоги
- Основные концепции сетевой архитектуры Kubernetes (Volumes, StorageClass) — Habr.
- Kubernetes на базе Deckhouse: встроенный мониторинг и логирование — обзор возможностей DKP на Habr.
Книги
- Brendan Burns, David Oppenheimer. Designing Distributed Systems. 2018. ISBN 978-1491983645.
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
Связанные материалы
- Предыдущий урок: M10.06 — PDB для Application.
- Следующий урок: M10.08 — Backup: что действительно бэкапится, а что нет.
✓ Урок пройден — все вопросы самопроверки отвечены верно