NAT背后的Docker群工

问题描述 投票:5回答:1

我想在NAT后面的服务器上安装一个Worker节点(即不能公开暴露端口),我以为这不是一个问题,但事实证明这是一个问题。

我在NAT后面的服务器上运行:

docker swarm join --token SWMTKN-1... X.X.X.X:2377

这样就可以把服务器加入到群组中了 我不知道 "内部 "的IP地址是从哪里来的,但在traefik上,我就有一个新的服务器。http://10.0.1.126:8080 (10.0.1.126 绝对不是公网IP),如果我在traefik容器内执行。

docker exec -it 80f9cb33e24c sh

我可以ping traefik列表中的每个servernodeworker 除了新的那个. 为什么呢?


当加入群像这样的vpn后面的worker上。

docker swarm join --advertise-addr=tun0 --token SWMTKN-1-... X.X.X.X:2377

我可以从管理器中看到我的网络上有一个新的对等体:

$ docker network inspect traefik
...
        "Peers": [
            ...
            {
                "Name": "c2f01f1f1452",
                "IP": "12.0.0.2"
            }
        ]

在哪里 12.0.0.2tun0 是从管理器到NAT后面的服务器的vpn接口。不幸的是,当我然后运行。

$ nmap -p 2377,2376,4789,7946 12.0.0.2
Starting Nmap 7.70 ( https://nmap.org ) at 2020-05-04 11:01 EDT
Nmap scan report for 12.0.0.2
Host is up (0.017s latency).

PORT     STATE  SERVICE
2376/tcp closed docker
2377/tcp closed swarm
4789/tcp closed vxlan
7946/tcp open   unknown

我可以看到docker worker的端口被关闭,这很奇怪?

此外,如果我使用 nmap -p 8080 10.0.1.0/24 在管理器上的 traefik 容器内,我得到。

Nmap scan report for app.6ysph32io2l9q74g6g263wed3.mbnlnxusxv2wz0pa2njpqg2u1.traefik (10.0.1.62)
Host is up (0.00033s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

在一个成功的蜂群工作机上,它的内部网络IP是: 10.0.1.62

但我在新的蜂群节点上得到。

Nmap scan report for app.y7odtja923ix60fg7madydia3.jcfbe2ke7lzllbvb13dojmxzq.traefik (10.0.1.126)
Host is up (0.00065s latency).

PORT     STATE    SERVICE
8080/tcp filtered http-proxy

但我得到的是: 在新的蜂群节点上 为什么会被过滤?我做错了什么?

docker networking docker-swarm traefik
1个回答
0
投票

我把这个加在这里,因为它有点长。我认为只有管理器和远程节点能够通信是不够的,节点之间需要能够通信。

试着配置管理器(连接到VPN的人)通过VPN对远程工作者的数据包进行路由,并在所有节点(包括远程节点)上添加需要的路由。

类似这样。

# Manager
sysctl -w net.ipv4.ip_forward=1  # if you use systemd you might need extra steps
# Remote node
ip route add LOCAL_NODES_SUBNET via MANAGER_TUN_IP dev tun0
#Local nodes
ip route add REMOTE_NODE_TUN_IP/32 via MANAGER_IP dev eth0

如果上面的工作正常,你需要将上面的路由变化永久化。

要找到所有节点的IP地址,请在管理器上运行这个命令。

for NODE in $(docker node ls --format '{{.Hostname}}'); do echo -e "${NODE} - $(docker node inspect --format '{{.Status.Addr}}' "${NODE}")"; done
© www.soinside.com 2019 - 2024. All rights reserved.