Для настройки режима работы 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 узла).

    Схема потоков данных SNAT

  • DSR - (Direct Server Return) — метод, при котором весь входящий трафик проходит через балансировщик нагрузки, а весь исходящий трафик обходит его. Такой метод используется вместо SNAT. Часто ответы имеют много больший размер чем запросы и DSR позволяет значительно увеличить общую пропускную способность схемы:
    • если в Service указан externalTrafficPolicy: Local, то поведение абсолютно аналогично kube-proxy и bpfLB в режиме SNAT.
    • если в Service указан externalTrafficPolicy: Cluster, то трафик так же будет передаваться и балансироваться во все целевые поды в кластере.
      При этом важно учитывать следующие особенности:
      • если целевые поды находятся на других узлах, то при передаче на них входящего трафика будет сохранен IP-адрес источника;
      • исходящий трафик пойдет прямо с узла, на котором был запущен целевой под;
      • IP-адрес источника будет заменен на внешний IP-адрес узла, на которую изначально пришел входящий запрос.

    Схема потоков данных DSR

    В случае использования режима 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