Я пытаюсь настроить балансировщик нагрузки LVS перед моим Kubernetes: Calico используется как контейнерная сеть, поэтому каждый модуль имеет свой собственный сетевой интерфейс на своем хосте. Внешние IP-адреса, маршруты и правила маршрутизации управляются с помощью keepalived. Каждая подсеть, назначенная моим хостинг-провайдером, имеет собственный маршрутизатор. Серверы имеют два физических интерфейса, подключенных к Интернету. Внешние IP-адреса доступны на втором интерфейсе.
Конфигурация такова: первый интерфейс имеет глобальный IP-адрес и маршрут по умолчанию. Второй интерфейс имеет частный IP. У него также есть все дополнительные IP-адреса от моего хостинг-провайдера. Поскольку все пакеты с дополнительных IP-адресов должны маршрутизироваться через специальный шлюз по умолчанию, я добавил таблицы и правила маршрутизации.
До этого момента все работает как положено. Чтобы сделать сервисы Kubernetes доступными на IP-адресах, я добавил LVS на некоторые узлы.
Моя проблема заключается в следующем: пакеты из Интернета поступают в мои модули Kubernetes, но их ответы не возвращаются в Интернет. Пакеты исчезают где-то в моем узле Kubernetes. Пакеты ответов от моих модулей используют IP-адрес модуля в качестве источника и должны быть переписаны NAT.
Глядя на правила iptables, я не вижу правил для LVS. Где они? Когда выполняются правила LVS NAT? Они привязаны к интерфейсу? Определяется ли путь пересылки и интерфейс до того, как будет выполнено NAT для пакетов ответа?
Мне не хватало поддержки netfilter conntrack для соединений LVS. Видеть http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.filter_rules.html для описания взаимодействия LVS netfilter.
Это можно сделать с помощью:
sysctl net.ipv4.vs.conntrack=1