我正在寻求帮助调试以下设置:
我从一家托管公司获得了 3 个 VPs Cloud 实例。(我相信 VPS 是 VMWare,但我在托管公司网站上找不到任何文档。)
- 所有机器都运行 Ubuntu 18.04。
- 我已经在这 3 个上安装了 docker。
所有的docker版本都是相同的:
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:29:52 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:28:22 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.4
GitCommit: e6b3f5632f50dbc4e9cb6288d911bf4f5e95b18e
runc:
Version: 1.0.0-rc6+dev
GitCommit: 6635b4f0c6af3810594d2770f662f34ddc15b40d
docker-init:
Version: 0.18.0
GitCommit: fec3683
在节点 1 上我运行了以下 init 命令:
docker swarm init --advertise-addr NODE_1_IP --data-path-port=7789
在节点 2 和 3 上,我运行了以下连接命令
docker swarm join --token XXX -advertise-addr NODE_2/3_IP NODE_1_IP:2377
Token 取自 Node 1 给我的值。我通过指定 data-path-port 解决了之前的问题。我认为这是因为 VPS 是 VMWare,它与标准数据端口冲突
我的云提供商为我提供了一个用户界面,用于将防火墙规则应用于单个 VPS。我使用防火墙组将以下规则应用于所有 3 台服务器:
TCP ACCEPT to dest ports 80, 443, (and my SSH port)
ICMP ACCEPT any
TCP ACCEPT 2376
TCP, UDP ACCEPT 7789
UDP ACCEPT 7789
TCP ACCEPT 2377
ESP ACCEPT
为了测试这一点,我在节点 1 上运行了以下命令
docker network create --driver=overlay --attachable testnet
docker network create --opt encrypted --driver=overlay --attachable testnet_encrypted
docker service create --network=testnet --name web --publish 80 --replicas=5 nginx:latest
一旦服务在集群中运行,我就会执行以下操作:
docker run --rm --name alpine --net=testnet -ti alpine:latest sh
apk add --no-cache curl
然后我执行了 5 次 curl:
curl web
五次我都得到了回应。如果我继续,我就会继续得到回应。我认为这意味着所有容器都在获得流量。
然后我将服务器切换到加密网络并重复相同的测试:
docker service rm web
docker service create --network=testnet_encrypted --name web --publish 80 --replicas=5 nginx:latest
docker run --rm --name alpine --net=testnet_encrypted -ti alpine:latest sh
apk add --no-cache curl
我再次运行 curl 5 次:
curl web
它有时会工作,但有时它只是呆在那里,直到我按下 ctrl-c。
如果我运行它 5 次,则工作和中断的模式会重复出现。我认为这是因为一些容器在 NODE_1 上运行,并且它们可以工作,但与节点 2 和 3 的通信不起作用。
在对该问题进行一些研究后,我将 ESP ACCEPT 规则添加到了我的云提供商防火墙规则集中。
我尝试重新启动集群,但没有成功。
现在我陷入困境。有没有什么建议可以指导我如何进行调试?谢谢 Robert
更新 1
为了调试,我更改了测试,使 Web 服务仅在 NODE_3 上的单个实例上运行。然后,我为节点 3 加载了两个控制台并运行以下命令:
sudo tcpdump src NODE_1_IP and dst NODE_3_IP and port 7789
sudo tcpdump src NODE_3_IP and dst NODE_1_IP and port 7789
一个控制台将显示进入 NODE_3 的流量和从 NODE_3 流出的另一个流量。
然后我再次运行未加密测试。我看到传入控制台上出现了大约 7 行,传出控制台上出现了 5 行。因此,有流量进入 NODE_3,也有流量从 NODE_3 传出,测试正在运行
然后我运行了加密测试。这次我看到传入控制台上出现了一行,而传出控制台上什么也没有。因此,只有一个数据包到达 NODE_3。我不确定它是否被解密并发送回容器。
更新 2
我未能提及的一个配置区域是我有以下 /etc/docker/daemon.json 设置:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tlscacert": "/var/docker/ca.pem",
"tlscert": "/var/docker/server-cert.pem",
"tlskey": "/var/docker/server-key.pem",
"tlsverify": true
}
这是为了允许我使用 SSL 客户端证书进行远程连接。在我创建 Swarm 之前,已在所有节点上设置了此文件。
由于数据包解密看起来是一个可能的原因,因此我已将 daemon.json 更改为以下内容:
{
"hosts": []
}
然后我重启了每台机器。测试结果是一样的——仍然不起作用。
然后我运行命令:docker swarm ca --rotate 并重新运行测试。结果相同。
我还没有删除集群并用新配置重新初始化它。(如果有人认为这会有帮助,我可以这么做,但我有很多 docker 机密和配置,我会在这个过程中丢失它们。)
更新 3
我现在已经完全删除并重新启动了集群。但这没有用。
一些消息来源称以下命令:
sudo tcpdump -p esp
在节点上运行应该会显示流量。我在集群中的所有节点上运行了此程序并重复了所有测试,但任何地方都没有任何输出。
ufw 在所有节点上处于非活动状态:
robert@metcaac6:/var/log$ sudo ufw status
[sudo] password for robert:
Status: inactive
但是当我运行 iptables -LI 时,每个节点上都会得到相同的规则:
robert@metcaac6:/var/log$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere policy match dir in pol ipsec udp dpt:7789 u32 "0x0>>0x16&0x3c@0xc&0xffffff00=0x100300"
DROP udp -- anywhere anywhere udp dpt:7789 u32 "0x0>>0x16&0x3c@0xc&0xffffff00=0x100300"
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-INGRESS all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
Chain DOCKER-INGRESS (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:30001
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:30001
ACCEPT tcp -- anywhere anywhere tcp dpt:30000
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:30000
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- anywhere anywhere
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
我已经检查了 dmesg 和 /var/log/syslog 以寻找可能的问题,但没有发现任何问题。
我还是不知道应该在哪里寻找这个问题。