更新 1

更新 1

我正在寻求帮助调试以下设置:

我从一家托管公司获得了 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 以寻找可能的问题,但没有发现任何问题。

我还是不知道应该在哪里寻找这个问题。

相关内容