Обратный прокси-сервер 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.

Другие вопросы по тегам