Может ли несколько PersistentVolumeClaims связываться с одним и тем же локальным хранилищем PersistentVolume?

Я хочу знать, возможно ли, что несколько PersistentVolumeClaims связаны с одним и тем же постоянным томом.

Мой вариант использования, если следующее: Я хочу создать Daemon Set, который будет записывать некоторые данные (фактически те же данные) на каждом узле в моем кластере (на локальном диске узла). Затем любой другой модуль, запланированный на любом узле, должен иметь возможность читать эти данные. По сути, это своего рода политика "однажды прочитал много" на уровне узла.

Я знаю, что могу сделать это, используя тип тома hostPath, но управлять им немного сложно, поэтому я обнаружил, что локальное хранилище будет лучшим подходом.

Мое желание будет следующим:

  • Создайте локальный постоянный том (с именем pv) с режимами доступа ReadWriteOnce и ReadOnlyMany.
  • Создайте первое постоянное утверждение тома (pvc1) в режиме доступа ReadWriteOnce и используйте его в DaemonSet, который записывает данные в том. Так что pvc1 должен связываться с pv
  • Создайте второе постоянное утверждение тома (pvc2) с режимом доступа ReadOnlyMany, который используется в любом другом модуле, который читает эти данные (поэтому pvc2 также должен связываться с pv)

Это возможно?

Я читал, что если PVC привязан к PV, то этот PV "заблокирован", что означает, что никакой другой PVC не может связываться с ним. Это действительно, как это работает? Если это кажется немного ограничивающим для такого рода сценариев, где у нас есть операции "один раз для чтения много".

Спасибо!

1 ответ

Решение

DaemonSets и PVCs для типов томов RWO плохо смешиваются, потому что все DaemonSets будут использовать один и тот же PVC. А для локальных томов это может привести к планированию только одной реплики, поскольку это ограничивает все модули, использующие этот PVC, только для одного узла.

Вы могли бы потенциально решить эту проблему с помощью StatefulSet, который поддерживает volumeClaimTemplates это создает PVC для реплики и масштабирует его до количества узлов в кластере. Однако ваши пользовательские модули должны будут знать и выбирать конкретный PVC для использования, а не использовать то, что находится на этом узле.

Я думаю, что ваш вариант использования будет лучше решен путем написания драйвера CSI. Он имеет компонент DaemonSet, который при запуске драйвера может инициализировать данные. Затем, когда он реализует NodePublishVolume (он же монтируется в модуль), он может подключить каталог данных в контейнер модуля. Вы можете сделать этот тип тома RWX, и вам, вероятно, не нужно реализовывать какие-либо подпрограммы контроллера для обеспечения или подключения.

Другие вопросы по тегам