Шаг 5: динамическое изучение MAC/ARP для бэкендов

MAC каждого члена пула больше не статическая константа в topology.env,
а резолвится демоном hcd через обычный ARP ядра — в реальном
окружении MAC бэкенда заранее не известен (сервер ещё не подключён,
NIC может замениться), топология не описывается статически, в отличие
от стенда.

hcif-порты (единственные адреса узла в ядре) уже были настоящими
L3-интерфейсами в тех же сегментах, что и бэкенды — единственное, что
мешало обычному ARP, это permanent-записи ip neigh в entrypoint.sh.
Убрав их и добавив hc/neigh.go (читает ip -json neigh show, точечно
заливает бандл в таблицу 21 на том же тикере, что и health-пробы),
получили резолвер без нового OpenFlow-контроллера.

Таблица 21 стала единственным источником MAC для обоих путей —
маршрутизируемого и коммутируемого (шаг 3): таблица 12 больше не
дублирует MAC инлайново, ct(commit) ведёт сразу в таблицу 21.

Исправлен попутно найденный баг: после apply.sh (replace-flows)
таблица 21 не восстанавливалась, поскольку syncNeighbors сравнивал
MAC с памятью демона, а не с датапасом. Добавлен force-режим по
аналогии с Agent.apply(), плюс регрессионная проверка в verify.sh.

Проверено на живом стенде: MAC всех четырёх членов резолвлен и
совпадает с реальными интерфейсами; смена MAC "железа" обнаружена и
применена без вмешательства за счёт штатного старения ARP ядра.
Регрессия: 94 из 94 проверок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ayurishchevandClaude Opus 5 committed 2026-08-19 12:33:48 +03:00
1 parent f34d2edefa
commit fa389f119b
17 files changed
+678 -61

No files matched your search

+6
View File
@@ -25,6 +25,12 @@ VIP_PORT=80
# Адрес шлюза LB_P2_IP и VIP приватного листенера P2_VIP отвечают одним MAC
# (P2_MAC) — по нему пайплайн отличает L3-трафик к маршрутизатору от
# L2-трафика сегмента.
#
# BE*_MAC (шаг 5): это уже не источник правды для OpenFlow, а «заводской» MAC,
# который attach-segment.sh назначает интерфейсу ВМ — эмуляция того, что в
# реальности прошито в NIC сервера. В таблицу 21 этот MAC не подставляется:
# его заново резолвит hcd через обычный ARP на hcif-порту (hc/neigh.go) и
# заливает в датапас сам. pipeline.sh эти переменные больше не читает.
P2_IFNAME=p2
P2_OFPORT=2
P2_MAC=02:42:0a:14:00:01