Skip to main content
Version: 1.12-grodno (current)

Ingress Controller

Обзор

  1. 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 ClassTLSWhitelist
user-ssr*.medikt.netnginxcert-managerprod: да
admin-spaadmin.*.medikt.netnginxcert-managerprod: да
admin-apiadm.*.medikt.netnginxcert-managerprod: да
content-apicontent.*.medikt.netnginxcert-managerprod: да
notification-apinotification.*.medikt.netnginxcert-managerprod: да
upload-apiupload.*.medikt.netnginxcert-managerprod: да
user-apiuser.*.medikt.netnginxcert-managerprod: да
user-shareduser-shared.*.medikt.netnginxcert-managerprod: да
userauth-apiauth.*.medikt.netnginxcert-managerprod: да
userreg-apireg.*.medikt.netnginxcert-managerprod: да
transcoder-apitranscoder.*.medikt.netnginxcert-managerprod: да
logs-apilogs.*.medikt.netnginxcert-managerprod: да

Аннотации 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-servicesWebSocket сервисыcontent-api, notification-api, transcoder-api
nginx.ingress.kubernetes.io/from-to-www-redirectРедирект с wwwuser-ssr

Переменные модуля medikt-infra

ПараметрОписаниеТипЗначение по умолчанию
nginx_ingress_*_enabledВключить Ingress для сервисаboolfalse
use_cert_managerИспользовать cert-managerbooltrue (prod)
ingress_whitelist_cidrCIDR для whitelist (non-prod)stringnull
admin_spa_whitelist_cidrОтдельный whitelist для admin-spastringnull

Группа безопасности

Для ingress-нод используется группа безопасности lb_access из модуля k8s_master:

  • Порты: 80, 443, 30080 (NodePort), 10501 (healthcheck)
  • Источники: CIDR из lb_access_list (обычно диапазоны Yandex Load Balancer)