+666новых вакансий за сутки52 265вакансий открыто сейчасНовое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний
Пакет от Pod A проходит через veth-pair на ноду, инкапсулируется CNI-плагином (VXLAN у Flannel, BGP у Calico), передаётся по физической сети на ноду Pod B, декапсулируется и доставляется в netns Pod B через veth.
Linux-мост (cbr0 у Flannel, или нет моста у Calico в режиме BGP) или eBPF-hook принимает пакет. Ядро проверяет таблицу маршрутизации ноды:
ip route show
# 10.244.2.0/24 via 192.168.1.3 dev eth0 # маршрут к подсети ноды B
Маршрут говорит: «Подсеть 10.244.2.0/24 находится на ноде B (192.168.1.3) — отправь туда».
Kubernetes требует, чтобы каждый Pod имел уникальный IP-адрес и мог напрямую общаться с любым другим Pod без NAT. Это называется «flat network model». Реализацию обеспечивает CNI-плагин (Container Network Interface): Calico, Flannel, Cilium, Weave и др.
Контейнер отправляет пакет на IP Pod B (например, 10.244.2.5). Пакет попадает в виртуальный сетевой интерфейс пространства имён Pod — eth0 внутри Pod. На другом конце этого veth-pair — интерфейс veth-xxxxx на ноде.
flannel.1.Пакет (инкапсулированный или нет) проходит через физический коммутатор/роутер дата-центра от ноды A к ноде B по их реальным IP-адресам.
Flannel daemon (или eBPF-hook) на ноде B декапсулирует пакет, восстанавливая оригинальный IP Pod A → Pod B. Затем пакет маршрутизируется через veth-pair в сетевое пространство имён Pod B — и попадает на eth0 Pod B с адресом назначения 10.244.2.5.
При обращении через Service (ClusterIP) в цепочку вмешивается kube-proxy: он добавляет правила iptables (или ipvs), которые выполняют DNAT — подменяют IP сервиса на IP одного из Pod-эндпоинтов. После DNAT пакет идёт по описанному выше пути.
# Посмотреть правила kube-proxy для Service
iptables -t nat -L KUBE-SERVICES -n --line-numbers
# Посмотреть маршруты на ноде
ip route show table main
# Посмотреть VXLAN FDB (Flannel)
bridge fdb show dev flannel.1
tcpdump на интерфейсах ноды и nsenter для входа в netns Pod.