@Iceforest

Как правильно настроить балансировку через upstream на ингрессы в разных кластерах кубернетес?

хочу отправлять запросу между двумя кластерами используя nginx на отдельном сервере
есть сервер nginx на через upstream маршрутизировать на два одинаковых беканда в двух разных кластерах
допустим приложение validator развернуть в двух кластерах и имеет разные ингресс адреса
validator.amd.ru
validator.bm.ru

на nginx настроил так

server {
    listen 80;
    server_name test.test.ru;
    location / {
            return 301 https://$host$request_uri;
               }
}
upstream valid{
server validator.amd.ru:80;
server  validator.bm.ru:80;
}
server {
    listen 443 ssl;
    server_name test.test.ru;
     ssl_certificate test.test.ru.crt;
     ssl_certificate_key test.test.ru.key;



    location / {
     return 204;
    }

    location /keepalive {
       return 200;
               }
    location /api/valid {
        proxy_set_header Content-Type application/json;
        proxy_pass http://valid/api/validators;

    }
}

через апстрим не работает вообще никак
а если проксирую
location /api/valid {
        proxy_set_header Content-Type application/json;
        proxy_pass http://validator.amd.ru/api/validators;

    }

то все ок, аналогично если поставить другой домен
не понимаю в чем может быть загвоздка и почему напрямую все работает, а если апстрим нет, подскажите, пожалуйста?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Все сервера в директиве upstream резолвятся в IP-адреса и информация об оригинальных именах теряется. Это проблема если на одном IP-адресе существует множество серверов.

Правильным решением было бы поднятие апстримов на уникальных парах IP:port, но есть обходной путь при помощи двойного проксирования.

Примерно так:

# вместо настоящих серверов указываем тут промежуточные,
# которые определены в этом же конфиге ниже
upstream valid {
  server 127.0.10.1:80;
  server 127.0.10.2:80;
}

# промежуточный сервер
server {
  listen 127.0.10.1:80;
  location / {
    proxy_pass http://validator.amd.ru;
    # тут nginx автоматически добавляет proxy_set_header Host validator.amd.ru;
    # (берёт имя домена из proxy_pass)
  }
}
# второй промежуточный сервер
server {
  listen 127.0.10.2:80;
  location / {
    proxy_pass http://validator.bm.ru;
    # тут nginx автоматически добавляет proxy_set_header Host validator.bm.ru;
  }
}

# тут ничего не меняем
server {
  ...
  location /api/valid {
    proxy_pass http://valid/api/validators;
    # теперь запросы проксируются в промежуточные сервера, которые проксируют
    # в настоящие с правильным именем домена
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы