Kubernetes: хранилище
Тома, PersistentVolume/PVC и StorageClass, статическое и динамическое выделение, access modes и reclaim policy, CSI и хранилище StatefulSet.
8 вопросов
JuniorТеорияОчень частоЧем PersistentVolume отличается от PersistentVolumeClaim и как они связываются?
Чем PersistentVolume отличается от PersistentVolumeClaim и как они связываются?
PersistentVolume (PV) — ресурс хранилища уровня кластера, сам диск. PersistentVolumeClaim (PVC) — namespaced-запрос на размер и access mode. Pod ссылается на PVC; Kubernetes связывает его с подходящим PV и монтирует том.
Типичные ошибки
- ✗Думать, что PVC — это диск, а PV — запрос: всё наоборот
- ✗Считать PV namespaced, как PVC, а не ресурсом уровня кластера
- ✗Монтировать PV в Pod напрямую, а не ссылаться на PVC
Уточняющие вопросы
- →Что происходит с PVC, не нашедшим подходящего PV для связывания?
- →Могут ли два Pod из разных namespace делить один PVC?
JuniorТеорияЧастоЧто такое StorageClass и чем динамическое выделение отличается от статического?
Что такое StorageClass и чем динамическое выделение отличается от статического?
StorageClass — шаблон, задающий provisioner и его параметры (тип диска, зону). Статическое выделение — админ заранее создаёт PV вручную. Динамическое — PVC со ссылкой на StorageClass запускает provisioner, создающий PV по требованию, так что диски заранее готовить не нужно.
Типичные ошибки
- ✗Думать, что StorageClass сам хранит данные, а не задаёт provisioner
- ✗Считать, что динамическое выделение всё равно требует заранее созданных PV
- ✗Путать статическое (PV от админа) с динамическим (PV от provisioner)
Уточняющие вопросы
- →Что будет с PVC, если в кластере нет StorageClass по умолчанию?
- →Откуда берутся параметры StorageClass — тип диска и зона?
JuniorТеорияЧастоКакие бывают типы томов (emptyDir, hostPath, configMap, PVC) и какова их продолжительность жизни?
Какие бывают типы томов (emptyDir, hostPath, configMap, PVC) и какова их продолжительность жизни?
emptyDir — временное пространство, привязанное к Pod, стирается при удалении Pod. hostPath монтирует каталог узла (node-local). configMap и secret проецируют конфиг как read-only файлы. Том на базе PVC постоянный и переживает Pod. Срок жизни зависит от типа.
Типичные ошибки
- ✗Считать, что emptyDir переживает удаление Pod, как PVC
- ✗Использовать hostPath в переносимых нагрузках, привязывая Pod к узлу
- ✗Думать, что configMap — записываемое хранилище, а не read-only проекция
Уточняющие вопросы
- →Почему hostPath не рекомендуют в мультинодовых кластерах?
- →Как разделить файлы между контейнерами одного Pod?
MiddleТеорияЧастоЧто означают access modes RWO, ROX и RWX и что ограничивает RWX на практике?
Что означают access modes RWO, ROX и RWX и что ограничивает RWX на практике?
RWO (ReadWriteOnce) — read-write монтирует один узел; несколько Pod на нём его делят. ROX (ReadOnlyMany) — много узлов read-only. RWX (ReadWriteMany) — много узлов read-write. Режимы действуют на уровне узла, а не Pod. RWX требует сетевую ФС вроде NFS; блочные тома чаще дают только RWO.
Типичные ошибки
- ✗Читать RWO как один Pod, а не один узел с read-write
- ✗Считать, что любой том поддерживает RWX без сетевой ФС
- ✗Думать, что режимы действуют на уровне Pod, а не узла
Уточняющие вопросы
- →Почему два Pod на одном узле делят RWO-том, а на разных — нет?
- →Какие бэкенды хранилища реально дают RWX?
MiddleДебаггингЧастоPod не стартует, потому что его PVC застрял в Pending — диагностируйте и почините
Pod не стартует, потому что его PVC застрял в Pending — диагностируйте и почините
Pending у PVC значит, что он не связался: выделение не удовлетворило claim. Событие describe — StorageClass fast-ssd не найден, provisioner не запустился. Причины: нет дефолтного StorageClass или подходящего PV. Фикс — указать существующий StorageClass или дефолтный.
Открыть задачу →Типичные ошибки
- ✗Винить Pod или образ, когда событие указывает на выделение хранилища
- ✗Игнорировать события describe, которые называют точную причину сбоя
- ✗Считать, что Pending PVC свяжется сам без валидного StorageClass
Уточняющие вопросы
- →Как изменилась бы диагностика, если бы события ProvisioningFailed не было вовсе?
- →Как пометить StorageClass как дефолтный для кластера?
MiddleТеорияЧастоКак StatefulSet даёт каждой реплике свой стабильный PVC через volumeClaimTemplates?
Как StatefulSet даёт каждой реплике свой стабильный PVC через volumeClaimTemplates?
Блок volumeClaimTemplates заставляет StatefulSet создавать по одному PVC на реплику, именуя по ординалу (data-web-0). Каждый Pod сохраняет свой прилипший PVC при переносах и рестартах, так что идентичность и данные реплики держатся вместе, в отличие от Deployment.
Типичные ошибки
- ✗Думать, что реплики StatefulSet делят один PVC, как Deployment
- ✗Считать, что per-replica PVC пересоздаётся пустым при каждом переносе
- ✗Считать порядковые имена PVC косметикой, а не устойчивой идентичностью
Уточняющие вопросы
- →Что происходит с per-replica PVC при уменьшении StatefulSet?
- →Почему StatefulSet нужен headless Service рядом с хранилищем?
MiddleТеорияИногдаЧто такое CSI и почему Kubernetes вынес драйверы хранилища из ядра?
Что такое CSI и почему Kubernetes вынес драйверы хранилища из ядра?
CSI (Container Storage Interface) — стандартный gRPC-API, позволяющий вендорам поставлять драйверы как Pod и релизить независимо от Kubernetes. In-tree драйверы вкомпилированы в ядро, поэтому фикс ждал релиза. CSI их развязывает, открывая снапшоты и расширение.
Типичные ошибки
- ✗Думать, что CSI-драйверы всё ещё вкомпилированы в бинарь Kubernetes
- ✗Считать CSI только облачным, а не открытым вендор-нейтральным API
- ✗Считать, что in-tree драйверы имели независимый цикл релизов
Уточняющие вопросы
- →Как CSI-драйвер регистрируется в kubelet на каждом узле?
- →Какие возможности открыл CSI, которых не было у in-tree драйверов?
MiddleТеорияИногдаЧто делают reclaim policy Retain, Delete и Recycle при удалении PVC?
Что делают reclaim policy Retain, Delete и Recycle при удалении PVC?
Reclaim policy решает судьбу PV после удаления связанного PVC. Delete удаляет PV и его диск — реальный риск потери данных. Retain сохраняет PV и данные со статусом Released для ручного восстановления. Recycle (устарел) очищал и переиспользовал том. Динамические PV по умолчанию Delete.
Типичные ошибки
- ✗Считать дефолтом Retain, когда динамические PV по умолчанию Delete
- ✗Думать, что Delete лишь размонтирует, а не уничтожает диск
- ✗Считать Recycle актуальным — он устарел и удалён
Уточняющие вопросы
- →Как безопасно переключить связанный PV с Delete на Retain?
- →После того как Retain освободил PV, как перепривязать его данные к новому PVC?