Модуль medikt-infra
Модуль medikt-infra развертывает конфигурацию для medikt.net в Kubernetes. Основные функции:
- Создание Kubernetes Secrets (Featbit, OpenSearch, Payments)
- Создание Kubernetes Ingress ресурсов (nginx ingress для всех API сервисов)
- Настройка TLS сертификатов (через cert-manager или собственные)
Расположение: terraform/modules/medikt-infra/
Создаваемые ресурсы
Secrets
| Secret Name | Описание |
|---|---|
featbit-appsettings | Настройки для Feature Bits (client_secret, server_secret, streaming_uri, event_uri) |
content-indexer-creds | Учетные данные для Content.Indexer (OpenSearch URL, login, password) |
content-searcher-creds | Учетные данные для Content.Searcher (OpenSearch URL, login, password) |
content-api-payment-settings | Настройки платежей (Robokassa, Fiscalization, Reconciliation) |
Ingress ресурсы
Создаются только если включен соответствующий флаг nginx_ingress_*_enabled:
| Сервис | Хост | Аннотации |
|---|---|---|
| user-ssr | *.medikt.net | nginx, cert-manager, from-to-www-redirect |
| admin-spa | admin.*.medikt.net | nginx, cert-manager, whitelist |
| admin-api | adm.*.medikt.net | nginx, cert-manager, proxy-body-size |
| content-api | content.*.medikt.net | nginx, cert-manager, websocket |
| notification-api | notification.*.medikt.net | nginx, cert-manager, websocket |
| upload-api | upload.*.medikt.net | nginx, cert-manager, proxy-body-size |
| user-api | user.*.medikt.net | nginx, cert-manager, proxy-body-size |
| user-shared | user-shared.*.medikt.net | nginx, cert-manager |
| userauth-api | auth.*.medikt.net | nginx, cert-manager |
| userreg-api | reg.*.medikt.net | nginx, cert-manager |
| transcoder-api | transcoder.*.medikt.net | nginx, cert-manager, websocket |
| logs-api | logs.*.medikt.net | nginx, cert-manager |
Параметры конфигурации
Базовые параметры
| Параметр | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
namespace | Окружение (только prod) | string | - |
client_secret | featbit client key | string | - |
server_secret | featbit server key | string | - |
streaming_uri | URI для streaming | string | wss://els-featuremgr.medikt.net |
event_uri | URI для событий | string | https://els-featuremgr.medikt.net |
Ingress параметры
| Параметр | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
ingress_whitelist_cidr | CIDR для whitelist (non-prod) | string | null |
transcoderapi_ingress_whitelist_cidr | Whitelist для transcoder API | string | null |
admin_spa_whitelist_cidr | Отдельный whitelist для admin-spa | string | null |
use_cert_manager | Включить cert-manager | bool | false |
cluster_issuer_name | Имя ClusterIssuer | string | yc-clusterissuer |
Включение Ingress
| Параметр | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
nginx_ingress_medikt_user_ssr | Ingress для user-ssr | bool | false |
nginx_ingress_medikt_admin_spa | Ingress для admin-spa | bool | false |
nginx_ingress_medikt_admin_api | Ingress для admin-api | bool | false |
nginx_ingress_medikt_content_api | Ingress для content-api | bool | false |
nginx_ingress_medikt_notification_api | Ingress для notification-api | bool | false |
nginx_ingress_medikt_upload_api | Ingress для upload-api | bool | false |
nginx_ingress_medikt_user_api | Ingress для user-api | bool | false |
nginx_ingress_medikt_user_shared | Ingress для user-shared | bool | false |
nginx_ingress_medikt_userauth_api | Ingress для userauth-api | bool | false |
nginx_ingress_medikt_userreg_api | Ingress для userreg-api | bool | false |
nginx_ingress_medikt_transcoder_api | Ingress для transcoder-api | bool | false |
nginx_ingress_medikt_logs_api | Ingress для logs-api | bool | false |
OpenSearch параметры
| Параметр | Описание |
|---|---|
OpenSearch__Url | URL кластера OpenSearch |
OpenSearch_Indexer_Login | Login для Content.Indexer |
OpenSearch_Indexer_Password | Password для Content.Indexer |
OpenSearch_Searcher_Login | Login для Content.Searcher |
OpenSearch_Searcher_Password | Password для Content.Searcher |
Payments параметры (Robokassa)
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
Payments_IsTest | Тестовый режим | true |
Payments_Fiscalization_Vat | НДС (None, Vat0, Vat5, Vat105, Vat7, Vat107, Vat10, Vat110, Vat20, Vat120, Vat22, Vat122) | Vat22 |
Payments_Gateways_Robokassa_InvIdShard | Индекс зоны для счетов | 0 |
Payments_Gateways_Robokassa_MerchantLogin | Merchant Login | medikt |
Payments_Gateways_Robokassa_Password1 | Пароль для реальных ссылок | - |
Payments_Gateways_Robokassa_Password2 | Пароль для проверки подписи | - |
Payments_Gateways_Robokassa_TestPassword1 | Пароль для тестовых ссылок | iQbXTDn0hZDz0O1fG8r4 |
Payments_Gateways_Robokassa_TestPassword2 | Пароль для проверки тестовых платежей | kYrKywvU7n0G8J5aKN0y |
Payments_Gateways_Robokassa_PaymentBaseUrl | Базовый URL для оплаты | https://auth.robokassa.ru/Merchant/Index.aspx |
Payments_Gateways_Robokassa_StatusServiceUrl | URL для опроса статусов | https://auth.robokassa.ru/Merchant/WebService/Service.asmx/OpStateExt |
Payments_PendingInvoiceTtlForProvider | Время жизни счета для провайдера | 00:10:00 |
Payments_PendingInvoiceTtlSkew | Временной буфер | 00:02:00 |
Payments_PaymentReconciliationInterval | Интервал реконсиляции | 00:01:00 |
Пример использования (prod-infra)
module "medikt-infra" {
provider-cloudid = var.provider-cloudid
provider-folderid = var.provider-folderid
provider-token = var.provider-token
provider-zone = var.provider-zone
source = "../modules/medikt-infra"
client_secret = lookup([for k in data.yandex_lockbox_secret_version.referenced.entries : k if k.key == "featbit_client_key"][0], "text_value", "")
server_secret = lookup([for k in data.yandex_lockbox_secret_version.referenced.entries : k if k.key == "featbit_server_key"][0], "text_value", "")
OpenSearch__Url = "https://rc1d-ecamgl4rt4sgudef.mdb.yandexcloud.net:9200"
OpenSearch_Indexer_Login = "indexer"
OpenSearch_Indexer_Password = lookup([for k in data.yandex_lockbox_secret_version.referenced.entries : k if k.key == "opensearch_indexer"][0], "text_value", "")
OpenSearch_Searcher_Login = "searcher"
OpenSearch_Searcher_Password = lookup([for k in data.yandex_lockbox_secret_version.referenced.entries : k if k.key == "opensearch_searcher"][0], "text_value", "")
namespace = "prod"
use_cert_manager = true
admin_spa_whitelist_cidr = var.admin_spa_whitelist_cidr
nginx_ingress_medikt_admin_api = true
nginx_ingress_medikt_admin_spa = true
nginx_ingress_medikt_content_api = true
nginx_ingress_medikt_logs_api = true
nginx_ingress_medikt_notification_api = true
nginx_ingress_medikt_transcoder_api = true
nginx_ingress_medikt_upload_api = true
nginx_ingress_medikt_user_api = true
nginx_ingress_medikt_user_ssr = true
nginx_ingress_medikt_userauth_api = true
nginx_ingress_medikt_userreg_api = true
}
Аннотации Ingress
Общие аннотации
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "..." # при use_cert_manager=true
nginx.ingress.kubernetes.io/whitelist-source-range: "..." # prod: да
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header X-Forwarded-For "$remote_addr, $server_addr";
more_set_headers "X-Forwarded-For $http_x_forwarded_for";
Специфичные аннотации
| Аннотация | Описание | Используется в |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-body-size | Размер тела запроса | content-api, upload-api, user-api, admin-api |
nginx.org/websocket-services | WebSocket сервисы | content-api, notification-api, transcoder-api |
nginx.ingress.kubernetes.io/from-to-www-redirect | Редирект с www | user-ssr |
nginx.ingress.kubernetes.io/whitelist-source-range | Whitelist CIDR | все сервисы (non-prod) |
Интеграция с другими модулями
- k8s_master: использует
alb_security_group_idдля безопасности - k8s_nodes: ingress-ноды с меткой
ingress_affinity: true - dns_zone: доменные имена для ingress
- k8s-secret: secrets для service accounts
Примечания
- Модуль создает ресурсы только в одном namespace (указанный в параметре)
- Ingress ресурсы создают только при включенном флаге
nginx_ingress_*_enabled - TLS сертификаты предоставляются через cert-manager (prod) или собственные сертификаты
- Whitelist применяется только в non-prod окружениях