Vault CSI Driver
Last updated
Last updated
https://habr.com/ru/companies/ru_mts/articles/716624/
Добрый день, Хабр! Мы — Михаил Панов и Евгений Прудченко, DevOps‑инженеры из команды МТС Digital, работаем на проекте External WebSSO. Мы занимаемся внедрением DevOps практик и инструментов в рамках нашего проекта. В этой статье расскажем о интеграции и доставке секретов из Vault в Kubernetes с помощью Vault CSI Provider.
Изучив вопрос доставки секретов, мы выяснили, что мало кто использует Vault CSI Provider. Нам это показалось несправедливым, ведь, на наш взгляд, это отличный инструмент. Поэтому мы и решили поделиться нашим опытом.
Основная проблема которую хотелось решить — как получить секреты из Vault, меняя всего лишь несколько строк в файле values.yaml нашего helm‑chart. Задача грандиозная, поэтому нам пришлось пройти длинный путь к ее решению.
Так как мы определились с выбором хранилища секретов, нам осталось определиться со способом доставки секретов в pods. Выбирали между CSI Provider и Sidecar Agent Injector. Оба официально поддерживаются Hashicorp и интегрируются с Kubernetes.
Чтобы выбрать, мы сравнили возможности, функционал и гибкость представленных решений.
Мы сразу определили для себя некоторые минусы этого подхода, а именно:
дополнительный sidecar для каждого pod — он будет дополнительно «нагружать наш кластер»;
Sidecar Agent Injector не поддерживает преобразование секретов Vault в секреты Kubernetes, что требовалось в нашем случае.
Плюсы:
разворачивается как Daemonset;
позволяет монтировать секреты в файловую систему pod;
драйвер Vault CSI Provider поддерживает преобразование секретов Vault в секреты и переменные среды Kubernetes.
Минусы:
Vault CSI Provider не поддерживает ротацию и извлечение секретов при их изменении в Vault. Но об этом расскажем в следующем пункте.
Проблема 1: мы не добавляли ротацию секретов, поэтому получить секреты можно только при деплое.
Решение — чтобы секреты обновлялись по мере их добавления/обновления можно использовать:
Hash для Helm, но тут есть трудности с тем, что секрет создается после деплоя и нужно добавлять аннотацию уже на задеплоенное приложение.
Проблема 2: переполнение кластера Vault незавершенными арендами и дальнейшая его недоступность.
Это связано с тем, что на каждый запрос секрета CSI Driver создает новую аренду в методе аутентификации kubernetes/, а так как по умолчанию ее ttl составляет 60 минут, кластер переполняется очень быстро — за 1–3 дня.
Решение — установка default‑lease‑ttl для всего метода аутентификации kubernetes/ в 30 секунд. Этого достаточно, чтобы получить секрет и не захламлять кластер.
Этот этап — самый простой.
Помните — пример ниже категорически не рекомендован к установке в «продуктовом» контуре.
1. Прежде всего необходимо развернуть в кластере Kubernetes Vault и Vault CSI Provider:
2. Переходим к установке secret store csi driver:
При установке secret store csi driver необходимо добавить пару «ключей», а именно:
включить ротацию секретов enableSecretRotation для того, чтобы получать секреты из Vault при их изменении;
добавить интервал ротации этих секретов rotationPollInterval — как часто secret store csi driver будет проверять изменения секрета.
3. Настраиваем авторизацию Kubernetes и Default lease TTL:
Командой ниже выставляем Default-lease-ttl, для того чтобы наш Vault не заполнялся ненужными «арендами».
4. Добавляем Роль, Политику и Секрет.
Теперь добавим тестовые данные, с которыми будем работать.
Роль:
Политика:
Секрет:
5. Тестирование.
Проверим что все pod «стартанули»:
Создадим Custom Resource:
Создадим Serviceaccount:
Создадим pod который будет запрашивать секрет из Vault:
Проверим секрет внутри нашего pod:
Тут мы должны получить вывод: db‑secret‑password.
Теперь смонтируем секрет как переменную среды.
Добавим еще один CustomResource:
Создадим pod, который будет запрашивать секрет из Vault и монтировать как переменную среды.
На этом установка, настройка и тестирование закончены.
Вуаля, теперь мы можем полноценно добавлять секреты в Vault и использовать их в Kubernetes как:
Secret;
монтировать как volume в pod и использовать как конфиг‑файл.
Итог: инструмент не тривиальный и требует ряда доработок для каждого частного случая, но дает хорошую автоматизацию доставки секретов из Vault.