Порт сокета не открывается в Docker Swarm Cluster (Идентифицирована корневая причина) - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующие настройки

  • Две виртуальные машины
  • созданная оверлейная сеть
  • создано две службы Docker Swarm

    служба Docker создать - имя karaf1-служба --replicas 1 - сеть karaf_net karaf1: 2.0.0

    служба Docker создать - имя karaf2-служба --replicas 1 - сеть karaf_net karaf2: 2.0.0

Теперь эти контейнеры открывают порт сокета при запуске, я заметил, что некоторое время он успешно мог создавать его много раз, когда он терпит неудачу.

ServerSocketFactory.getDefault().createServerSocket(serverPort)

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

перед устранением неполадок в сети, контейнер по крайней мере должен создать сокеты.

этот контейнер не может открыть сокет

root@bd48643080b2:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8101            0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.1:1099          0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:41551           0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.11:44853        0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:44444           0.0.0.0:*               LISTEN      61/java

Следующий контейнер может создать его на порту 4550, но иногда это наоборот

root@38d26c7dde1a:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:37347           0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:8101            0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:4550            0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.11:37575        0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:1099          0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.1:35321         0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:44444           0.0.0.0:*               LISTEN      61/java

Идентифицирована первопричина: Как я создаю две службы, так и при создании первой службы я предоставляю вторую службу в качестве имени хоста первой службе, чтобы постоянно проверять состояние, поэтому ошибка выдачи Java для имени хоста, например, "karaf2-service"

java.net.UnknownHostException: karaf2-service: Name or service not known
        at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)

Теперь я не могу добавить запись службы karaf2 в etc / hosts, чтобы сокет не жаловался, так как не знаю, какой IP будет назначен службе docker-swarm? в оверлейной сети мы в основном общаемся с именами сервисов.

Есть предложения по решению этой проблемы?

1 Ответ

0 голосов
/ 03 мая 2019

Самый простой способ сделать это - проверить при запуске контейнера, можно ли связаться с другой службой, а если нет, подождать несколько секунд, а затем повторить попытку.

Для этого есть несколько инструментов, например, wait-for-it: https://github.com/vishnubob/wait-for-it

...