Как устроена работа балансировщика нагрузки в Kubernetes или Apache и как он определяет менее загруженный инстанс?
Что проверяют
Понимаете ли вы, на каком уровне идёт балансировка и что «наименее загруженный» балансировщик определяет по своим же счётчикам, а не по CPU бэкенда. Следом спрашивают, почему при долгих соединениях поды нагружены неравномерно.
Как отвечать
В Kubernetes балансировка есть на двух уровнях:
- Service и kube-proxy: L4, работает с соединениями, а не с запросами. В режимах
iptablesиnftablesпод выбирается случайно из готовых, о загрузке ничего не известно. Режим IPVS умеетrr,lc(least connection) и другие алгоритмы, а в кластерах с Cilium ту же роль выполняет eBPF; - Ingress или Gateway API: L7, видит отдельные HTTP-запросы. Контроллеры на Envoy умеют least request, в ingress-nginx по умолчанию round robin, а EWMA по времени ответа включается настройкой;
- список бэкендов: попадают в него только поды, прошедшие
readinessProbe, адреса лежат в EndpointSlice.
В Apache за это отвечает mod_proxy_balancer с методами byrequests (по умолчанию, взвешенный счёт запросов), bytraffic (по объёму байтов) и bybusyness (меньше всего запросов в работе, аналог least connections). Привязка клиента делается через stickysession, отдельного IP hash в Apache нет.
Главное про «менее загруженный»: балансировщик считает активные запросы или соединения, прошедшие через него самого, иногда учитывает время ответа. CPU и память бэкенда он не видит, и у каждой его реплики своя картина.
Для Python это ощутимо: под на gunicorn с синхронными воркерами держит ровно столько запросов, сколько у него воркеров, и least request здесь заметно лучше round robin.
Где спотыкаются
Думают, что Service распределяет запросы. Он распределяет соединения: клиент с keep-alive или долгим gRPC-каналом шлёт весь поток в один под, остальные простаивают.
Приписывают kube-proxy least connections по умолчанию. В режиме iptables выбор случайный.
Путают балансировку с автомасштабированием. HPA смотрит на CPU и добавляет поды, но трафик между ними не делит.