Index
Документация по установке и использованию HashiCorp Vault через Banzaicloud Vault Operator.
Оглавление
- Описание
- Быстрый старт
- Архитектура
- Команды
- Конфигурация
- Использование веб-хуков
- Подключение к Vault
- Работа с секретами
- Troubleshooting
Описание
Banzaicloud Vault Operator - Kubernetes оператор для управления HashiCorp Vault с дополнительными возможностями: - Автоматическая инициализация и unsealing через Kubernetes Secrets - Веб-хуки для инжекта секретов из Vault в переменные окружения подов - Автоматическая конфигурация Vault через CRD - HA кластер с автоматическим failover
Возможности
- ✅ Kubernetes Auto-Unseal - автоматический unseal через K8s секреты
- ✅ Secrets Injection Webhook - прозрачный инжект секретов в переменные окружения подов
- ✅ HA режим - 3 реплики Vault с автоматическим failover
- ✅ Декларативная конфигурация - auth методы, политики, secret engines через CRD
- ✅ Автоматическая инициализация - Vault инициализируется автоматически при первом запуске
Текущая конфигурация
- Operator namespace:
tech-vault-operator - Instances namespace:
tech-vault-instances - Storage: Longhorn (5Gi per instance, StorageClass:
longhorn-vault, 3 реплики) - Replicas: 3 пода Vault (HA с Raft)
- Placement: Operator на masters, Vault на любых нодах с ОБЯЗАТЕЛЬНЫМ anti-affinity
- Auto-unseal: Kubernetes Secrets (⚠️ рекомендуется KMS для production)
- TLS: Enabled (self-signed сертификаты)
- NetworkPolicy: Включена изоляция сети
- PodDisruptionBudget: minAvailable=2
Быстрый старт
Примечание: Bank-Vaults использует новый OCI registry (
oci://ghcr.io/bank-vaults/helm-charts/vault-operator). Старый Helm репозиторий больше недоступен. См. vault-install-guide.md для деталей.
1. Подготовка нод
Подготовка нод выполняется автоматически через Ansible playbook:
1 | |
Это добавит:
- На master нодах: label node-role.kubernetes.io/control-plane=true и taint node-role.kubernetes.io/control-plane:NoSchedule
- На worker нодах: label node-role.kubernetes.io/worker=true
2. Установка Operator
1 2 | |
Это установит Bank-Vaults Vault Operator из OCI registry.
3. Создание Vault инстанса
1 | |
Это автоматически создаст RBAC ресурсы и Vault кластер.
Это создаст:
- StorageClass longhorn-vault
- Vault кластер из 3 подов
- Service для доступа к Vault
- Auto-unseal секрет
Важно: Vault автоматически инициализируется и unseal'ится. Root token и unseal keys хранятся в секрете vault-unseal-keys.
4. Проверка статуса
1 | |
5. Получение root token
1 | |
Архитектура
Компоненты
| Компонент | Namespace | Расположение | Описание |
|---|---|---|---|
| Vault Operator | tech-vault-operator |
Control-plane ноды | Управляет Vault инстансами |
| Vault Webhook | tech-vault-operator |
Control-plane ноды | Инжект секретов в поды |
| Vault Pods | tech-vault-instances |
Любые ноды | Vault серверы (3 реплики) |
Vault Cluster
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Auto-Unseal через Kubernetes
Vault использует Kubernetes Secrets для auto-unseal:
1. При первом запуске Vault инициализируется
2. Root token и unseal keys сохраняются в секрет vault-unseal-keys
3. При перезапуске подов Vault автоматически unseal'ится, читая ключи из секрета
4. Никаких ручных действий для unsealing не требуется
Команды
Управление
1 2 3 4 5 6 7 8 9 | |
Справка
1 | |
Конфигурация
Vault Instance
Конфигурация в manifests/vault/vault-tech.yaml:
- Size: 3 реплики
- Image:
hashicorp/vault:1.17.2 - Bank-Vaults:
ghcr.io/bank-vaults/bank-vaults:v1.32.0 - Storage: Raft storage на Longhorn PVC (5Gi per pod, путь
/vault/file) - Auto-unseal: Kubernetes Secrets (полностью автоматический)
- Service: ClusterIP (без Ingress)
- UI: Enabled (доступ через port-forward)
- Istio: Enabled
- Resources: 250m-1 CPU, 256Mi-512Mi RAM per pod (vault), 100m-500m CPU, 128Mi-256Mi RAM (bank-vaults)
Secret Engines
Автоматически настраиваются через externalConfig:
- KV v2 на пути secret/ - для общих секретов
Auth Methods
- Kubernetes auth - для подов в кластере
- Default роль: доступ к
secret/*для всех подов
Policies
- allow_secrets - read/write доступ к
secret/*
Использование веб-хуков
Banzaicloud Vault Operator включает мутирующий веб-хук, который автоматически инжектит секреты из Vault в переменные окружения подов.
Принцип работы
- Вы создаете секрет в Vault
- В манифесте пода используете специальный синтаксис
vault:path/to/secret#key - Webhook перехватывает создание пода и заменяет значения реальными данными из Vault
Пример использования
1. Создание секрета в Vault
1 2 3 4 5 6 7 8 9 10 11 | |
2. Использование в Deployment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
3. Результат
При создании пода webhook автоматически:
1. Аутентифицируется в Vault через Kubernetes auth
2. Читает секрет по указанному пути
3. Заменяет vault:secret/data/database/config#username на реальное значение dbuser
4. Инжектит значения в переменные окружения пода
Синтаксис для KV v2
Для KV v2 engine путь включает /data/:
1 2 3 4 5 | |
Дополнительные аннотации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Подключение к Vault
Connection Strings
1 2 3 4 5 | |
Port-forward для локального доступа
1 2 3 4 5 6 7 8 9 10 11 | |
Доступ к UI
1 2 3 4 5 6 7 8 9 10 11 12 | |
Exec в Vault pod
1 2 3 4 5 6 7 8 | |
Проверка Raft кластера
1 2 3 4 5 6 | |
Работа с секретами
CLI примеры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
REST API примеры
1 2 3 4 5 6 7 8 9 | |
Troubleshooting
Operator не запускается
1 2 3 4 5 6 7 8 | |
Vault pods не создаются
1 2 3 4 5 6 7 8 | |
Vault не инициализируется
1 2 3 4 5 6 7 8 | |
Vault sealed
Если Vault sealed вручную или после проблем:
1 2 3 4 5 6 | |
Webhook не работает
1 2 3 4 5 6 7 8 9 10 11 | |
Проблемы с доступом к секретам
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Примеры использования
Пример 1: Database credentials для приложения
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Пример 2: API ключи для внешних сервисов
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 | |
Пример 3: Multi-environment конфигурация
1 2 3 4 | |
1 2 3 4 5 6 | |
Best Practices
- Используйте отдельные роли для разных приложений с минимальными правами
- Версионирование секретов - KV v2 хранит историю изменений
- Регулярно ротируйте root token и создавайте отдельные токены для разных задач
- Backup - регулярно бэкапьте Longhorn volumes с Vault данными
- Мониторинг - настройте алерты на sealed Vault или недоступность API
- TLS в продакшене - включите TLS для production окружений
- Аудит логи - включен аудит для отслеживания доступа к секретам
Безопасность
Root Token
Root token имеет полные права на Vault. Защитите его:
1 2 3 4 5 6 7 8 | |
RBAC
Ограничьте доступ к namespace tech-vault-instances и секрету vault-unseal-keys.
Network Policies
Рекомендуется настроить NetworkPolicy для ограничения доступа к Vault только от нужных подов.
Безопасность
⚠️ ВАЖНО: Текущая конфигурация использует Kubernetes Secrets для auto-unseal. Это подходит для dev/test окружений, но НЕ РЕКОМЕНДУЕТСЯ для production.
Для Production обязательно:
- Миграция на KMS auto-unseal (AWS KMS, Azure Key Vault, GCP KMS)
- Ограничение использования root-токена - создавайте отдельные токены с минимальными правами
- Гранулярные политики доступа - не используйте
secret/*для всех, создавайте отдельные политики - Регулярное резервное копирование - бэкапьте Longhorn volumes с Vault данными
- Мониторинг и алертинг - настройте алерты на sealed Vault или недоступность API
- TLS сертификаты - используйте cert-manager для production сертификатов
Проверка статуса и безопасности
1 2 3 4 5 6 7 8 9 10 11 | |
Ссылки
- 📚 Bank-Vaults Operator Docs
- 🔐 HashiCorp Vault Documentation
- 🪝 Bank-Vaults Webhook
- 💾 Vault Kubernetes Auth