Обратный прокси-сервер Nginx перед входом в Kubernetes
Мы запускаем 6-узловый кластер K8s из чистого металла (3-х узловая и 3-х узловая вычислительная плоскость). Вход развернут, и он хорошо работает для маршрутов на основе пути. Недавно мы построили кластер распределения нагрузки HA перед Ingress, чтобы обеспечить высокую доступность самого Ingress.
+---------------+ +---------+ +---------+
| Loadbalancers | --> | Ingress | --> | Jenkins |
+---------------+ +---------+ +---------+
Балансировщики нагрузки в основном запускают nginx в режиме обратного прокси-сервера с плавающим IP-адресом, который имеет DNS-запись типа A с подстановочным знаком:
*.cnk8sv.infra A <private-IP>
Однако в этой настройке мы не можем применить маршрутизацию на основе виртуального хоста. В таком режиме входные правила не ловят трафик. У меня есть подозрение, что nginx перед K8s сбрасывает некоторую информацию в заголовки HTTP, и, следовательно, контроллеры Ingress не могут выполнять маршрутизацию на основе хоста.
Это конфигурация балансировщиков нагрузки nginx:
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
Объект Ingress:
spec:
rules:
- host: jenkins.cnk8sv.infra
http:
paths:
- backend:
serviceName: jenkins
servicePort: 8080
path: /
Как только мы удаляем фильтр хоста в правиле, трафик начинает течь (так что да, бэкэнд запущен и работает). Любая помощь будет принята с благодарностью.
1 ответ
Исправление было в изменении X-Forwarded-Proto
значение для http
в конфигурации nginx, потому что мы нацеливались на Ingress на порт 80, то есть HTTP.