Перейти к содержанию

Сетевая архитектура CNI плагинов

Распределённая маршрутизация трафика

Как работает

Платформа использует Cilium в качестве CNI. Cilium реализует распределённую модель маршрутизации: агент cilium-agent запускается на каждом worker-узле как DaemonSet и самостоятельно обрабатывает весь трафик подов, размещённых на этом узле. Никаких выделенных нод-маршрутизаторов в схеме нет — каждый узел маршрутизирует трафик своих подов локально средствами eBPF.

Конфигурация Cilium

Параметр kube-proxy-replacement: true означает, что Cilium полностью заменяет kube-proxy и самостоятельно реализует всю логику Service на каждом узле через eBPF-программы, без обращения к центральному компоненту:

kube-proxy-replacement: 'true'

Межузловая связность обеспечивается через VXLAN-туннели между агентами:

routing-mode: tunnel
tunnel-protocol: vxlan

Каждый cilium-agent знает о расположении подов на всех узлах кластера и самостоятельно инкапсулирует трафик в туннель до узла назначения. Трафик между подами на разных узлах идёт напрямую node-to-node, без транзита через третий узел:

synchronize-k8s-nodes: 'true'

Адресное пространство подов управляется через cluster-pool — каждому узлу выделяется собственный подсетевой префикс /24 из пула 172.20.0.0/16. Трафик между подами на одном узле маршрутизируется полностью локально и не покидает его сетевой стек:

ipam: cluster-pool
cluster-pool-ipv4-cidr: 172.20.0.0/16
cluster-pool-ipv4-mask-size: '24'

Пример: трафик между подами на разных узлах

Допустим, Pod-A запущен на узле A (172.20.1.5), Pod-B — на узле B (172.20.2.7).

┌─────────────────────────┐                        ┌─────────────────────────┐
│         Узел A          │                        │         Узел Б          │
│                         │                        │                         │
│  ┌─────────────────┐    │                        │    ┌─────────────────┐  │
│  │     Pod-A       │    │                        │    │     Pod-B       │  │
│  │   172.20.1.5    │    │                        │    │   172.20.2.7    │  │
│  └────────┬────────┘    │                        │    └────────▲────────┘  │
│           │ 1           │                        │           5 │           │
│  ┌────────▼────────┐    │                        │    ┌────────┴────────┐  │
│  │  cilium-agent   │    │                        │    │  cilium-agent   │  │
│  │eBPF · таб.маршр.│    │                        │    │  eBPF · decap   │  │
│  └────────┬────────┘    │                        │    └────────▲────────┘  │
│           │ 2           │                        │           4 │           │
│  ┌────────▼────────┐    │                        │    ┌────────┴────────┐  │
│  │  VXLAN encap    │    │   3 · node-to-node     │    │  VXLAN decap    │  │
│  │  → узел Б       ├────┼────────────────────────┼────►  доставка       │  │
│  └─────────────────┘    │      (туннель)         │    └─────────────────┘  │
└─────────────────────────┘                        └─────────────────────────┘
  1. Pod-A отправляет пакет на адрес Pod-B (172.20.2.7). Пакет попадает в сетевой стек узла A.
  2. eBPF-программа cilium-agent на узле A смотрит в локальную таблицу маршрутизации Cilium и определяет, что 172.20.2.0/24 принадлежит узлу Б. Адрес узла Б известен благодаря synchronize-k8s-nodes: true.
  3. cilium-agent инкапсулирует пакет в VXLAN-туннель и отправляет его напрямую на узел Б (node-to-node, без транзита через третий узел).
  4. cilium-agent на узле Б принимает пакет и декапсулирует его.
  5. Пакет доставляется Pod-B.

Обратный трафик от Pod-B к Pod-A проходит симметрично в обратном направлении.
Трафик в обратную сторону автоматически разрешается, так как информация об установленном соединении находится в таблице BPF Cilium.