Прикрепите новый том лазурного диска к каждому модулю в развертывании Kubernetes

У меня есть приложение Kubernetes Deployment с 3 репликами, которому требуется 7 ГБ хранилища для каждой реплики, я хочу иметь возможность прикрепить новый пустой azureDisk хранилище, которое будет подключено к каждому модулю / реплике, создаваемому в этом развертывании.

В основном у меня есть следующие ограничения:

  • Я должен использовать развертывание, а не набор данных
  • Каждый раз, когда модуль умирает и запускается новый модуль, он не должен иметь состояния, и к нему будет прикреплен новый пустой диск azureDisk.
  • модули не имеют общего хранилища, каждый модуль имеет собственное хранилище объемом 7 ГБ.
  • модули должны использовать azureDisk, потому что мне нужно 7 ГБ хранилища по запросу, что означает динамическое создание azureStorage при масштабировании реплик развертывания.

При использовании azureDisk мне нужно использовать его с типом режима доступа ReadWriteOnce (как сказано в docs), и он прикрепит к этому диску только 1 модуль, который был найден, но это работает, только если у меня есть 1 модуль, если у меня более 1 модуля, я могу ' t использовать то же утверждение ... есть ли способ динамически запрашивать больше хранилищ, как в первом заявлении?

ПРИМЕЧАНИЕ 1. Я знаю, что есть volumeClaimTemplates, но это относится только к Statefulset.

ПРИМЕЧАНИЕ 2: меня не волнует, перезапускается ли модуль 100 раз, а это, в свою очередь, создает 100 PV, из которых используется только 1, это нормально.


person toto    schedule 11.08.2020    source источник
comment
Не могли бы вы прояснить, почему у вас есть требование использовать Deployment, а не StatefulSet, который был разработан для решения именно таких случаев использования?   -  person BogdanL    schedule 12.08.2020


Ответы (2)


Я не уверен, почему вам нужно использовать StatefulSet, но единственное, что я вижу для этого, - это создать свой собственный оператор для вашего приложения. У оператора будет контроллер, который управляет вашими модулями подобно тому, как ReplicaSet делает, но за исключением того, что для каждого нового экземпляра пода создается новый PVC.

Возможно, лучше было бы выяснить, как запустить ваше приложение в StatefulSet, и использовать VolumeClaimTemplates

✌️

person Rico    schedule 12.08.2020
comment
Я должен спросить, почему при развертывании нельзя использовать большие объемы, такие как 7G, взятые по запросу от облачного провайдера и навсегда удаленные после смерти модуля? зачем ему statefulset? не могу ли я иметь приложение, которое не имеет состояния, но все еще нуждается в большом объеме? никому даже не нужен такой сценарий? в любом случае, ваше решение может сработать, спасибо. - person toto; 12.08.2020
comment
Это произойдет, если вы используете значение по умолчанию ReclaimPolicy: Delete. Однако PVC используются повторно. Блокирующим моментом здесь является то, что вы можете указать только фиксированные имена PVC в манифесте развертывания, и все реплики будут использовать одно и то же имя PVC, так что у вас есть ограничение. На самом деле они означают больше рабочих нагрузок без сохранения состояния, когда ваше состояние является чем-то внешним, например db. - person Rico; 12.08.2020

Главный вопрос - почему?, если у меня есть приложение, у которого нет состояния, мне все равно нужен большой том для каждого модуля.

Глядя на это объяснение, вы должны сосредоточиться на приложении StateFull. С моей точки зрения, похоже, что вы заставляете использовать Deployment вместо StateFullSet для StateFull приложение

В вашем примере, вероятно, вам понадобится pv, который поддерживает разные режимы доступа.

Основная проблема, с которой вы столкнулись, заключается в том, что при использовании pv в поддерживаемом режиме ReadWriteOnce вы можете одновременно привязать только один pv к одному узлу. Таким образом, ваши поды на разных узлах не запустятся из-за сбоя при монтировании тома. Этот подход можно использовать только для сценария ReadOnlyMany / ReadWriteMany.

Обратитесь к другим поставщикам, у которых есть другие возможности для режимов доступа, например: хранилище файлов (gcp), AzureFile (лазурный), Glusterfs, NFS

person Mark    schedule 12.08.2020
comment
Вы не можете использовать AzureFiles, потому что он предназначен для совместного использования файлов, и вы не хотите делиться ими между модулями, единственный вариант - использовать azureDisk, но он поддерживает только ReadWriteOnce, и он будет принадлежать только 1 модулю. если вам нужно несколько дисков azureDisk, вы должны использовать набор с отслеживанием состояния с шаблоном VolumeClaim, который будет создавать том для каждого модуля. но я хотел, чтобы жизненный цикл PV был таким же, как и жизненный цикл модуля. почему это так странно? Кстати, я использую Azure, и, очевидно, я не перейду к другому облачному провайдеру только из-за этой проблемы. - person toto; 13.08.2020
comment
Для получения дополнительной информации перейдите по этой проблеме: volumeClaimTemplates для развертываний - person Mark; 13.08.2020