Files
ayurishchevandClaude Opus 5 fa389f119b Шаг 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>
2026-08-19 12:33:48 +03:00

113 lines
3.8 KiB
Makefile

SHELL := /bin/bash
DC := docker compose
# Скрипты подготовки хоста требуют root. Под root sudo не нужен и может
# отсутствовать в системе.
SUDO := $(shell [ "$$(id -u)" = 0 ] || echo sudo)
.PHONY: help prereq shim shim-down build up down restart attach detach flows verify logs ports health slots drain enable metrics conns trace fdb neigh shell
help:
@echo "Стенд hpnn_v2 — OVS: маршрутизация, балансировка, коммутация сегментов"
@echo
@echo " make prereq загрузить модуль openvswitch на хосте"
@echo " make shim поднять macvlan-shim (проверка стенда с самого хоста)"
@echo " make shim-down снять shim"
@echo " make up собрать образы и запустить стенд"
@echo " make down остановить стенд и удалить сети"
@echo " make attach подключить ВМ сегментов к br-lb (после пересоздания)"
@echo " make detach снять порты сегментов с моста"
@echo " make flows перечитать pipeline.sh и перезалить пайплайн"
@echo " make verify прогнать проверки"
@echo " make ports порты моста br-lb"
@echo " make health состояние членов пула по данным health-проб"
@echo " make slots раскладка таблицы слотов и счётчики"
@echo " make drain M=be1 вывести член из балансировки"
@echo " make enable M=be1 вернуть член в балансировку"
@echo " make metrics метрики Prometheus"
@echo " make conns таблица соединений ct"
@echo " make trace SRC=192.168.5.7 [SPORT=40000] [SEG=pub|p2|p3] ofproto/trace"
@echo " make fdb таблица коммутации сегментов (выученные MAC)"
@echo " make neigh MAC членов пула, резолвленный через ARP ядра"
@echo " make logs логи контейнеров"
@echo " make shell shell в контейнере lb-router"
prereq:
$(SUDO) scripts/host-prereq.sh
shim:
$(SUDO) scripts/host-prereq.sh --shim
shim-down:
$(SUDO) scripts/host-prereq.sh --shim-down
build:
$(DC) build
up: prereq
$(DC) up -d --build
@echo "Ждём готовности балансировщика..."
@for i in $$(seq 40); do \
$(DC) exec -T lb-router curl -fsS --max-time 2 http://127.0.0.1:9111/status >/dev/null 2>&1 && break; \
sleep 1; \
done
@$(MAKE) --no-print-directory attach
@echo "Ждём, пока health-пробы увидят членов пула..."
@sleep 6
@$(MAKE) --no-print-directory health
# Порты ВМ сегментов создаёт гипервизор; в стенде их создаёт этот скрипт.
# Повторить нужно после пересоздания любого контейнера сегмента.
attach:
$(SUDO) scripts/attach-segment.sh
detach:
$(SUDO) scripts/attach-segment.sh --detach
down:
$(DC) down
restart:
$(DC) restart lb-router
flows:
$(DC) exec -T lb-router /opt/lb/apply.sh
verify:
@scripts/verify.sh
logs:
$(DC) logs --tail=80
ports:
$(DC) exec -T lb-router lbctl ports
health:
$(DC) exec -T lb-router lbctl health
slots:
$(DC) exec -T lb-router lbctl slots
drain:
$(DC) exec -T lb-router lbctl drain $(M)
enable:
$(DC) exec -T lb-router lbctl enable $(M)
metrics:
$(DC) exec -T lb-router lbctl metrics
conns:
$(DC) exec -T lb-router lbctl conns
trace:
$(DC) exec -T lb-router lbctl trace $(SRC) $(SPORT) $(SEG)
fdb:
$(DC) exec -T lb-router lbctl fdb
neigh:
$(DC) exec -T lb-router lbctl neigh
shell:
$(DC) exec lb-router bash