Постоянные тома и PVC

Обновлена 15 апреля 2024 г. в 08:50

Постоянные тома и PVC

Постоянный том (persistent volume, PV) предоставляет возможности для длительного хранения данных в кластерах Kubernetes. Данные, хранящиеся на PV, не теряются при сбое отдельного контейнера или пода целиком.

В рабочих нагрузках (workloads) нельзя использовать PV напрямую. Необходимо дополнительно создать Persistent Volume Claim (PVC), который позволяет запросить постоянный том с нужными параметрами и затем использовать его в рабочих нагрузках. Самые распространенные параметры, которые можно указать в PVC:

Объем хранилища (spec.resources.requests.storage).

Режим доступа (spec.accessModes) к тому.

Kubernetes поддерживает следующие режимы доступа к тому:

ReadWriteOnce (RWO): том может быть примонтирован в режиме «чтение и запись» одним узлом (node) кластера. Такой том может использоваться несколькими подами сразу, если все они размещены на одном узле, к которому примонтирован этот том.

ReadOnlyMany (ROX): том может быть примонтирован в режиме «только чтение» несколькими узлами кластера.

ReadWriteMany (RWX): том может быть примонтирован в режиме «чтение и запись» несколькими узлами кластера.

С помощью PVC можно запросить PV, который способен работать сразу в нескольких режимах, но при монтировании такого PV придется выбрать один из режимов. Например, если с помощью PVC запрошен PV с режимами RWO и RWX, будет доступно одно из действий:

либо примонтировать этот PV в режиме RWO одним узлом кластера;
либо примонтировать этот PV в режиме RWX несколькими узлами кластера;

Жизненный цикл PV и PVC не зависит от жизненного цикла подов и состоит из четырех последовательных этапов:

Подготовка (provisioning).
Связывание (binding).
Использование (using).
Освобождение (reclaiming).

Чтобы PV можно было запросить с помощью PVC, его нужно заранее подготовить одним из способов:

Статическая подготовка (static provisioning): PV создается вручную, например, администратором Kubernetes.
Динамическая подготовка (dynamic provisioning): PV создается автоматически после создания PVC.

Для динамической подготовки необходимо выполнение двух условий:

В кластере Kubernetes должны быть настроены классы хранения (storage classes). Кластеры Cloud Containers уже содержат преднастроенные классы хранения.

Для PVC не должно быть найдено подходящих PV, которые уже существуют.

В ходе динамической подготовки Kubernetes попытается создать PV, соотвествующий параметрам PVC. Будет использован один из классов хранения:

класс хранения, явно заданный в PVC;
класс хранения по умолчанию, если класс не задан в PVC явно.

В кластерах Cloud Containers класс хранения по умолчанию не настроен. Если вы не планируете явно задавать класс хранения в PVC, то перед созданием PVC выберите вручную класс хранения по умолчанию.

Для использования в рабочих нагрузках PV и PVC связываются по принципу «один к одному». Уже связанный PV нельзя использовать с другими PVC.

Когда в кластере Kubernetes появляется новый PVC:

Kubernetes пытается найти подходящий PV, который доступен для связывания (статус PV: Available) и максимально точно отвечает параметрам, заданным в PVC.

Если нет доступных PV, которые в точности соответствуют заданным в PVC параметрам, может быть выбран PV с избыточными характеристиками. Следите за доступными PV и создаваемыми PVC, чтобы не допустить ситуации, когда все PV большого объема связаны с PVC, которые запрашивают небольшие объемы хранилища. Место на таких PV будет расходоваться нерационально и они не будут доступны для связывания, когда в кластере появятся PVC, требующие большого объема хранилища.

Kubernetes выполняет одно из действий:

Если подходящий PV был найден, Kubernetes связывает его с PVC.
Если подходящий PV не был найден, то Kubernetes сначала пытается выполнить динамическую подготовку тома, а затем связать созданный PV с PVC.

PVC, с которым не удалось связать ни один PV, находится в состоянии Unbound. Рабочие нагрузки не могут работать с таким PVC в качестве тома. Kubernetes будет периодически пытаться связать такой PVC с новыми PV, если они появятся в кластере.

После того, как Kubernetes связал PVC с PV, этот PVC может использоваться рабочей нагрузкой как обычный том.

Когда PVC больше не нужен и удаляется, то к PV, связанному с этим PVC, применяется заданная политика освобождения (reclaim policy).

Политика задается одним из способов:

при создании постоянного тома вручную;
при установке класса хранения по умолчанию или установке класса хранения в PVC.

Доступные политики:

Оставить том (Retain).

Используйте эту политику для PV с важными данными, чтобы защитить данные при случайном удалении PVC. При необходимости можно вручную очистить и удалить такие тома вручную.

Удалить том (Delete).

В зависимости от выбранного типа PV также может быть удалено связанное с PV нижележащее хранилище.

В кластерах Cloud Containers выбранный тип хранилища влияет на доступные политики освобождения.