12 ノードの docker swarm クラスターがあります。単一ノードにデプロイされたコンテナーはオーバーレイ ネットワーク経由で互いに問題なくアクセスできますが、異なるノードにデプロイされると接続の問題が発生します。ホスト名は解決され、あるコンテナーから別のコンテナーに ping できますが、tcp (たとえば telnet を使用) 経由で他のコンテナーにアクセスしようとすると、長い待機時間が発生し、その後接続がタイムアウトします。各ノードのファイアウォールは docker swarm 用にすでに設定されており、ポート 2377、7946、4789 が開いています。
例: マスター ノードで次のコマンドを実行して、さまざまなノードにスケジュールされたサービスを作成しました。
docker network create -d overlay test_net
docker service create --constraint node.labels.first==true --name first --network test_net ubuntu/nginx:1.18-20.04_beta
docker service create --constraint node.labels.second==true --name second --network test_net ubuntu/nginx:1.18-20.04_beta
次に、コンテナから最初に以下を実行します:
root@37be801ebe8b:/# ping second
PING second (10.0.5.18): 56 data bytes
64 bytes from 10.0.5.18: icmp_seq=0 ttl=64 time=0.092 ms
64 bytes from 10.0.5.18: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 10.0.5.18: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 10.0.5.18: icmp_seq=3 ttl=64 time=0.073 ms
^C--- second ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.079/0.092/0.000 ms
しかし、その後、telnet を使用して他のノードに接続しようとすると (このコンテナーにはポート 80 でリッスンしている nginx があります)、次のようになります。
root@37be801ebe8b:/# telnet second 80
Trying 10.0.5.18...
telnet: Unable to connect to remote host: Connection timed out
この問題の回避策を提案してくれる人はいますか?
答え1
問題は、送信パケットの不正なチェックサムにありました。そのせいで、ネットワーク インターフェイスによってパケットがドロップされていました。
解決策は、チェックサムオフロードを無効にすることでした。ethtool を使用します。
# ethtool -K <interface> tx off
答え2
私は Docker Swarm クラスターを複数の VMWare ESXi VM に展開し、@hattivatt が提案したソリューションを試したところ、うまくいきました。ただし、これは再起動しても持続せず、追加の作業が必要であり、正直なところ、これを行う適切な方法ではないように思えました。
docker swarm が使用するデータ ポート (デフォルトでは 4789) を変更したら、動作しました。
docker swarm init --advertise-addr w.x.y.z --listen-addr w.x.y.z --data-path-port 1234
によるとポーターそしてヴイエムウェアNSX の使用時にこれが発生し、vxlan ポートで競合が発生する可能性があります。しかし、私は使用していません!