Для настройки режима работы BPF Load Balancer (bpfLB) в Deckhouse Kubernetes Platform можно использовать модуль cni-cilium
.
В Kubernetes трафик обычно проходит через балансировщик, который распределяет входящие запросы по серверам и обрабатывает обратные ответы. Это ограничивает общую пропускную способность ресурсами балансировщика.
Для оптимизации трафика используется механизм DSR
, в котором входящие пакеты проходят через балансировщик, а исходящие идут напрямую с терминирующих серверов. Так как обычно ответы имеют много больший размер чем запросы, то такой подход позволяет значительно увеличить общую пропускную способность схемы.
В модуле возможен выбор режима работы с помощью параметра bpfLBMode
, влияющего на поведение сервисов с типом NodePort
и LoadBalancer
:
SNAT
(Source Network Address Translation) — один из подвидов NAT, при котором для каждого исходящего пакета происходит трансляция IP-адреса источника в IP-адрес шлюза из целевой подсети, а входящие пакеты, проходящие через шлюз, транслируются обратно на основе таблицы трансляций. В этом режимеbpfLB
полностью повторяет логику работыkube-proxy
:- если для объекта Service указано
externalTrafficPolicy: Local
, то трафик будет передаваться и балансироваться только в те целевые поды, которые запущены на том же узле, на который этот трафик пришел. Если целевой под не запущен на этом узле, то трафик будет отброшен. - если для объекта Service указано
externalTrafficPolicy: Cluster
, то трафик будет передаваться и балансироваться во все целевые поды в кластере. При этом, если целевые поды находятся на других узлах, то при передаче трафика на них будет произведен SNAT (IP-адрес источника будет заменен на InternalIP узла).
- если для объекта Service указано
DSR
- (Direct Server Return) — метод, при котором весь входящий трафик проходит через балансировщик нагрузки, а весь исходящий трафик обходит его. Такой метод используется вместоSNAT
. Часто ответы имеют много больший размер чем запросы иDSR
позволяет значительно увеличить общую пропускную способность схемы:- если в
Service
указанexternalTrafficPolicy: Local
, то поведение абсолютно аналогичноkube-proxy
иbpfLB
в режимеSNAT
. - если в
Service
указанexternalTrafficPolicy: Cluster
, то трафик так же будет передаваться и балансироваться во все целевые поды в кластере.
При этом важно учитывать следующие особенности:- если целевые поды находятся на других узлах, то при передаче на них входящего трафика будет сохранен IP-адрес источника;
- исходящий трафик пойдет прямо с узла, на котором был запущен целевой под;
- IP-адрес источника будет заменен на внешний IP-адрес узла, на которую изначально пришел входящий запрос.
В случае использования режима
DSR
иService
сexternalTrafficPolicy: Cluster
требуются дополнительные настройки сетевого окружения. Сетевое оборудование должно быть готово к ассиметричному прохождению трафика: отключены или настроены соответствующим образом средства фильтрации IP адресов на входе в сеть (uRPF
,sourceGuard
и т.п.).- если в
Hybrid
— в данном режиме TCP-трафик обрабатывается в режимеDSR
, а UDP — в режимеSNAT
.
Пример настройки режима работы bpfLB:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: cni-cilium
spec:
settings:
tunnelMode: VXLAN
bpfLBMode: SNAT # Выбран режим SNAT.
version: 1
enabled: true