Проще говоря, у меня есть 2 контейнера для сервиса в режиме роя. Контейнер получает пакеты udp и отправляет их обратно нескольким клиентам, IP-адреса и порты которых хранятся в db. Балансировка нагрузки: пакеты с одного IP попадают в один контейнер.
Итак, вот ситуация:
контейнер-1 получает пакет от клиента-1 (10.255.0.2:5874
- src ip и порт пакета, который мы видим внутри контейнера) и отправить ему ответ (успешно).
контейнер-2 получает пакет от клиента-2 (10.255.0.2:5875
) и хочет отправить этот пакет обратно обоим клиентам (используя адреса из db), но только клиент-2 получает пакет!
Информация об отладке, которую я собрал до сих пор:
sudo nsenter --net=/run/docker/netns/ingress_sbox
root@alpom-qa:~# sudo iptables --list -t mangle
sudo: unable to resolve host alpom-qa: Resource temporarily unavailable
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- anywhere anywhere tcp dpt:5070 MARK set 0x161
MARK tcp -- anywhere anywhere tcp dpt:5062 MARK set 0x163
MARK tcp -- anywhere anywhere tcp dpt:5080 MARK set 0x16b
MARK tcp -- anywhere anywhere tcp dpt:http-alt MARK set 0x18f
MARK udp -- anywhere anywhere udp dpt:sip MARK set 0x192
MARK tcp -- anywhere anywhere tcp dpt:sip-tls MARK set 0x192
Chain INPUT (policy ACCEPT)
target prot opt source destination
MARK all -- anywhere 10.255.0.7 MARK set 0x161
MARK all -- anywhere 10.255.0.9 MARK set 0x163
MARK all -- anywhere 10.255.0.5 MARK set 0x16b
MARK all -- anywhere 10.255.10.115 MARK set 0x18f
MARK all -- anywhere 10.255.0.11 MARK set 0x192
Docker использует IPVS для балансировки нагрузки:
root@alpom-qa:~# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 353 rr
-> 10.255.10.245:0 Masq 1 0 0
FWM 355 rr
-> 10.255.10.246:0 Masq 1 0 0
FWM 363 rr
-> 10.255.11.61:0 Masq 1 0 0
FWM 399 rr
-> 10.255.11.91:0 Masq 1 0 13
FWM 402 rr
-> 10.255.11.93:0 Masq 1 0 1
-> 10.255.11.94:0 Masq 1 0 1
и подключение (отфильтрованный udp):
root@alpom-qa:~# ipvsadm -lc
IPVS connection entries
pro expire state source virtual destination
UDP 04:59 UDP 10.10.0.1:5874 172.18.0.2:sip 10.255.11.93:sip
UDP 04:59 UDP 10.10.0.1:5875 172.18.0.2:sip 10.255.11.94:sip
И tcpdump:
sudo tcpdump -i any src 10.255.11.93 -nn
показывает только записи вроде 13:03:28.280287 IP 10.255.11.93.5060 > 10.255.0.2.5874: SIP
Похоже, если мы отправим пакет udp в 10.255.0.2.5875
не из 10.255.11.94
(как показано в списке подключений) он как-то теряется.