我想在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.2
和 tun0
是从管理器到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
但我得到的是: 在新的蜂群节点上 为什么会被过滤?我做错了什么?
我把这个加在这里,因为它有点长。我认为只有管理器和远程节点能够通信是不够的,节点之间需要能够通信。
试着配置管理器(连接到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