На каких уровнях архитектуры может располагаться балансировщик нагрузки (Load Balancer)?

Ответ

Балансировщик нагрузки (Load Balancer, LB) может быть реализован на разных уровнях сетевой модели OSI, решая различные задачи:

Уровень Назначение Технологии/Примеры
DNS-уровень Распределение запросов между географически разными центрами обработки данных (GSLB). Простой Round Robin или с учетом здоровья. Route 53 (AWS), Cloud DNS (GCP).
Сетевой (L4) Балансировка на основе IP-адресов, портов и протоколов (TCP/UDP). Не анализирует содержимое пакетов. Nginx (stream), HAProxy (mode tcp), AWS Network Load Balancer (NLB).
Прикладной (L7) Балансировка на основе содержимого HTTP/HTTPS запросов (URL, заголовки, cookies). Позволяет маршрутизировать запросы к разным сервисам. Nginx (http), HAProxy (mode http), AWS Application Load Balancer (ALB), Ingress-контроллеры в Kubernetes (например, ingress-nginx).
Внутри кластера Балансировка трафика между экземплярами (подами) одного сервиса внутри платформы оркестрации. Kubernetes Service (тип ClusterIP с селектором), Istio (sidecar-прокси).
На стороне клиента Клиент (микросервис) сам выбирает экземпляр сервера из списка, полученного от service discovery. Ribbon (в стеке Spring Cloud Netflix), gRPC-клиенты с балансировкой.

Пример конфигурации Nginx (L7) для балансировки между двумя бэкендами:

http {
    upstream backend_servers {
        # Алгоритм балансировки (по умолчанию round-robin)
        server 10.0.1.1:8080 weight=3; # Сервер с большим весом
        server 10.0.1.2:8080;
        server 10.0.1.3:8080 backup;   # Резервный сервер
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend_servers;
            # Передаем заголовок с реальным IP клиента
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Выбор уровня: L4 — для производительности и непрозрачных протоколов (базы данных, игровые серверы). L7 — для интеллектуальной маршрутизации в веб-приложениях и API.

Ответ 18+ 🔞

Ну, слушай, смотри, чтобы не было как у того немого Герасима, который только "Му-му" мог сказать, а тут ему собаку топить пришлось. Вот так и в инфраструктуре: если балансировщик настроить криво, он тебе всех твоих "Муму" по серверам раскидает и потом утопит в пизду всё приложение.

Так вот, этот самый балансировщик нагрузки (Load Balancer, LB) — он, блядь, как хитрая жопа, может в разных местах сидеть. Смотря по какой модели OSI его, сука, посадить. И задачи у него от этого меняются, ёпта.

Смотри таблицу, чтобы не ебать мозг:

Уровень Назначение Технологии/Примеры
DNS-уровень Это когда тебе надо запросы по разным континентам раскидать, чтобы какой-нибудь чеченец из Грозного не ждал ответа от сервера в Калифорнии. Просто крутишь запись туда-сюда, как карусель. Route 53 (AWS), Cloud DNS (GCP).
Сетевой (L4) А вот это уже по-серьёзному. Смотрит только на IP-адреса и порты. Что внутри пакета летит — ему похуй, хоть стихи Тургенева. Главное — быстро перекинуть. Nginx (stream), HAProxy (mode tcp), AWS Network Load Balancer.
Прикладной (L7) А это, блядь, самый умный. Он уже в сам HTTP-запрос заглядывает. Видит, что ты запрашиваешь /api/users — и пиздует его на один сервер. А если /static/logo.png — то на совсем другой. Удобно, ёпта! Nginx (http), HAProxy (mode http), AWS ALB.
Внутри кластера Это когда у тебя в кубере двадцать пять одинаковых контейнеров бегают, а наружу торчит одна дырка. Вот эта дырка и есть балансировщик, который внутри всё распределяет. Kubernetes Service, Istio (этот вообще sidecar-прокси ставит, чтоб совсем охуеть).
На стороне клиента А это вообще, блядь, волшебство! Сам клиент-микросервис смотрит в какой-то список и думает: "На какой же сервер мне сегодня пойти? А пойду-ка я на тот, что полегче". Сам себе балансировку делает, мудя! Ribbon, gRPC-клиенты.

А вот тебе пример, как это в Nginx на L7 выглядит, чтобы ты не обосрался с настройками:

http {
    upstream backend_servers {
        # Алгоритм балансировки (по умолчанию round-robin)
        server 10.0.1.1:8080 weight=3; # Этот сервер покрепче, ему три запроса
        server 10.0.1.2:8080;          # Этот так, середнячок
        server 10.0.1.3:8080 backup;   # А этот резервный, на случай пиздеца
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend_servers;
            # А это чтобы бэкенд знал, чья это хитрая жопа его дергает
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Итог, Колян: Выбирай уровень с умом, а то охуеешь потом. L4 — это когда тебе важна скорость, а что внутри — не ебет. Например, для игровых серверов или баз данных. А L7 — это когда тебе надо умно маршрутизировать запросы в твоём веб-приложении, чтобы всё летало. Главное — не утопить свою "Муму", то есть приложение, из-за ебаной ошибки в конфиге.