Сегодня, после обновления на Docker 1.9 у меня вполне ожидаемо сломался ранее прекрасной работающий Weave.
Описание возникших проблем и их решение под катом.


Проблема №1.

Проявляется в Ubuntu 14.04.

При попытке выполнить weave launch происходит следующее:
root@sahara:~/weave# /usr/local/bin/weave launch --no-dns --init-peer-count 8  --ipalloc-range 10.128.0.0/10 10.43.68.61 10.43.68.62 10.43.68.63 10.43.68.64 10.43.68.65 10.43.68.69 10.43.68.70
Error deleting container: Error response from daemon: Unable to remove filesystem for 4f15a00bcf3b7d6df83ed8467cad98177df331d2deed580c4547effc2db13a02: remove /var/lib/docker/containers/4f15a00bcf3b7d6df83ed8467cad98177df331d2deed580c4547effc2db13a02/shm: device or resource busy


Как выяснилось, это уже известная проблема:
github.com/weaveworks/weave/issues/1647
github.com/weaveworks/weave/issues/1652

Там пишут, что, возможно, поможет переход на использование overlayfs вместо aufs, но мне помогла установка ядра 3.19 (пакет linux-image-extra-virtual-lts-vivid)

Спасибо за помощь ребятам из Weave, сидящим на канале #weavenetwork в IRC

Проблема №2

Вторая проблема связана с тем, что я использую Weave для связи контейнеров в кластере Mesos + Kubernetes, и мне совсем не нужны болтающиеся неиспользуемые eth0 в контейнерах. Тем более, что я это настраивал еще во время Weave 1.0, когда еще не были придуманы методы адекватной связки Mesos и Weave.

Поэтому я использовал не рекомендуемый официально метод привязки weave к контейнерам заменой моста docker0 на weave.
Это работало вплоть до Docker 1.8 + Weave 1.1.1
Сегодня же все сломалось:

root@sahara:~/weave# /usr/local/bin/weave launch-router --no-dns --init-peer-count 8  --ipalloc-range 10.128.0.0/10 10.43.68.61 10.43.68.62 10.43.68.63 10.43.68.64 10.43.68.65 10.43.68.69 10.43.68.70
Error response from daemon: Cannot start container b5c0d3e7b69a0101586d1ffe79862f292ed72b72d3f6bf5e21debf086b81db67: [8] System error: failed to set gateway while updating gateway: network is unreachable
root@sahara:~/weave# 

Тут уже помощь клуба из IRC не помогла, пришлось выплывать самому.
Путем долгих проб и ошибок выяснилось, что корень зла крылся в присвоении статического IP адресв мосту weave при начальной конфигурации.
А именно. Ранее я поднимал мост такой записью в /etc/network/interfaces.d/weave:

auto weave
iface weave inet manual
        pre-up /usr/local/bin/weave --local create-bridge
        post-up ip addr add dev weave 10.4.7.1/16
        pre-down ifconfig weave down
        post-down brctl delbr weave

Как выяснилось, если убрать ip add..., то docker --bridge weave запускается и нормально работает.
Так же, для запуска weave в таком режиме требуется выключать FASTDP:
export WEAVE_NO_FASTDP=1
В итоге, релевантные части фалов настройки:
/etc/network/interfaces.d/weave:

auto weave
iface weave inet manual
        pre-up WEAVE_NO_FASTDP=1 /usr/local/bin/weave --local create-bridge
        pre-down ifconfig weave down
        post-down brctl delbr weave

/etc/init/weave.conf:

start on filesystem and started docker
respawn
script
    export DOCKER_BRIDGE=weave
    export WEAVE_NO_FASTDP=1
    /usr/local/bin/weave launch-router --no-dns --init-peer-count 8  --ipalloc-range 10.128.0.0/10 10.43.68.61 10.43.68.62 10.43.68.63 10.43.68.64 10.43.68.65 10.43.68.69 10.43.68.70
    /usr/local/bin/weave expose 10.4.7.1/16
    /usr/bin/docker attach weave
end script

/etc/default/docker:
DOCKER_NETWORK_OPTS="--bridge weave --fixed-cidr=10.4.7.0/24"


Теперь все работает как и раньше.

Возможно, этот опыт сэкономит кому-нибудь время и нервы.

Комментарии (8)


  1. lega
    09.11.2015 20:43

    А вы не пробовали Multi-host Networking который появился в 1.9?


    1. tchu
      09.11.2015 21:43

      Попробовать безусловно стоит. Но конкретно в данном случае мне требовалось обновить отдельно стоящую ноду, к. нужен доступ внутрь работающего кластера. Можно было, конечно, сделать по кошерному с weave proxy, но хотелось понять, можно ли использовать решение с подменой моста и дальше. Оказалось таки можно


  1. Eternalko
    10.11.2015 07:08

    C обновлением! Пост в закладки, скоро тоже обновляться буду


  1. kay
    10.11.2015 11:30
    +1

    Могу в качестве альтернативы посоветовать flannel с VXLAN бэкендом. Последние версии могут работать без etcd.

    www.generictestdomain.net/docker/weave/networking/stupidity/2015/04/05/weave-is-kinda-slow


    1. tchu
      10.11.2015 16:05

      Спасибо! Выглядит очень симпатично. Особенно интересно AWS VPC backend


  1. Aliance
    15.11.2015 20:52

    Вопрос возможно немного не по теме, все же:
    После обновления докера до 1.9 контейнеры более не видят друг друга (даже с --link), говорят что нужно вручную создать сеть через docker network create и явно указать их при создании обоих контейнеров (--net). Знает кто-нибудь конкретнее?


    1. lega
      15.11.2015 20:59

      Попробуйте пересоздать контейнеры, они вроде не убивали --link.


      1. Aliance
        15.11.2015 21:24

        Они пофиксили баг. Раньше все контейнеры видели друг друга без проблем, а теперь виден только линкованный