name: k8s_openbao service_id: 151 service_display_name: Vault service_short_name: k8sOpenbao service_man: '# Инструкция по развертыванию Хранилища секретов через платформу

## 1. Общая информация
Хранилище секретов — сервис централизованного и защищённого хранения чувствительных данных (секретов, ключей, конфигураций). Предназначен для использования приложениями и сервисами в Kubernetes с управлением доступом на основе ролей.
В качестве приложения используется открытый проект OpenBao с поддержкой кластерного режима RAFT.

### Доступные операции
**create** — Создание хранилища секретов и инициализация кластера.
**delete** — Удаление хранилища секретов с полной очисткой всех связанных сущностей.
**modify** — Изменение параметров развернутого хранилища секретов.
**suspend** — Приостановка работы кластера без удаления Persistent Volume.
**resume** — Возобновление работы кластера с автоматическим unseal всех нод.
**restart** — Поочередный перезапуск нод с последующим подключением в кластер.
**create_kv** — Создание Key/Value хранилища версии V2.
**delete_kv** — Удаление Key/Value хранилища со всеми содержащимися секретами.
**create_secrets** — Создание секрета внутри Key/Value хранилища.
**delete_secrets** — Удаление секрета из Key/Value хранилища.
**update_secrets** — Обновление значения секрета.
**recovery_secrets** — Откат секрета к указанной версии.
**create_role** — Создание роли для управления Key/Value хранилищем или секретами.
**update_role** — Обновление параметров роли.
**delete_role** — Удаление роли доступа.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа для развертывания
Описание: Кластер Kubernetes, в котором будет развернуто приложение.
Формат значения: имя Kubernetes-кластера.

### Имя домена
Описание: Доменное имя сервиса. При указании полного FQDN выполняется проверка DNS A-записи или добавляется А-запись в техническую зону.
Формат значения: secrets.domain.com / mysecretdomain.

### Кол-во реплик
Описание: Количество узлов в кластере.
Формат значения: целое число.

### Квота ядра пода
Описание: Лимит CPU для одного узла. Указывается в milicores (1000 milicores = 1 CPU).
Формат значения: целое число.

### Квота памяти пода
Описание: Лимит оперативной памяти для одного узла. Указывается в megabytes.
Формат значения: целое число.

### Размер диска под хранение секретов
Описание: Объем диска для хранения данных. Фактический объем равен значению, умноженному на количество реплик. Указывается в Gigabytes
Формат значения: целое число.

### Версия OpenBao
Описание: Версия OpenBao для развертывания сервиса.
Формат значения: выбор из предоставленного списка версий.

---

## 3. Рекомендованные характеристики

### Тестовое окружение
Кол-во реплик: 2.
Квота ядра пода: 200.
Квота памяти пода: 256.
Размер диска под хранение секретов: 1.
Версия OpenBao: актуальная стабильная версия.

### Промышленное окружение
Кол-во реплик: от 3.
Квота ядра пода: от 1000.
Квота памяти пода: от 1024.
Размер диска под хранение секретов: от 10.
Версия OpenBao: актуальная стабильная версия.

---

## 4. Выходные параметры
Настройки внутри хранилища (kv/secrets/roles) — конфигурации Key/Value, секретов и ролей, созданные соответствующими операциями.
Настройки самого хранилище (сайзинг, объемы) — параметры ресурсов и хранилища данных, примененные к сервису.
Статус кластера (running / suspended) — текущее состояние работы кластера.
url для подключения к веб — адрес веб-интерфейса сервиса.

---

## 5. Дополнительная информация
При удалении хранилища все данные и настройки безвозвратно удаляются.
При использовании доменного имени требуется корректная настройка DNS.
Операции управления секретами и ролями выполняются только после успешного создания хранилища.
Удаление кластера производится через операцию `suspend`, а удаление становится доступно через 14 дней после остановки кластера
Правило выше не относится к операции `delete_kv` / `delete_secrets` / `delete_role`' lifecycle: suspend_on_destroy_default: true adopt_existing_on_create_default: false outputs: params: - code: state_params type: map - code: state_out type: map - code: state_params_flat type: map - code: state_out_flat type: map - code: vault_secrets type: map sensitive: true - code: vault_url type: string - code: vault_user_path type: string - code: vault_fields type: list operations: - name: create id: 210 kind: instance action: create params: - id: 663 code: resourceRealm data_type: string required: true value_list: - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru func: getAvailableResourceRealms descr: Кластер Kubernetes в котором будет развёрнуто приложение man: Выбрать платформу из списка

**Если список не отображается**
обратитесь к сервис менеджеру с вопросом предоставления ресурсной платформы sort: 0 - id: 664 code: resourceCPU data_type: integer > 0 required: true default: "500" maxvalue: 8000 minvalue: 250 descr: 'Пример: `500`' man: Указывается в Milicores
`1000` Mili == `1` Ядро sort: 30 is_modifiable: true - id: 665 code: resourceInstances data_type: integer > 0 required: true default: "3" maxvalue: 7 minvalue: 1 descr: 'Пример: `3`' sort: 20 is_modifiable: true - id: 666 code: resourceMemory data_type: integer > 0 required: true default: "512" maxvalue: 8192 minvalue: 256 descr: 'Пример: `2048`' man: Указывается в Megabytes sort: 40 is_modifiable: true - id: 667 code: resourceDisk data_type: integer > 0 required: true default: "10" maxvalue: 999 minvalue: 1 descr: 'Пример: `10`' man: Указывается в Gigabytes sort: 50 is_modifiable: true - id: 668 code: appVersion data_type: string required: true default: 2.5.2 value_list: - 2.5.2 descr: Выбрать из списка sort: 60 is_modifiable: true - id: 669 code: domain data_type: string required: true default: bao-onbcvsgk regex: ^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$ unique_scope: provider man: Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm sort: 10 - name: create_kv id: 212 kind: subresource action: create subresource: kv params: - id: 675 code: kvName data_type: string required: true default: kvname-9e9wvkt2 regex: ^[a-zA-Z0-9-]{1,24}$ man: Будет создан `v2 тип движка`

Уникальное в рамках услуги sort: 10 - name: create_policy id: 237 kind: subresource action: create subresource: policy params: - id: 728 code: policySettings data_type: array-map-fixed required: true sort: 20 sub_params: - id: 50 code: capabilities data_type: json required: true default: '["read", "list"]' man: 'Пример: `["create", "read", "update", "delete", "list", "sudo"]`
Только чтение: `["list", "read"]`
Изменение: `["read", "list", "create", "update", "delete"]`' is_modifiable: false - id: 49 code: path data_type: string required: true default: "" man: 'Пример 1: `mykv/*`
Пример 2: `mykv/path/*`
Пример 3: `mykv/path/to/secret`
' is_modifiable: false - id: 729 code: policyName required: true default: policy-s0hfjfmn regex: ^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$ man: Сделано для дальнейшего удобного использования sort: 10 - name: create_secrets id: 214 kind: subresource action: create subresource: secrets params: - id: 677 code: kvName data_type: string required: true descr: Выберите из списка man: Если список пустой, создайте kv через операцию `create_kv` sort: 10 - id: 678 code: secretPath data_type: string required: true default: path/to/mysecret regex: ^[a-zA-Z0-9_-]+(?:\/[a-zA-Z0-9_-]+)*$ descr: 'Пример: `path` или `road/to/path`' sort: 20 - id: 679 code: secretData data_type: map required: true descr: Хотя бы один секрет необходимо добавить man: Данные не сохраняются в ЛК, в дальнейшем при обновлении секретов это необходимо учитывать sort: 30 - name: delete id: 231 kind: instance action: delete params: [] - name: delete_kv id: 213 kind: subresource action: delete subresource: kv man: '**ОСТОРОЖНО**
Удаление KV подразумевает удаление ВСЕХ secrets внутри этой KV' params: - id: 676 code: kvName data_type: string required: true descr: Выберите из списка sort: 10 - name: delete_policy id: 239 kind: subresource action: delete subresource: policy params: - id: 732 code: policyName data_type: string required: true - name: delete_secrets id: 233 kind: subresource action: delete subresource: secrets params: - id: 726 code: kvName data_type: string required: true descr: Выберите из списка sort: 10 - id: 727 code: secretPath data_type: string required: true descr: Выберите из списка sort: 20 depends_on: kvName - name: modify id: 211 kind: instance action: modify params: - id: 670 code: resourceInstances data_type: integer > 0 required: true maxvalue: 7 minvalue: 1 descr: 'Пример: `3`' sort: 10 - id: 671 code: resourceCPU data_type: integer > 0 required: true default: "500" maxvalue: 8000 minvalue: 250 descr: 'Пример: `500`' man: Указывается в Milicores
`1000` Mili == `1` Ядро sort: 20 - id: 672 code: resourceMemory data_type: integer > 0 required: true default: "512" maxvalue: 8192 minvalue: 256 descr: 'Пример: `2048`' man: Указывается в Megabytes sort: 30 - id: 673 code: resourceDisk data_type: integer > 0 required: true maxvalue: 999 minvalue: 1 descr: 'Пример: `10`' man: Указывается в Gigabytes sort: 40 - id: 674 code: appVersion data_type: string required: true value_list: - 2.5.2 descr: Выбрать из списка sort: 50 - name: reconcile id: 236 kind: action action: reconcile params: [] - name: recovery_secrets id: 232 kind: subresource action: recovery subresource: secrets man: Данная операция подразумевает откат на конкретную версию в секрете.

**Это не восстановление удалённого секрета** params: - id: 723 code: kvName data_type: string required: true descr: Выберите из списка sort: 10 - id: 724 code: secretPath data_type: string required: true descr: Выберите из списка sort: 20 depends_on: kvName - id: 725 code: secretVersion data_type: string required: true depends_on: kvName,secretPath - name: restart id: 234 kind: action action: restart params: [] - name: resume id: 216 kind: instance action: resume params: [] - name: suspend id: 215 kind: instance action: suspend params: [] - name: update_policy id: 238 kind: subresource action: update subresource: policy params: - id: 730 code: policyName data_type: string required: true sort: 10 - id: 731 code: policySettings data_type: array-map-fixed required: true descr: Производится полная перезапись политики! sort: 20 sub_params: - id: 52 code: capabilities data_type: string required: true default: "" is_modifiable: false - id: 51 code: path data_type: string required: true default: "" is_modifiable: false - name: update_secrets id: 230 kind: subresource action: update subresource: secrets params: - id: 719 code: kvName data_type: string required: true descr: Выберите из списка sort: 10 - id: 720 code: secretPath data_type: string required: true descr: Выберите из списка man: Предварительно необходимо выбрать параметр `Имя Key/Value хранилища` sort: 20 depends_on: kvName - id: 721 code: needFullUpdateSecret data_type: boolean required: true default: "false" value_list: - "false" - "true" man: Если выбрать `true`, будет создана новая версия секрета `с нуля`
Если выбрать `false`, будет создана новая версия секрета с данными прошлой ревизии, а переданные данные в операции либо будут модифицированы, либо будут добавлены sort: 30 - id: 722 code: secretData data_type: map required: true descr: Хотя бы один секрет необходимо добавить sort: 40