LINUX.ORG.RU
ФорумAdmin

Docker Overlay Network + Tailscale VPN

 ,


0

2

Есть несколько серверов объединённых в одну виртуальную сеть с помощью Tailscale VPN. На них установлен Docker и все сервера объединены в Docker Swarm, при этом от Docker Swarm используются лишь overlay network, без всего остального - контейнеры запускаются обычным docker compose.

Есть несколько overlay network созданных вручную с флагом attachable. В compose эти сети прописаны как external и некоторые контейнеры их используют.

На двух серверах из трёх всё работает хорошо - но там меньше десятка контейнеров на каждом. А вот на третьем сервере контейнеров 25 (и чуть ли не половина из них подключена к той или иной overlay network).

При перезагрузке стабильно не могут запустится (они запускаются за счёт restart=unless-stopped) 2-3 контейнера из числа тех, которые подключены к overlay network. Каждый раз это разные контейнеры.

Статус у них:

failed to set up container networking: attaching to network failed, make sure your network options are correct and check manager logs: context deadline exceeded

Если вручную сделать им docker compose up, они успешно стартуют.

Но мне то нужна автоматика - сервер должен сам поднять все сервисы в рабочее состояние после ребута.

В данный момент единственная кастомизация докера - добавление ему зависимости от tailscale в systemd юнит:

$ cat /etc/systemd/system/docker.service.d/override.conf 
[Unit]
Requires=tailscaled.service network-online.target
After=tailscaled.service network-online.target

[Service]
ExecStartPre=/bin/sh -c 'until ip link show tailscale0 >/dev/null 2>&1; do echo "Waiting for tailscale0 interface..."; sleep 1; done; until [ "$(tailscale status --json | jq -r .BackendState)" = "Running" ]; do echo "Waiting for Tailscale..."; sleep 1; done'

Это решило проблему, что зависимые от оверлейной сети контейнеры вообще не стартовали, но осталась проблема, что парочка случайных контейнеров не может стартовать на сервере, где их много.

Проблема усугубляется тем, что ошибка создания контейнера не считается его падением и restart не срабатывает.

UPD: Вроде решил с помощью:

$ cat /etc/systemd/system/docker.service.d/override.conf 
[Unit]
Requires=tailscaled.service network-online.target
After=tailscaled.service network-online.target

[Service]
ExecStartPre=/bin/sh -c 'until ip link show tailscale0 >/dev/null 2>&1; do echo "Waiting for tailscale0 interface…"; sleep 1; done; until [ "$(tailscale status --json | jq -r .BackendState)" = "Running" ]; do echo "Waiting for Tailscale…"; sleep 1; done'
ExecStartPost=/bin/bash -c 'sleep 30 && docker start $(docker ps -a -q --filter status=exited --filter status=created)'

Но непонятно насколько надёжно. Нет ли решений лучше.

★★★★★

Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от ALiEN175
[Unit]
Description=Tailscale node agent
Documentation=https://tailscale.com/kb/
Wants=network-pre.target
After=network-pre.target NetworkManager.service systemd-resolved.service

[Service]
EnvironmentFile=/etc/default/tailscaled
ExecStart=/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS
ExecStopPost=/usr/sbin/tailscaled --cleanup

Restart=on-failure

RuntimeDirectory=tailscale
RuntimeDirectoryMode=0755
StateDirectory=tailscale
StateDirectoryMode=0700
CacheDirectory=tailscale
CacheDirectoryMode=0750
Type=notify

[Install]
WantedBy=multi-user.target
KivApple ★★★★★
() автор топика