Ingress Controller
Обзор
- Nginx Ingress Controller - основной контроллер для всех API сервисов (user, admin, content, notification, upload, transcoder, logs и др.)
Nginx Ingress Controller
Архитектура
Nginx Ingress Controller развертывается на выделенной группе нод Kubernetes с меткой ingress_affinity: true.
Конфигурация через Terraform (prod-infra/main.tf):
module "nginx_node_ingress" {
source = "../modules/k8s_nodes"
provider-folderid = var.provider-folderid
provider-zone = var.provider-zone
provider-token = var.provider-token
k8s_cluster_id = module.k8s.id
k8s_cluster_name = module.k8s.name
preemptible_k8s_nodes = false
node_group_name = "k8s-medikt-net-ing"
k8s_worker_nodes_mem = 4
k8s_worker_nodes_cores = 4
node_labels = {
"ingress_affinity" = "true"
}
subnet_ids = ["${module.vpc.subnet_id}"]
security_group_ids = ["${module.k8s.k8s-main-sg}", "${module.k8s.k8s-public-services}"]
auto_scale = {
initial = 1
max = 1
min = 1
}
}
Ingress класс
Используется nginx ingress class (определено в аннотациях Kubernetes Ingress ресурсов).
Создание Ingress ресурсов
Ingress ресурсы создаются через модуль medikt-infra (resource kubernetes_ingress_v1) с аннотациями nginx:
| Служба | Домен | Ingress Class | TLS | Whitelist |
|---|---|---|---|---|
| user-ssr | *.medikt.net | nginx | cert-manager | prod: да |
| admin-spa | admin.*.medikt.net | nginx | cert-manager | prod: да |
| admin-api | adm.*.medikt.net | nginx | cert-manager | prod: да |
| content-api | content.*.medikt.net | nginx | cert-manager | prod: да |
| notification-api | notification.*.medikt.net | nginx | cert-manager | prod: да |
| upload-api | upload.*.medikt.net | nginx | cert-manager | prod: да |
| user-api | user.*.medikt.net | nginx | cert-manager | prod: да |
| user-shared | user-shared.*.medikt.net | nginx | cert-manager | prod: да |
| userauth-api | auth.*.medikt.net | nginx | cert-manager | prod: да |
| userreg-api | reg.*.medikt.net | nginx | cert-manager | prod: да |
| transcoder-api | transcoder.*.medikt.net | nginx | cert-manager | prod: да |
| logs-api | logs.*.medikt.net | nginx | cert-manager | prod: да |
Аннотации 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 |
Переменные модуля medikt-infra
| Параметр | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
nginx_ingress_*_enabled | Включить Ingress для сервиса | bool | false |
use_cert_manager | Использовать cert-manager | bool | true (prod) |
ingress_whitelist_cidr | CIDR для whitelist (non-prod) | string | null |
admin_spa_whitelist_cidr | Отдельный whitelist для admin-spa | string | null |
Группа безопасности
Для ingress-нод используется группа безопасности lb_access из модуля k8s_master:
- Порты: 80, 443, 30080 (NodePort), 10501 (healthcheck)
- Источники: CIDR из
lb_access_list(обычно диапазоны Yandex Load Balancer)