Шаг 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:
1 parent
f34d2edefa
commit
fa389f119b
17 files changed
+678
-61
No files matched your search
+19
-10
@@ -1,11 +1,11 @@
|
||||
# Потоки данных: балансировка приватного трафика
|
||||
|
||||
**Дата:** 2026-08-17
|
||||
**Дата:** 2026-08-18 (обновлено после шага 5 — динамический MAC/ARP)
|
||||
**Область:** путь пакета от клиента внутри приватного сегмента на приватный
|
||||
листенер (`10.20.0.100:80` или `10.30.0.100:80`) и обратно.
|
||||
**Смежный документ:** [PUBLIC_LB_DATAFLOW.md](PUBLIC_LB_DATAFLOW.md) —
|
||||
балансировка публичного трафика.
|
||||
**Источник:** `lb/pipeline.sh`, `lb/topology.env`, [STEP3_SUMMARY.md](STEP3_SUMMARY.md).
|
||||
**Источник:** `lb/pipeline.sh`, `lb/topology.env`, [STEP3_SUMMARY.md](STEP3_SUMMARY.md), [STEP5_SUMMARY.md](STEP5_SUMMARY.md).
|
||||
|
||||
Отличие от публичного случая: клиент может стоять **в одном сегменте с
|
||||
бэкендами**. Тогда ответ бэкенда уходит клиенту по L2 напрямую, минуя
|
||||
@@ -70,11 +70,12 @@ flowchart TD
|
||||
T5 -->|"не наш адрес"| T25
|
||||
T10{"<b>10</b> листенер<br/>tcp VIP:80"} --> T11["<b>11</b> таблица слотов<br/>reg1 → reg2 (общая<br/>с публичным листенером)"]
|
||||
T11 -->|"пул пуст"| DROPF(["drop — fail-close"])
|
||||
T11 --> T12{"<b>12</b> применение члена"}
|
||||
T11 --> T12{"<b>12</b> применение члена<br/>ct(commit,nat)"}
|
||||
|
||||
T12 -->|"<b>член в сегменте клиента</b><br/>mod_dl_dst + ct(commit,nat)<br/><b>без dec_ttl</b>"| T25
|
||||
T12 -->|"член в другом сегменте<br/>ct(commit,nat)"| T20["<b>20/21</b> маршрутизация<br/>dec_ttl, adjacency"]
|
||||
T20 --> OUTR(["output: порт члена<br/>в другом сегменте"])
|
||||
T12 -->|"<b>член в сегменте клиента</b><br/><b>без dec_ttl</b>, минуя таблицу 20"| T21
|
||||
T12 -->|"член в другом сегменте"| T20["<b>20</b> маршрутизация<br/>dec_ttl"]
|
||||
T20 --> T21["<b>21</b> adjacency<br/>MAC члена + порт —<br/>резолвит hcd через ARP<br/>ядра (шаг 5), единое<br/>место для обоих путей"]
|
||||
T21 --> OUTR(["output: порт члена"])
|
||||
|
||||
T15 --> T16["<b>16</b> пост-ct"] --> T20
|
||||
T24{"<b>24</b> обратная трансляция<br/>сегмента"}
|
||||
@@ -87,6 +88,11 @@ flowchart TD
|
||||
class DROPF d
|
||||
```
|
||||
|
||||
Таблица 21 — единственное место, где применяется MAC следующего перехода, для
|
||||
обоих путей сразу: и для члена в сегменте клиента (сюда ведёт таблица 12
|
||||
напрямую, без `dec_ttl`), и для члена в другом сегменте (сюда приходят из
|
||||
таблицы 20, уже после `dec_ttl`). MAC члена не дублируется между таблицами.
|
||||
|
||||
## 3. Основной поток: клиент и член пула в одном сегменте
|
||||
|
||||
Тот самый случай, ради которого сегмент переведён на порты OVS.
|
||||
@@ -105,8 +111,9 @@ sequenceDiagram
|
||||
Note over OF: t0: reg0=2, обучение FDB и adjacency
|
||||
Note over OF: t1: dl_dst = MAC шлюза, nw_dst = VIP → листенер
|
||||
Note over OF: t10 → t11: слот → член пула
|
||||
Note over OF: t12: mod_dl_dst = MAC be1,<br/>ct(commit, nat(dst=10.20.0.2:8080))<br/><b>dec_ttl не выполняется</b>
|
||||
OF->>B: t25: FDB → порт be1
|
||||
Note over OF: t12: ct(commit, nat(dst=10.20.0.2:8080))<br/>→ t21 напрямую, минуя t20
|
||||
Note over OF: t21: mod_dl_dst = MAC be1 (резолвлен hcd<br/>через ARP ядра, шаг 5), output порт be1<br/><b>dec_ttl не выполнялся</b>
|
||||
OF->>B: пакет в порт be1
|
||||
Note over B: client=10.20.0.10 — исходный адрес клиента<br/>served=10.20.0.2:8080 — трансляция 80 → 8080
|
||||
B->>OF: ответ src=10.20.0.2:8080 → 10.20.0.10,<br/>dst MAC = MAC клиента (сосед по L2)
|
||||
Note over OF: t1: dl_dst ≠ MAC шлюза → t24
|
||||
@@ -181,8 +188,9 @@ flowchart TD
|
||||
| 5 | `arp_tpa` = VIP, шлюз или `.253` | ответ `IN_PORT` | MAC-ом порта сегмента |
|
||||
| 5 | прочий ARP | → t25 | ВМ резолвят друг друга сами |
|
||||
| 10 | `tcp`, `nw_dst` = VIP сегмента | `multipath` → t11 | тот же `pool_id` и хэш, что у публичного |
|
||||
| 12 | `reg0` = сегмент члена | `mod_dl_dst` + `ct(commit,nat)` → t25 | **без `dec_ttl`** |
|
||||
| 12 | `reg0` = сегмент члена | `ct(commit,nat)` → t21 напрямую | **без `dec_ttl`**, минуя t20 |
|
||||
| 12 | прочее | `ct(commit,nat)` → t20 | член из другого сегмента |
|
||||
| 21 | `nw_dst` = член пула | prio 100, `mod_dl_dst` + `output` | MAC резолвит `hcd` через ARP ядра (шаг 5) — единое место для обоих путей |
|
||||
| 24 | `nw_src` = член, `tp_src` = 8080 | `ct(nat)` → t25 | снимает DNAT с ответа соседу |
|
||||
| 24 | prio 0 | → t25 | обычный трафик проходит нетронутым |
|
||||
| 25 | `eth_dst` из FDB | `output` | записи `learn`, `idle_timeout` 300 с |
|
||||
@@ -203,7 +211,8 @@ flowchart TD
|
||||
|
||||
```bash
|
||||
make trace SRC=10.20.0.10 SPORT=40000 SEG=p2 # путь сессии по таблицам
|
||||
make fdb # выученные MAC и счётчики рассылки
|
||||
make fdb # выученные MAC клиентов и счётчики рассылки
|
||||
make neigh # MAC членов пула, резолвленный hcd через ARP
|
||||
make ports # подключены ли ВМ сегментов
|
||||
docker compose exec lb-router lbctl flows 24 # счётчики обратной трансляции
|
||||
docker compose exec cli2 curl -s http://10.20.0.100/
|
||||
|
||||
Reference in new issue
Block a user