Однажды я захотел увеличить свой swarm-кластер – добавить ему один воркер. Создал машину в DO простой командой:
docker-machine create --driver digitalocean --digitalocean-access-token $DIGITALOCEAN_ACCESS_TOKEN --digitalocean-image ubuntu-18-04-x64 --digitalocean-region fra1 --digitalocean-size s-1vcpu-1gb [some_name]
Подключился к ней и добавил в кластер:
eval $(docker-machine env [some_name])
docker swarm join --token [token] [IP-manager]:2377
Всё отлично! Появился новый воркер в кластере, и даже команда docker node ls
показывала нового персонажа. Ничего не предвещало беды.
Странные дела
Я развернул новый сервис на этом воркере и сразу был удивлён – запросы по сети к нему не доходили. Буд-то бы overlay-сеть кластера на нём не поднялась или как-то сбоил routing mesh. Но docker network ls
показывала обратное – сеть есть.
Покопавшись в интернетах натыкался на разные вещи, которые не очень-то помогали. Например, сеть не поднимается на ноде, если ни один сервис её не использует, что логично, но не мой случай.
Где-то на просторах stackoverflow наткнулся на мысль, что версии docker не совпадают, а от того и routing mesh может сбоить или ещё что. Идея мне показалось странной, т.к. это же вроде обратная совместимость. Но тем не менее проверил версии докеров и оказалось, что на новой ноде docker -v
выдавал Docker version 18.06.1-ce, build e68fc7a, а на старых Docker version 18.06.0-ce, build 0ffa825. Разница вроде небольшая, но я попробовал обновить docker на всех нодах. После этого всё отлично заработало и трафик стал приходить на новую ноду!
Для обновления докера надо зайти на каждую ноду не и запустить apt-get install docker-ce
. Подтянится самая актульная версия из реп DO (в противном случае можно установить репу докера).
Вывод
Всегда используйте одну версию докера на всех нодах кластера иначе могут быть странность. И лучше использовать самую актуальную версию, тем более обновление происходит быстро и почти безболезненно.