Docker 1.9 + Weave 1.2.1 bridge mode
Сегодня, после обновления на 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"
Теперь все работает как и раньше.
Возможно, этот опыт сэкономит кому-нибудь время и нервы.