Сетка маршрутизации режима Swarm не работает, вместо этого по умолчанию работает как режим хоста

Описание

Сетка маршрутизации в режиме Swarm не работает, вместо этого она работает как в режиме хоста по умолчанию.

Мы развертывали рой из 3 главных узлов и 8 рабочих узлов, каждый из которых находился в отдельном экземпляре облачной службы OpenStack с использованием Terraform и Ansible. Сетка роя и маршрутизации работала отлично, так как она перестала работать и начала работать как в режиме хоста. Мы ничего не меняли, не обновляли и не развертывали новые сервисы. Мы попытались перезапустить рой и повторно развернуть рой и все сервисы, но ничего не помогло, мы не смогли снова заставить его работать в режиме сетки маршрутизации. Итак, мы решили уничтожить все экземпляры и начать с нуля (проблема описана ниже). Мы выполнили чистую установку Ubuntu 18.04 LTS и докера, как и раньше. Затем мы устанавливаем 1 главный узел и 2 рабочих (на этот раз вручную) и развертываем одну службу, но рой по-прежнему работает, как в режиме хоста.

Единственный способ получить доступ к услугам - это IP-адрес узла, на котором он работает, в противном случае ответа нет (тайм-аут). Мы попытались получить доступ, используя IP-адрес менеджера или других рабочих экземпляров, но получить доступ к службе невозможно. Вот почему мы предположили, что рой по умолчанию использует режим хоста вместо входной сети и сетки маршрутизации.

Мы также пробовали использовать разные сервисы, такие как Mongo или Cassandra, но поведение такое же, рой выглядит так, как будто работает в режиме хоста. Вы можете получить доступ к службе только с помощью IP-адреса экземпляра, на котором запущена служба.

Есть идеи, как максимально обойти хост и вернуться к сетке маршрутизации? Мы хотим получить доступ к любой службе только с использованием IP-адреса узлов диспетчера, которые должны находиться в режиме слива.

Действия по воспроизведению проблемы:

  1. [менеджер] sudo docker swarm init --advertise-addr 158.39.201.14
  2. [worker-0] sudo docker swarm join --token SWMTKN-1-3np0cy0msnfurecckl4863hkftykuqkgeq998s1hix6jsoiarq-758o52hyma iyzv74w3u1yzltt 158.39.201.14:2377
  3. [worker-1] sudo docker swarm join --token SWMTKN-1-3np0cy0msnfurecckl4863hkftykuqkgeq998s1hix6jsoiarq-758o52hyma iyzv74w3u1yzltt 158.39.201.14:2377
  4. [менеджер] sudo docker stack deploy -c docker-compose.yml nh

Опишите полученные результаты:

curl http://[worker-0-ippting:8089/bigdata 200 ОК

curl http://[worker-1-ipvisible:8089/bigdata ВРЕМЯ НЕИСПРАВНОСТИ

Опишите ожидаемые результаты:

curl http://[worker-0-ippting:8089/bigdata 200 ОК

curl http://[worker-1-ippting:8089/bigdata 200 ОК

Дополнительная информация, которую вы считаете важной (например, проблемы возникают только время от времени):

Эта проблема не возникала 2 дня назад, и внезапно это начало происходить. Мы не вносили никаких изменений и не трогали серверы.

docker-compose.yml

version: '3.7'

networks:
  news-hunter:
    name: &network news-hunter

x-network: &network-base
  networks:
    - *network

services:
   blazegraph:
    <<: *network-base
    image: lyrasis/blazegraph:2.1.5
    ports:
      - published: 8089
        target: 8080
    deploy:
      placement:
        constraints:
          - node.role == worker 

Таблицы IP-адресов manager, worker-1 и worker-2 (все одинаковые): sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-INGRESS  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (2 references)
target     prot opt source               destination

Chain DOCKER-INGRESS (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8089
ACCEPT     tcp  --  anywhere             anywhere             state RELATED,ESTABLISHED tcp spt:8089
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Порты диспетчера: sudo netstat -tuplen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      101        46731      14980/systemd-resol
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          17752      865/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      0          17757      865/sshd
tcp6       0      0 :::8089                 :::*                    LISTEN      0          306971     24992/dockerd
tcp6       0      0 :::2377                 :::*                    LISTEN      0          301970     24992/dockerd
tcp6       0      0 :::7946                 :::*                    LISTEN      0          301986     24992/dockerd
udp        0      0 127.0.0.53:53           0.0.0.0:*                           101        46730      14980/systemd-resol
udp        0      0 158.39.201.14:68        0.0.0.0:*                           100        46591      14964/systemd-netwo
udp        0      0 0.0.0.0:4789            0.0.0.0:*                           0          302125     -
udp6       0      0 fe80::f816:3eff:fef:546 :::*                                100        46586      14964/systemd-netwo
udp6       0      0 :::7946                 :::*                                0          301987     24992/dockerd

Рабочие порты: sudo netstat -tuplen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      101        44998      15283/systemd-resol
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          15724      1010/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      0          15726      1010/sshd
tcp6       0      0 :::8089                 :::*                    LISTEN      0          300227     25355/dockerd
tcp6       0      0 :::7946                 :::*                    LISTEN      0          283636     25355/dockerd
udp        0      0 0.0.0.0:4789            0.0.0.0:*                           0          285465     -
udp        0      0 127.0.0.53:53           0.0.0.0:*                           101        44997      15283/systemd-resol
udp        0      0 158.39.201.15:68        0.0.0.0:*                           100        233705     15247/systemd-netwo
udp6       0      0 :::7946                 :::*                                0          283637     25355/dockerd
udp6       0      0 fe80::f816:3eff:fee:546 :::*                                100        48229      15247/systemd-netwo

Работающие службы: sudo docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS
m7eha88ff4wm        nh_blazegraph       replicated          1/1                 lyrasis/blazegraph:2.1.5   *:8089->8080/tcp

Стек: sudo docker stack ps nh

ID                  NAME                IMAGE                      NODE                DESIRED STATE       CURRENT STATE         ERROR               PORTS
tqkd9t4i03yt        nh_blazegraph.1     lyrasis/blazegraph:2.1.5   nh-worker-0         Running             Running 3 hours ago

Вывод docker version:

Client: Docker Engine - Community
 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.16
 Git commit:        369ce74a3c
 Built:             Thu Feb 13 01:27:49 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.16
  Git commit:       369ce74a3c
  Built:            Thu Feb 13 01:26:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Вывод docker info:

Client:
 Debug Mode: false

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 19.03.6
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: active
  NodeID: hpcm67vxrmkm1wvlhfqbjevox
  Is Manager: true
  ClusterID: gnl96swlf7o3a976oarvjrazt
  Managers: 1
  Nodes: 3
  Default Address Pool: 10.0.0.0/8
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 158.39.201.14
  Manager Addresses:
   158.39.201.14:2377
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-74-generic
 Operating System: Ubuntu 18.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 3.852GiB
 Name: nh-manager-0
 ID: PHBO:E6UZ:RNJL:5LVU:OZXW:FM5M:GQVW:SCAQ:EEQW:7IIW:GARL:AUHI
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Проверка службы: sudo docker service inspect --pretty nh_blazegraph

ID:             ef9s5lesysovh5x2653qc6dk9
Name:           nh_blazegraph
Labels:
 com.docker.stack.image=lyrasis/blazegraph:2.1.5
 com.docker.stack.namespace=nh
Service Mode:   Replicated
 Replicas:      1
Placement:
 Constraints:   [node.role == worker]
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         lyrasis/blazegraph:2.1.5@sha256:e9fb46c9d7b2fc23202945a3d71b99ad8df2d7a18dcbcccc04cfc4f791b569e9
Resources:
Networks: news-hunter
Endpoint Mode:  vip
Ports:
 PublishedPort = 8089
  Protocol = tcp
  TargetPort = 8080
  PublishMode = ingress

Дополнительные сведения о среде (AWS, VirtualBox, физическая и т. д.):

Мы работаем над облачным провайдером OpenStack IaaS. Исходящая рабочая нагрузка может ожидать более 1000 HTTP-запросов в минуту от внешних источников и более 5000 запросов между узлами.

Перекрестные публикации:

https://forums.docker.com/t/swarm-mode-routing-mesh-not-working-instead-is-using-host-mode-by-default/89731 https://github.com/moby/moby/issues/40590


person Ga11u    schedule 27.02.2020    source источник


Ответы (2)


Это указывает на то, что оверлейные порты для vxlan заблокированы между узлами в кластере. Vxlan использует следующие порты:

  • TCP и UDP порт 7946 для связи между узлами
  • UDP-порт 4789 для оверлейного сетевого трафика

Источник: https://docs.docker.com/network/overlay/

Показанные iptables показывают, что это не выполняется на самих хостах Linux (политики ввода и вывода настроены на разрешение по умолчанию), поэтому я бы посмотрел на сетевые политики и систему, используемые для запуска виртуальных машин. Например. VMware NSX использует эти порты и в результате блокирует встроенные виртуальные машины.

person BMitch    schedule 27.02.2020
comment
Мы проверили наши сетевые брандмауэры и правила группы безопасности в OpenStack, и оба порта 7946 и 4789 открыты, как вы описали. Мы также предоставили полное разрешение на прием любого протокола и порта, исходящего от наших экземпляров, но это ничего не изменило. Мы также попытались понизить версию с 19 до 18 и воссоздать все с нуля, следуя инструкциям в форме docs.docker.com/engine/swarm/swarm-tutorial/create-swarm, и это не сработало. - person Ga11u; 28.02.2020

Определенно, проблема была в UDP-порте 4789. По какой-то странной причине он был заблокирован нашим облачным провайдером IaaS, который основан на OpenStack. Причину узнать не удалось.

Но решение состоит в том, чтобы изменить порт 4789 UDP, который используется для входящей сети контейнера, добавив параметр --data-path-port, как объяснил @BMitch в этом связанный вопрос:

docker swarm init ‹МЕНЕДЖЕР-IP> --data-path-port 5789

person Ga11u    schedule 29.02.2020