Как настроить балансировку нагрузки между ингрессами в разных кластерах Kubernetes с помощью upstream?

Как правильно настроить маршрутизацию запросов между двумя кластерами, используя сервер Nginx на отдельном сервере?
  • 8 июля 2024 г. 15:52
Ответы на вопрос 2
Для балансировки нагрузки между ингрессами в разных кластерах Kubernetes с помощью upstream в Nginx, вам нужно создать конфигурационный файл для Nginx, который будет содержать блок upstream с указанием всех ингрессов, которые вы хотите балансировать.

Пример конфигурационного файла nginx.conf:

```
upstream ingress_cluster1 {
    server <IP_адрес_кластера_1>:<порт>;
    server <IP_адрес_кластера_1>:<порт>;
}

upstream ingress_cluster2 {
    server <IP_адрес_кластера_2>:<порт>;
    server <IP_адрес_кластера_2>:<порт>;
}

server {
    listen 80;

    location / {
        proxy_pass http://ingress_cluster1;
    }

    location /cluster2 {
        proxy_pass http://ingress_cluster2;
    }
}
```

Для настройки маршрутизации запросов между двумя кластерами с использованием сервера Nginx на отдельном сервере, вам также потребуется создать конфигурационный файл, в котором определены upstream для каждого кластера и правила маршрутизации для каждого URL.

Пример конфигурационного файла nginx.conf:

```
upstream ingress_cluster1 {
    server <IP_адрес_кластера_1>:<порт>;
    server <IP_адрес_кластера_1>:<порт>;
}

upstream ingress_cluster2 {
    server <IP_адрес_кластера_2>:<порт>;
    server <IP_адрес_кластера_2>:<порт>;
}

server {
    listen 80;

    location / {
        proxy_pass http://ingress_cluster1;
    }

    location /cluster2 {
        proxy_pass http://ingress_cluster2;
    }
}
```

После создания конфигурационного файла, необходимо перезапустить сервер Nginx, чтобы он применил изменения. Теперь все запросы, направленные на ваш сервер Nginx, будут маршрутизироваться между двумя кластерами в соответствии с настройками upstream и правилами маршрутизации.
Все сервера в директиве 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;
    # теперь запросы проксируются в промежуточные сервера, которые проксируют
    # в настоящие с правильным именем домена
  }
}
Похожие вопросы