更新1

更新1

我正在尋求幫助調試以下設定:

我有 3 個來自託管公司的 VP 雲端實例。 (我相信 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

令牌取自節點 1 給我的值。我透過指定資料路徑連接埠解決了先前的問題。我認為這是因為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 web

我總共 5 次都得到了回覆。如果我繼續下去,我就會不斷收到回覆。我認為這意味著所有貨櫃都在獲得流量。

然後我將伺服器切換到加密網路並重複相同的測試:

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 規則已新增至我的雲端提供者防火牆規則集中。

我嘗試過重新啟動集群,但沒有成功。

現在我被困住了。對於如何進行調試有什麼建議嗎?謝謝羅伯特

更新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 時,每個節點上都會得到相同的規則:

羅伯特@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 尋找可能的問題,但我找不到任何問題。

我仍然不知道應該在哪裡尋找問題。

相關內容