В настоящее время я использую Kubernetes с Calico v3.20.2 в качестве CNI. У меня есть очень уникальный случай, когда мне нужно отправить UDP-трафик из определенного модуля DaemonSet на внешний сервер, который прочитает комбинацию IP-заголовков sourceIP:sourcePort и отправит ответ, установив эти два поля в качестве полей destIP:destPort. Поскольку разные сеансы UDP будут случайным образом выбирать разные рандомизированные исходные порты (диапазон 1024-65535), а ответ должен быть сбалансирован по нагрузке через MetalLB, мне нужно будет настроить прослушиватель UDP на каждом модуле DaemonSet, прослушивая каждый исходящий запрос. исходный порт, а также перенастроить LB так, чтобы он прослушивал этот порт и распределял трафик.Это явно не масштабируется, а также неэффективно, учитывая задержку таких конфигураций, занимающую больше времени, чем необходимо для возврата ответа, а также потенциальные несоответствия параллельных реконфигураций LB.
Поэтому я бы предпочел открыть один прослушиватель для каждого модуля на определенном порту (например, 20000) и SNAT для всего исходящего трафика из каждого модуля, чтобы исходный порт после того, как каждая дейтаграмма UDP покидает узел, был 20000. Внешний сервер будет отправлять ответ на этот порт назначения, и ответ в конечном итоге достигнет одного из прослушивателей UDP в одном из модулей DaemonSet. Я попробовал это, реализовав
sudo iptables -t nat -I POSTROUTING 1 -d <EXT-SERVER-IP>/32 -p udp --dport <EXT-SERVER-PORT> -j SNAT --to-source <WORKER-NODE-IP>:20000
Когда я пытаюсь реализовать это в IPtables, Calico всегда переписывает внесенные мной изменения и применяет свою собственную конфигурацию, что приводит к тому, что рандомизированные исходные порты снова покидают узел. С другой стороны, когда я устанавливаю флаг natOutgoing в false и пытаюсь настроить свои собственные правила, только одна дейтаграмма UDP покидает узел с правильным изменением SNAT до того, как все остальные дейтаграммы будут заблокированы, и никогда не покидает рабочий узел в все (о чем свидетельствует внешний сервер, а также tcpdump на рабочем узле)
Исправление любого из этих случаев решит общую проблему, и любые предложения приветствуются!