#kubernetes #dynamic #persistent-volumes
#kubernetes #динамические #постоянные тома
Вопрос:
У меня есть приложение, запущенное в Kubernetes, которому необходимо получить доступ к общим ресурсам SMB, которые настраиваются динамически (хост, учетные данные и т. Д.) В указанном приложении. Я изо всех сил пытаюсь добиться этого (чисто) с помощью Kubernetes.
Я сталкиваюсь с несколькими трудностями:
- Мне не нужно хранилище «a», мне нужны явно указанные общие ресурсы SMB
- Эти общие ресурсы динамически определяются в приложении и заранее неизвестны
- У меня переменное количество общих ресурсов, и один модуль должен иметь доступ ко всем из них
В настоящее время у нас есть решение, в котором на каждом рабочем узле kubernetes все общие ресурсы подключаются к точкам монтирования в общей папке. Затем эта папка присваивается в качестве HostPath
тома контейнерам, которым требуется доступ к этим хранилищам. Наконец, у каждого из этих контейнеров есть логика для доступа к подпапкам, соответствующим хранилищам, которые ему нужны.
Недостатком и причиной, по которой я ищу более чистую альтернативу, является:
HostPath
тома представляют угрозу безопасности- Для этого решения мне нужно что-то вне Kubernetes, которое автоматически монтирует общие ресурсы SMB на каждом узле Kubernetes
Есть ли лучшее решение, которого мне не хватает?
Объект Kubernetes, который, по-видимому, наиболее точно соответствует этому подходу, — это проектируемый том, поскольку он «отображает существующие источники томов в один и тот же каталог». Однако он не поддерживает тип источника тома, который мне нужен, и я не думаю, что можно динамически добавлять / удалять источники тома без перезапуска модулей, которые используют этот прогнозируемый объем.
Комментарии:
1. Значит, общие ресурсы SMB не одинаковы для всех модулей? Вы сказали, что общие ресурсы SMB настраиваются динамически — меняется ли он (общий ресурс SMB) в одном модуле? Какую версию Kubernetes вы используете?
2. Общие ресурсы SMB одинаковы для всех модулей. Общие ресурсы настраиваются. При добавлении общего ресурса все модули должны иметь доступ к этому новому общему ресурсу (при необходимости) в дополнение к другим. Мы используем Kubernetes 1.21.
Ответ №1:
Наверняка ваше текущее решение, использующее hostPath на узлах, не является гибким, небезопасным, поэтому это не очень хорошая практика.
Я думаю, вам следует рассмотреть возможность использования одного из пользовательских драйверов для ваших общих ресурсов SMB:
- Плагин CIFS FlexVolume — более старое решение, не поддерживается
- Драйвер CSI SMB — активно разрабатывается (рекомендуется)
Плагин CIFS FlexVolume:
Это более старое решение, и оно заменено драйвером CSI. Преимущество по сравнению с CSI заключается в том, что вы можете указать общие ресурсы SMB непосредственно из определения pod (включая учетные данные как секрет Kubernetes) по своему усмотрению.
Здесь вы можете найти инструкции по установке этого плагина в свой кластер.
Драйвер CSI SMB:
Этот драйвер автоматически позаботится о подключении общих ресурсов SMB на всех узлах с помощью DaemonSet.
Вы можете установить драйвер SMB CSI либо с помощью bash-скрипта, либо с помощью helm-диаграммы.
Предполагая, что ваш SMB-сервер готов, вы можете использовать одно из следующих решений для доступа к нему из своего модуля:
В обоих случаях вы должны использовать ранее созданный секрет с учетными данными.
В вашем случае для каждого общего ресурса SMB вы должны создать класс хранилища / PV и подключить его к pod.
Преимущество драйвера CSI в том, что это более новое, поддерживаемое в настоящее время решение, и оно заменило FlexVolume.
Ниже приведена схема, представляющая, как работает плагин CSI:
Также проверьте:
Комментарии:
1. Большое вам спасибо за подробное объяснение. Если я правильно понимаю диаграмму, плагин CSI по-прежнему использует тома Hostpath за кулисами. Здесь также нет волшебства: требуется «privileged: true», и это причина (также проблема безопасности), по которой мы в конечном итоге монтировали общие ресурсы изначально на узлах. Если я что-то не пропустил, это также не решает мою потребность в доступе к переменному количеству хранилищ из одного и того же контейнера. Оглядываясь назад, это, вероятно, неправильный способ решения этого требования. Лучшим подходом было бы иметь выделенные модули для каждого хранилища.