Docker Swarm — контейнеры могут пинговать узлы между собой, но не могут обмениваться данными через TCP-порты.
Я настраиваю новый кластер режима Docker Swarm на трех машинах с Linux — все они установлены совершенно заново. На всех трех машинах отключены брандмауэры и модули безопасности (AppArmor), и я могу подтвердить, что они могут обмениваться данными через порты.7946
(TCP и UDP) и4789
(УДП).
Например, один из стеков, который я привожу:
...
wikijs_db:
image: postgres:11-alpine
deploy:
replicas: 1
environment:
POSTGRES_DB: ***
POSTGRES_PASSWORD: ***
POSTGRES_USER: ***
HA_ACTIVE: 1
restart: unless-stopped
volumes:
- db_data:/var/lib/postgresql/data
- db_assets:/root/assets
wikijs_wiki:
image: requarks/wiki:2.5
deploy:
replicas: 1
depends_on:
- wikijs_db
environment:
DB_TYPE: postgres
DB_HOST: wikijs_db
DB_PORT: 5432
DB_USER: ***
DB_PASS: ***
DB_NAME: ****
HA_ACTIVE: 1
volumes:
- "/etc/localtime:/etc/localtime:ro"
- data:/backup/data
- assets:/root/assets
...
При создании кластера контейнеры распределяются между узлами — и могут взаимодействовать сping
, а также разрешить их имена хостов:
/wiki $ ping wikijs_db
PING wikijs_db (10.0.1.4): 56 data bytes
64 bytes from 10.0.1.4: seq=0 ttl=42 time=0.113 ms
64 bytes from 10.0.1.4: seq=1 ttl=42 time=0.134 ms
Однако контейнеры не могут обмениваться данными через TCP:
/wiki $ nc -vz wikijs_db 5432
nc: wikijs_db (10.0.1.4:5432): Operation timed out
Это происходит только между узлами в рое.
Я пытался воссоздать рой, переустановить операционные системы, запустить разные контейнеры, а также назначить сети по умолчанию предопределенную подсеть, но все безуспешно. Я также не вижу ошибок в журнале демона Docker ни на одном из узлов.
Буду очень признателен за помощь в решении данного вопроса.
Спасибо!
1 ответ
Решается запускомethtool -K [interface] tx off
как предложено в этой теме: https://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else