Vault CSI Driver

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. Задача грандиозная, поэтому нам пришлось пройти длинный путь к ее решению.

Часть 1: Выбор и сравнение функционала (CSI Provider vs Sidecar Agent Injector)

Так как мы определились с выбором хранилища секретов, нам осталось определиться со способом доставки секретов в pods. Выбирали между CSI Provider и Sidecar Agent Injector. Оба официально поддерживаются Hashicorp и интегрируются с Kubernetes.

Чтобы выбрать, мы сравнили возможности, функционал и гибкость представленных решений.

1. Sidecar Agent Injector

Мы сразу определили для себя некоторые минусы этого подхода, а именно:

  • дополнительный sidecar для каждого pod — он будет дополнительно «нагружать наш кластер»;

  • Sidecar Agent Injector не поддерживает преобразование секретов Vault в секреты Kubernetes, что требовалось в нашем случае.

2. CSI Provider

Плюсы:

  • разворачивается как Daemonset;

  • позволяет монтировать секреты в файловую систему pod;

  • драйвер Vault CSI Provider поддерживает преобразование секретов Vault в секреты и переменные среды Kubernetes.

Минусы:

  • Vault CSI Provider не поддерживает ротацию и извлечение секретов при их изменении в Vault. Но об этом расскажем в следующем пункте.

Часть 2: Проблемы, с которыми мы столкнулись, и их решения

Проблема 1: мы не добавляли ротацию секретов, поэтому получить секреты можно только при деплое.

Решение — чтобы секреты обновлялись по мере их добавления/обновления можно использовать:

  • Hash для Helm, но тут есть трудности с тем, что секрет создается после деплоя и нужно добавлять аннотацию уже на задеплоенное приложение.

Проблема 2: переполнение кластера Vault незавершенными арендами и дальнейшая его недоступность.

Это связано с тем, что на каждый запрос секрета CSI Driver создает новую аренду в методе аутентификации kubernetes/, а так как по умолчанию ее ttl составляет 60 минут, кластер переполняется очень быстро — за 1–3 дня.

Решение — установка default‑lease‑ttl для всего метода аутентификации kubernetes/ в 30 секунд. Этого достаточно, чтобы получить секрет и не захламлять кластер.

Часть 3: Реализация

Этот этап — самый простой.

Помните — пример ниже категорически не рекомендован к установке в «продуктовом» контуре.

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.

Last updated

Was this helpful?