54
Каждому контейнеру - по IP Konstantin Nazarov [@racktear]

Docker networking

Embed Size (px)

Citation preview

Page 1: Docker networking

Каждому контейнеру - по IP

Konstantin Nazarov [@racktear]

Page 2: Docker networking

Docker и сеть

Page 3: Docker networking

Мой случай: Tarantool облако

Page 4: Docker networking

Требование1:Маршрутизируемый IP

Page 5: Docker networking

Требование2:Связь между контейнерами

Page 6: Docker networking

Зачем нужен внешний IP

• Внешние системы без service discovery

• Маленький downtime при "переезде"

• Можно обойтись без оркестрации

Page 7: Docker networking

Так в чем проблема?

Page 8: Docker networking

Так в чем проблема?

Page 9: Docker networking

Так в чем проблема?

Docker сам настраивает Bridge

Page 10: Docker networking

Опция 1: port forwarding

Page 11: Docker networking

Опция 2: load balancer

Page 12: Docker networking

Все еще не то

• Балансировщик нужно настраивать

• Есть одна точка отказа

• Сложно управлять

Page 13: Docker networking

Как это работает

Page 14: Docker networking

Обычная конфигурация

Page 15: Docker networking

veth$ ip link add veth0 type veth peer name veth1

Page 16: Docker networking

network namespace$ ip link set veth1 netns ns1

Page 17: Docker networking

И собственный TCP/IP стек

Page 18: Docker networking

Port Forwarding

Page 19: Docker networking

Решение 1: NAT

Page 20: Docker networking

Добавим еще один IP на хост$ ip addr add <IP2> dev eth0

Page 21: Docker networking

Форвардим порты контейнера на IP2$ docker run -p <IP2>:80:80

Page 22: Docker networking

Опционально: SNAT

Page 23: Docker networking

Pros

• Работает "из коробки"

• Просто в обслуживании

Page 24: Docker networking

Cons

• Не работает через Docker API

Page 25: Docker networking

Решение 2: pipework

Page 26: Docker networking

Решение 2: bridgesВручную или через pipework

Page 27: Docker networking

Pipework$ docker run -name web1 -d apache

$ pipework mybridge web1 <IP>

Page 28: Docker networking

Pipework$ docker run -name web1 -d apache

$ pipework mybridge web1 <IP>

Page 29: Docker networking

Pros

• Гибко

• Просто

• Можно сделать еще много интересного

Page 30: Docker networking

Cons

• Не делается через Docker API

• Сложно встраивать в init/systemd

Page 31: Docker networking

Решение 3: macvlan

Page 32: Docker networking

macvlanвиртуальный интерфейс без "пары"

Page 33: Docker networking

macvlanможно "отдать" в контейнер

Page 34: Docker networking

Pros

• Работает очень быстро

• Поддерживается pipework

• Поддерживается в docker-experimental

Page 35: Docker networking

Cons

• Контейнеры не видны с хоста (без хаков)

• Требует пересборки докера

• (Или недоступно через API)

Page 36: Docker networking

Решение 4: overlay net(или vxlan)

Page 37: Docker networking

vxlan

Page 38: Docker networking

vxlan в докере

Page 39: Docker networking

+ хостовый интерфейс

Page 40: Docker networking

Pros

• Хорошая изоляция

• Работает из коробки

• Работает с Docker Swarm

Page 41: Docker networking

Cons

• Требует внешнего KV хранилища

• Сложно "пустить" трафик снаружи

• Требует отдельного контейнера для роутинга

Page 42: Docker networking

Решение 5: weave

Page 43: Docker networking

weave

• Использует vxlan "под капотом"

• Может работать поверх "неудобных" топологий

• Имеет свой service discovery

• ... и load balancing

Page 44: Docker networking

Pros

• Работает как плагин к libnetwork

• Можно использовать через Docker API

• Можно попасть в overlay с хоста (expose)

Page 45: Docker networking

Cons

• Много компонентов

• Нужен Docker API Proxy

• Имеет свой собственный gossip/kv хранилище

Page 46: Docker networking

Решение 6: bridge

Page 47: Docker networking

libnetwork

Page 48: Docker networking

Вопросы:

• Как докер создает бридж?

• Как он его конфигурирует?

Page 49: Docker networking

    bridgeAlreadyExists := bridgeIface.exists()     if !bridgeAlreadyExists {         bridgeSetup.queueStep(setupDevice)     }

    // Even if a bridge exists try to setup IPv4.     bridgeSetup.queueStep(setupBridgeIPv4)

Page 50: Docker networking

Выводы

• Можно модифицировать бридж "извне"

• Но не IPv4 настройки: их "заменит"

Page 51: Docker networking

В заключение

Page 52: Docker networking

• Стандартные бриджи медленнее openvswitch

• Если нужна скорость - macvlan

• В другом случае - лучше бриджи (это просто)

• Overlay - с осторожностью

Page 53: Docker networking

Чего ждать?

• libnetwork + hashicorp memberlist

• openvswitch портируют на DPDK

Page 54: Docker networking

Спасибо!

Konstantin Nazarov [@racktear]