Що таке overlay network і коли вона потрібна?
Docker overlay network це відповідь на «як container на host A говорять з container на host B?». Він будує віртуальну L2-мережу поверх існуючої IP-мережі через VXLAN-енкапсуляцію, тож container бачать одне одного, ніби на тому самому фізичному LAN, незалежно від того, на якому host вони реально крутяться.
Теорія
TL;DR
- Overlay = мережа, що охоплює кілька Docker host (Swarm node).
- Побудовано на VXLAN (Virtual eXtensible LAN, RFC 7348). Кожен пакет container загортається у UDP-пакет і шиппиться через underlay-мережу.
- Потребує Docker Swarm, спочатку
docker swarm init. Без Swarmdocker network create --driver overlayпадає з помилкою. - Шифрується через
--opt encryptedпри створенні; використовує IPsec/AES-GCM у сучасному Swarm. - Бери, коли: Swarm-сервіси потребують cross-host service discovery і load balancing.
- Пропусти, коли: single host (bridge достатньо) або Kubernetes (свої CNI-плагіни, не Docker overlay).
Швидкий приклад
# Ініціалізуємо Swarm на першому node
node-1$ docker swarm init --advertise-addr 192.168.1.10
# Видає join-токен; запускай на кожному worker:
node-2$ docker swarm join --token SWMTKN-... 192.168.1.10:2377
# На менеджері створюємо overlay
node-1$ docker network create --driver overlay --attachable appnet
# Деплоїмо сервіс через node
node-1$ docker service create --name api --network appnet --replicas 5 myapp
# 5 container розкидані по обох node; усі на appnet, всі дістають одне одного.
# Container на node-1 і node-2 пингують один одного по service-імені
node-1$ docker exec <api-container> ping api # round-robin через Swarm DNSБез overlay container api на node-1 не має IP-маршруту до container на node-2. З overlay трафік VXLAN-загортається і тунелюється.
Як працює VXLAN-енкапсуляція
container A (10.0.0.5) на node-1 container B (10.0.0.6) на node-2
| |
| пакет: src=10.0.0.5 dst=10.0.0.6 |
v ^
+-----------------+ +-----------------+
| overlay vxlan | | overlay vxlan |
| загортає у UDP/4789| underlay: 192.168.1.10/.20 | розгортає |
+-----------------+ ────────────────────────────►+-----------------+
| ^
| на проводі: UDP 4789, payload = оригінальний пакет|
v |
host eth0 (192.168.1.10) ──────────────────────────► host eth0 (192.168.1.20)Overlay-мережа має свій IP-простір (наприклад, 10.0.0.0/24). Кожен container отримує IP там. Host має окремий IP на underlay (192.168.1.0/24). Пакети container загортаються у UDP-пакети до underlay-IP цільового host.
Service discovery на overlay
Overlay-мережі включають embedded DNS Docker Swarm плюс вбудований load balancer («routing mesh»):
# Сервіс "api" має 5 реплік на 3 node. Всередині будь-якого container на appnet:
$ nslookup api
Server: 127.0.0.11
Address 1: 10.0.1.5 api
# Віртуальний IP, що балансує між 5 реплік через IPVS.Service-ім'я резолвиться у virtual IP. З'єднання з цим VIP розподіляються між здоровими репліками через kernel-модуль IPVS на кожному node. Container не мають знати, який фізичний host крутить яку репліку.
Шифровані overlay
docker network create --driver overlay --opt encrypted my-secure-netДодає AES-GCM шифрування між Swarm-node. Корисно, коли underlay-мережа не довірена (cross-region, публічний інтернет між node). Performance-cost реальний, але зазвичай прийнятний.
Коли потрібен overlay
- Docker Swarm-сервіси, що крутяться на більше ніж одному node і мають говорити один з одним.
- Service-to-service трафік, що не повинен іти через публічний інтернет (overlay через VPN-зв'язані датацентри).
- Будь-де, де один bridge не дістає, бо container живуть на різних host.
Коли overlay НЕ потрібен
- Single Docker host: bridge простіший і швидший.
- Kubernetes: використовує CNI-плагіни (Calico, Flannel, Cilium), не Docker overlay. K8s має свій еквівалент на рівні кластера.
- Зовнішнє спілкування: container дістають інтернет через NAT, незалежно від типу мережі. Overlay для container-to-container, не container-to-internet.
Типові помилки
Спроба overlay без Swarm
$ docker network create --driver overlay test
Error response from daemon: This node is not a swarm manager.Overlay це Swarm-фіча. docker swarm init спочатку.
Забути --attachable
# Без --attachable лише Swarm-сервіси можуть приєднатися.
# Standalone `docker run --network myoverlay` падає.
docker network create --driver overlay myoverlay
# З --attachable і сервіси, і standalone container можуть приєднатися.
docker network create --driver overlay --attachable myoverlayДля змішаних workflow (сервіс + ad-hoc debug-container) бери --attachable.
Underlay-firewall блокує VXLAN
VXLAN використовує UDP port 4789. Swarm потребує ще TCP/UDP 7946 (gossip) і TCP 2377 (manager API). Cloud security group або on-prem firewall між node мають їх дозволяти.
Брати overlay для single-host сетапу
Жодної переваги, реальний overhead (VXLAN encap, навіть коли обидва endpoint локальні). Тримайся bridge, поки реально не підеш у multi-host.
Реальне застосування
- Swarm production: кожне cross-host з'єднання сервісу. Swarm будує overlay-мережу
ingressавтоматично для routing mesh. - Multi-region Swarm: шифрований overlay через cloud-регіони, VXLAN-тунель через WAN. Працює, але будь чесним щодо latency.
- Гібридні демо / lab-сетапи: overlay через пару лептопів на воркшопі для симуляції multi-host без K8s.
Питання для поглиблення
Q: Яка різниця між overlay і bridge?
A: Bridge single-host (усі container на одному Docker daemon). Overlay multi-host (container на різних машинах). Overlay переносить L2-абстракцію через IP-underlay; bridge це просто Linux bridge на одному host.
Q: Чи працює overlay зі звичайними docker run container, чи тільки з сервісами?
A: Обидва, якщо створюєш overlay з --attachable. Без цього флага лише Swarm-сервіси можуть використовувати.
Q: Чому б не використовувати overlay завжди, навіть на single host?
A: Performance-overhead (VXLAN-енкапсуляція). Складність (потребує запущений Swarm). Для single host bridge дає той самий container DNS без overhead.
Q: Як Docker overlay відрізняється від Kubernetes pod networking?
A: Обидва вирішують cross-host container-to-container connectivity. Docker overlay вбудовано у Swarm і використовує VXLAN. Kubernetes використовує CNI-плагіни, яких багато (деякі VXLAN-based як Flannel, інші routing-based як Calico). Різні екосистеми, схожа задача.
Q: (Senior) Що таке routing mesh у Docker Swarm і як він пов'язаний з overlay?
A: Routing mesh це спеціальний overlay під назвою ingress, що Swarm створює автоматично. Коли публікуєш service-порт (-p 80:80 на docker service create), кожен Swarm-node слухає host:80, і трафік, що прибуває, форвардиться через overlay до node, що реально крутить репліку. У комбінації з IPVS load balancing на кожному node ти отримуєш будь-який-node-може-приймати-трафік без зовнішніх load balancer. Caveat: routing-mesh DNAT може ламати видимість source IP, бери --publish mode=host, якщо потрібні реальні client IP.
Приклади
Налаштування two-node Swarm з overlay
# Node 1 (менеджер)
node-1$ docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (xxx) is now a manager.
To add a worker: docker swarm join --token SWMTKN-... 192.168.1.10:2377
# Node 2 (worker)
node-2$ docker swarm join --token SWMTKN-... 192.168.1.10:2377
# Перевіряємо
node-1$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
xxx node-1 Ready Active Leader
yyy node-2 Ready Active
# Створюємо overlay
node-1$ docker network create --driver overlay --attachable appnet
# Деплоїмо сервіс на обидва node
node-1$ docker service create --name api --replicas 4 --network appnet myapp
# Підтверджуємо розміщення
node-1$ docker service ps api
# 4 репліки, 2 на кожному nodeШифрований overlay через регіони
# На Swarm, де node живуть у різних cloud-регіонах
$ docker network create --driver overlay \
--opt encrypted \
--subnet 10.5.0.0/16 \
secure-net
$ docker service create --name api --replicas 6 --network secure-net myapp
# Трафік сервісу між us-east-1 і eu-west-1 тепер AES-зашифровано в transit.Флаг шифрування додає IPsec ESP між host. CPU-cost: помітний для high-throughput сервісів; зазвичай нормально для звичайного RPC-трафіку.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.
Коментарі
Ще немає коментарів