Skip to main content

Ошибки работы docker swarm

Описание проблемы​

При высоких нагрузках и перезагрузке серверов сервисов PGS может возникнуть ошибка работы сети pgs-network. Проблема характеризуется нарушением обмена данными между docker-контейнерами, расположенными на разных серверах в docker swarm. Связность docker swarm не нарушается, при выполнении команды docker node ls все ноды будут активными.

Диагностика​

Для диагностики следует проверить связность контейнеров сервиса nginx:

  1. Выполнить команду на двух серверах группы nginx:
docker inspect $(docker ps -q --filter name=pgs-nginx_nginx) \
--format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

В ответ на запрос будет выведен IP-адрес. Пример вывода:

10.10.0.100
  1. Сохранить IP-адреса `<IP1>` и `<IP2>` из п.1.

  2. Выполнить команду на двух серверах группы nginx:

docker exec -it $(docker ps -q --filter name=pgs-nginx_nginx) bash
echo "deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/1.7.6/uu/2/repository-extended 1.7_x86-64 main contrib non-free" \
> /etc/apt/sources.list
echo "deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/1.7.6/uu/2/repository-base 1.7_x86-64 main contrib non-free" >> /etc/apt/sources.list
apt update && apt install -y iputils-ping
ping <IP1>
ping <IP2>

где `<IP1>` и `<IP2>` — сохраненные из п.1.

Пример вывода будет содержать результаты команды ping:

ping 10.10.0.100
PING 10.10.0.100 (10.10.0.100) 56(84) bytes of data.
--- 10.10.0.100 ping statistics ---
60 packets transmitted, 0 received, 100% packet loss, time 466ms
ping 10.10.0.101
PING 10.10.0.101 (10.10.0.101) 56(84) bytes of data.
64 bytes from 10.10.0.101: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 10.10.0.101: icmp_seq=2 ttl=64 time=0.030 ms
64 bytes from 10.10.0.101: icmp_seq=3 ttl=64 time=0.038 ms
64 bytes from 10.10.0.101: icmp_seq=4 ttl=64 time=0.042 ms
--- 10.10.0.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 65ms
  1. При условии, что пинг до собственного IP-адреса выполняется, а пинг до второго nginx не проходит — существует проблема сети docker swarm.

Решение​

Перезагрузка активных нод в docker swarm. Порядок действий:

  1. Подключиться к серверу pgs-infra и выполнить команду:
docker node ls

В выводе будет представлен список доступных нод docker swarm. Пример вывода команды:

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4mgyh41mb6z51df0u6jsmwhhz * pgs-1-app-node-1 Ready Active Leader
b95vktgfjxcd1yndquehie3zl pgs-1-app-node-2 Ready Active Reachable
77b31zwu3fbnmg6etq8qaa0p6 pgs-1-app-node-3 Ready Active Reachable
nhb1kmdspgoi0zak2loqv5xl2 pgs-1-be-node-1 Ready Active Reachable
f7bw5i8vwojwempqgie843l48 pgs-1-be-node-2 Ready Active Reachable
3uogt3pmo8o5kks0ufntucjrz pgs-1-be-node-3 Ready Active Reachable
vd0bfgbbnoxhui7ug2nhjieis pgs-1-db-node-1 Ready Active Reachable
zhxnbmfslvxjk1ctv4xlypr17 pgs-1-db-node-2 Ready Active Reachable
nwhei83xj5uhuqenlibd1iejv pgs-1-infra-node-1 Ready Active Reachable
  1. Выполнить для каждой ноды команду:
docker node update --availability drain <HOSTNAME>

где `<HOSTNAME>` — имя ноды из списка.

  1. Подождать 5 минут.

  2. Выполнить для каждой ноды команду:

docker node update --availability active <HOSTNAME>
  1. Подождать 5–10 минут для запуска всех сервисов.

  2. Провести повторную диагностику, описанную выше.