max*_*sme 7 networking docker docker-swarm traefik
我想在 NAT 后面的服务器上有一个工作节点(即不能公开端口)我认为这不是问题,但事实证明是:
在 NAT 后面的这台服务器上,我运行:
docker swarm join --token SWMTKN-1... X.X.X.X:2377
Run Code Online (Sandbox Code Playgroud)
这反过来又将服务器添加到群中。我不确定“内部”IP 地址来自哪里,但是在 traefik 上,如果我在 traefik 容器中执行,我将拥有一个新服务器http://10.0.1.126:8080(10.0.1.126绝对不是公共 IP):
docker exec -it 80f9cb33e24c sh
Run Code Online (Sandbox Code Playgroud)
除了新的之外,我可以 ping traefik 上列表中的每个服务器/节点/工人。为什么?
当在 vpn 后面的工作人员上加入这样的群体时:
docker swarm join --advertise-addr=tun0 --token SWMTKN-1-... X.X.X.X:2377
Run Code Online (Sandbox Code Playgroud)
我可以从管理器看到我网络上的新对等点:
$ docker network inspect traefik
...
"Peers": [
...
{
"Name": "c2f01f1f1452",
"IP": "12.0.0.2"
}
]
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
我可以看到 docker 工人的端口已关闭,这很奇怪吗?
此外,如果我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
Run Code Online (Sandbox Code Playgroud)
在具有网络内部 ip 的成功 swarm worker 上 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
Run Code Online (Sandbox Code Playgroud)
在新的 swarm 节点上。为什么会被过滤?我究竟做错了什么?
我在这里添加这个,因为它有点长。
我认为仅管理器和远程节点能够通信还不够;节点之间需要能够进行通信。
尝试将管理器(连接到 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
Run Code Online (Sandbox Code Playgroud)
如果上述工作正常,您需要使上述路由更改永久生效。
要查找所有节点的 IP 地址,请在管理器上运行以下命令:
for NODE in $(docker node ls --format '{{.Hostname}}'); do echo -e "${NODE} - $(docker node inspect --format '{{.Status.Addr}}' "${NODE}")"; done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |