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

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

Embed Size (px)

Citation preview

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

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

Konstantin Nazarov [@racktear]

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

Docker и сеть

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Опция 1: port forwarding

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

Опция 2: load balancer

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

Все еще не то

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

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

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

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

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

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

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

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

veth$ ip link add veth0 type veth peer name veth1

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

network namespace$ ip link set veth1 netns ns1

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

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

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

Port Forwarding

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

Решение 1: NAT

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

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

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

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

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

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

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

Pros

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

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

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

Cons

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

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

Решение 2: pipework

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

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

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

Pipework$ docker run -name web1 -d apache

$ pipework mybridge web1 <IP>

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

Pipework$ docker run -name web1 -d apache

$ pipework mybridge web1 <IP>

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

Pros

• Гибко

• Просто

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

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

Cons

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

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

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

Решение 3: macvlan

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

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

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

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

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

Pros

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

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

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

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

Cons

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

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

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

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

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

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

vxlan

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

vxlan в докере

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

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

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

Pros

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

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

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

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

Cons

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

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

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

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

Решение 5: weave

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

weave

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

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

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

• ... и load balancing

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

Pros

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

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

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

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

Cons

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

• Нужен Docker API Proxy

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

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

Решение 6: bridge

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

libnetwork

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

Вопросы:

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

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

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

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

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

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

Выводы

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

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

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

В заключение

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

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

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

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

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

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

Чего ждать?

• libnetwork + hashicorp memberlist

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

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

Спасибо!

Konstantin Nazarov [@racktear]